{"behavior":"degenerate_repetition","label_filter":null,"limit":10,"next_offset":36157,"offset":36147,"previous_offset":null,"rows":[{"assistant_initiates":false,"asst_text":"\u0647\u0644 \u062a\u0642\u0635\u062f \u0643\u0644\u0645\u0629 \"\u0642\u0637\u0648\u062a\u064a\" \u0628\u0627\u0644\u0644\u0647\u062c\u0629 \u0627\u0644\u0645\u062d\u0644\u064a\u0629\u061f \u0639\u0627\u062f\u0629\u064b\u060c \u0643\u0644\u0645\u0629 \"\u0642\u0637\u0648\u062a\u064a\" \u062a\u064f\u0633\u062a\u062e\u062f\u0645 \u0643\u0644\u0642\u0628 \u062f\u0644\u0639 \u0644\u0643\u0644\u0645\u0629 \"\u0642\u0637\u0629\" \u0623\u0648 \"\u0642\u0637\"\u060c \u0648\u062a\u0639\u0646\u064a \u0634\u062e\u0635\u0627\u064b \u0645\u062d\u0628\u0648\u0628\u0627\u064b \u0623\u0648 \u0644\u0637\u064a\u0641\u0627\u064b \u0643\u0627\u0644\u0642\u0637\u0629. \u0647\u0644 \u062a\u0631\u063a\u0628 \u0641\u064a \u0645\u0639\u0631\u0641\u0629 \u0645\u0639\u0646\u0649 \u0645\u062d\u062f\u062f \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0639\u064a\u0646 \u0644\u0644\u0643\u0644\u0645\u0629\u061f \u0623\u0645 \u0647\u0644 \u062a\u0642\u0635\u062f \u0634\u064a\u0626\u0627\u064b \u0622\u062e\u0631\u061f \u064a\u0631\u062c\u0649 \u062a\u0648\u0636\u064a\u062d \u0627\u0644\u0633\u0624\u0627\u0644 \u0623\u0643\u062b\u0631 \u0644\u0623\u062a\u0645\u0643\u0646 \u0645\u0646 \u0645\u0633\u0627\u0639\u062f\u062a\u0643 \u0628\u0634\u0643\u0644 \u0623\u0641\u0636\u0644.","behavior":"degenerate_repetition","conversation_hash":"6e4cff54de921bb876acd1b8a0e987ca","conversation_redacted":false,"conversation_toxic":false,"country":"Mexico","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":268,"n_turns_in_conversation":1,"n_words":48,"source_row_offset":36147,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:19:07 GMT","turn_id":"861c8763ecfac9a41ffd8b6f","turn_index":0,"user_text":"\u0645\u0646 \u0642\u0637\u0648\u062a\u064a\u061f"},{"assistant_initiates":false,"asst_text":"'Srijan' (creation) symbolizes creativity & innovation \ud83c\udf1f. Strengths: unique, meaningful, and culturally rich \ud83c\uddee\ud83c\uddf3. Weaknesses: often mispronounced globally \ud83c\udf0d. Hurdles: spelling variations can cause confusion \u270d\ufe0f. Overall, it\u2019s a powerful, inspiring name with deep roots and modern appeal! \ud83d\udca1\u2728","behavior":"degenerate_repetition","conversation_hash":"d2b62494050b3ff2c16b9260999eb7c8","conversation_redacted":false,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":468,"n_turns_in_conversation":1,"n_words":67,"source_row_offset":36148,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:19:09 GMT","turn_id":"717634e3d6165b0133032a04","turn_index":0,"user_text":"Describe the significance, strengths, weaknesses, and hurdles of the Indian name 'Srijan', strictly keep it under 350 characters. add emojis if you can to make it more attractive."},{"assistant_initiates":false,"asst_text":"\u0645\u0631\u062d\u0628\u064b\u0627! \u0643\u064a\u0641 \u064a\u0645\u0643\u0646\u0646\u064a \u0645\u0633\u0627\u0639\u062f\u062a\u0643 \u0627\u0644\u064a\u0648\u0645\u061f","behavior":"degenerate_repetition","conversation_hash":"ad0bdbd21a47de63738097fde7d45bd3","conversation_redacted":false,"conversation_toxic":false,"country":"Estonia","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":36,"n_turns_in_conversation":1,"n_words":6,"source_row_offset":36149,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:19:31 GMT","turn_id":"947e21cb79f8684641ac46df","turn_index":0,"user_text":"\u0643\u062a"},{"assistant_initiates":false,"asst_text":"\u0645\u0631\u062d\u0628\u064b\u0627! \u0647\u0644 \u064a\u0645\u0643\u0646\u0643 \u062a\u0648\u0636\u064a\u062d \u0645\u0627\u0630\u0627 \u062a\u0642\u0635\u062f \u0628\u0643\u0644\u0645\u0629 \"\u0637\u0631\u062f\"\u061f \u0647\u0644 \u062a\u0642\u0635\u062f \u0637\u0631\u062f \u0634\u064a\u0621 \u0645\u0627\u060c \u0623\u0645 \u0637\u0631\u062f \u0634\u062e\u0635 \u0645\u0646 \u0645\u0643\u0627\u0646\u060c \u0623\u0645 \u0634\u064a\u0621 \u0622\u062e\u0631\u061f \u0633\u0623\u0643\u0648\u0646 \u0633\u0639\u064a\u062f\u064b\u0627 \u0628\u0645\u0633\u0627\u0639\u062f\u062a\u0643 \u0625\u0630\u0627 \u0632\u0648\u062f\u062a\u0646\u064a \u0628\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644.","behavior":"degenerate_repetition","conversation_hash":"d3d34cce22c1d1778fdc07839898e6ef","conversation_redacted":false,"conversation_toxic":false,"country":"France","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Persian","model":"gpt-4.1-mini-2025-04-14","n_chars":153,"n_turns_in_conversation":1,"n_words":30,"source_row_offset":36150,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:19:39 GMT","turn_id":"fbb5a8c11d7bdbe97aa89f46","turn_index":0,"user_text":"\u0637\u0631\u062f"},{"assistant_initiates":false,"asst_text":"The user feels anxious and worried about potential infection after accidentally touching blood.","behavior":"degenerate_repetition","conversation_hash":"a945a310d005b807417464a062541807","conversation_redacted":false,"conversation_toxic":false,"country":"Ukraine","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":328,"n_turns_in_conversation":1,"n_words":51,"source_row_offset":36151,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:20:00 GMT","turn_id":"3ebef15e94a879726622de32","turn_index":0,"user_text":"Your task is to summarize the user's message in one short sentence that captures the emotional state and key concern.\n\nUser message: I accidentally touched blood and now I feel anxious and can't stop thinking about getting infected."},{"assistant_initiates":false,"asst_text":"\u0623\u0643\u064a\u062f! \u0647\u0644 \u062a\u0642\u0635\u062f \u0628\u0648\u062a\u0627\u062a \u062a\u0633\u0627\u0639\u062f\u0643 \u0641\u064a \u0625\u0646\u0634\u0627\u0621 \u0641\u064a\u062f\u064a\u0648\u0647\u0627\u062a \u0623\u0648 \u062a\u062d\u0631\u064a\u0631\u0647\u0627\u060c \u0623\u0648 \u0628\u0648\u062a\u0627\u062a \u062a\u0639\u0645\u0644 \u0639\u0644\u0649 \u0645\u0646\u0635\u0627\u062a \u0645\u0639\u064a\u0646\u0629 \u0645\u062b\u0644 \u062a\u064a\u0643 \u062a\u0648\u0643 \u0623\u0648 \u064a\u0648\u062a\u064a\u0648\u0628\u061f \u0648\u0647\u0644 \u062a\u0641\u0636\u0644 \u0623\u0646 \u062a\u0643\u0648\u0646 \u0647\u0630\u0647 \u0627\u0644\u0628\u0648\u062a\u0627\u062a \u062c\u0627\u0647\u0632\u0629 \u0644\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0623\u0645 \u062a\u0648\u062f \u0625\u0646\u0634\u0627\u0621 \u0628\u0648\u062a \u062e\u0627\u0635 \u0628\u0643\u061f\n\n\u0644\u0648 \u062a\u0634\u0631\u062d \u0644\u064a \u0623\u0643\u062b\u0631 \u0639\u0646 \u0627\u062d\u062a\u064a\u0627\u062c\u0643 \u0645\u062b\u0644 \u0646\u0648\u0639 \u0627\u0644\u0641\u064a\u062f\u064a\u0648\u0647\u0627\u062a\u060c \u0627\u0644\u0645\u0646\u0635\u0629\u060c \u0648\u0627\u0644\u0647\u062f\u0641\u060c \u0623\u0642\u062f\u0631 \u0623\u0633\u0627\u0639\u062f\u0643 \u0628\u0634\u0643\u0644 \u0623\u062f\u0642.","behavior":"degenerate_repetition","conversation_hash":"834929a0757114a1ba3ad9bd33168771","conversation_redacted":false,"conversation_toxic":false,"country":"","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":286,"n_turns_in_conversation":1,"n_words":54,"source_row_offset":36152,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:20:01 GMT","turn_id":"0b80d97285a929f737aa5216","turn_index":0,"user_text":"\u0628\u062f\u064a \u0628\u0648\u062a\u0627\u062a \u0644\u0644 \u0641\u064a\u062f\u0648\u0647\u0627\u062a"},{"assistant_initiates":false,"asst_text":"Could you please provide the summary of your problem? This will help me generate appropriate CBT-based tasks for you.","behavior":"degenerate_repetition","conversation_hash":"17ac5540177c30a496e2de3f655579c2","conversation_redacted":false,"conversation_toxic":false,"country":"Ukraine","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":523,"n_turns_in_conversation":1,"n_words":73,"source_row_offset":36153,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:20:02 GMT","turn_id":"b1934481c8ccf05f70c284b4","turn_index":0,"user_text":"You are a cognitive behavioral therapist. Based on the following summary of the user's problem, generate a list of 5 CBT-based tasks. Each task must have a title and a short description. Respond in the following markdown format:\n\n1. **Title**  \n   Description...\n2. **Title**  \n   Description...\n3. **Title**  \n   Description...\n4. **Title**  \n   Description...\n5. **Title**  \n   Description...\n\nSummary: "},{"assistant_initiates":false,"asst_text":"Hello! I'm doing well, thank you. How can I assist you today?","behavior":"degenerate_repetition","conversation_hash":"1f2041611b8beff6b7602ece1f622dba","conversation_redacted":false,"conversation_toxic":false,"country":"Japan","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":118,"n_turns_in_conversation":1,"n_words":23,"source_row_offset":36154,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:20:18 GMT","turn_id":"63650dd97169c16fe03e45d1","turn_index":0,"user_text":"User: hi, how are you?\nUser: hi, how are you?\nAssistant:"},{"assistant_initiates":false,"asst_text":"\u0628\u0627\u0644\u0637\u0628\u0639! \u0625\u0644\u064a\u0643 \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0643\u0627\u0645\u0644 \u0644\u0643\u0648\u062f \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0630\u064a \u0637\u0644\u0628\u062a\u0647 \u0645\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u062a\u0639\u0631\u064a\u0641\u0627\u062a \u0627\u0644\u0644\u0627\u0632\u0645\u0629 \u0644\u064a\u0639\u0645\u0644 \u0628\u0648\u062a \u062a\u0644\u063a\u0631\u0627\u0645 \u0645\u062a\u0643\u0627\u0645\u0644 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646 \u0631\u0635\u064a\u062f ADSL \u0645\u0639 \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0648\u062c\u0647\u0627\u062a \u0627\u0644\u062c\u062f\u0648\u0644\u0629. \u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u062a\u0648\u0643\u0646 \u0628\u0648\u062a\u0643 \u0641\u064a \u0627\u0644\u0645\u062a\u063a\u064a\u0631 `TOKEN`.\n\n```python\n# \ud83c\udf1f \u0627\u0633\u062a\u064a\u0631\u0627\u062f \u0627\u0644\u0645\u0643\u062a\u0628\u0627\u062a \u0627\u0644\u0644\u0627\u0632\u0645\u0629\nfrom bs4 import BeautifulSoup\nimport requests\nfrom telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup\nfrom telegram.ext import (\n    ApplicationBuilder,\n    CommandHandler,\n    MessageHandler,\n    ContextTypes,\n    filters,\n    CallbackQueryHandler,\n    ConversationHandler,\n    JobQueue\n)\nimport logging\nimport nest_asyncio\nimport asyncio\nfrom datetime import datetime, timedelta\nimport pytz\nfrom tabulate import tabulate\nimport json\nimport os\n\n# \ud83d\udd04 \u062a\u0641\u0639\u064a\u0644 nest_asyncio \u0644\u0644\u0633\u0645\u0627\u062d \u0628\u062a\u0634\u063a\u064a\u0644 event loop \u062f\u0627\u062e\u0644 \u0628\u064a\u0626\u0627\u062a Jupyter/Colab\nnest_asyncio.apply()\n\n# \ud83d\udd11 \u062a\u0648\u0643\u0646 \u0627\u0644\u0628\u0648\u062a (\u064a\u062c\u0628 \u062a\u063a\u064a\u064a\u0631\u0647 \u0625\u0644\u0649 \u062a\u0648\u0643\u0646 \u0628\u0648\u062a\u0643 \u0627\u0644\u062e\u0627\u0635)\nTOKEN = \"7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0\"\n\n# \ud83d\udcdd \u0625\u0639\u062f\u0627\u062f \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 (Logging)\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO\n)\nlogger = logging.getLogger(__name__)\n\n# \ud83d\uddc3\ufe0f \u062d\u0627\u0644\u0627\u062a \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629 \u0644\u0644\u0640 ConversationHandler\nADD_NUMBER, DELETE_NUMBER, SCHEDULE_HOUR, SCHEDULE_AMPM = range(4)\n\n# \ud83d\udcc2 \u0645\u0644\u0641\u0627\u062a \u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u0648\u0627\u0644\u0648\u0642\u062a\nSAVED_NUMBERS_FILE = \"saved_numbers.json\"\nSCHEDULED_TIMES_FILE = \"scheduled_times.json\"\n\n# \u23f0 \u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0644\u0644\u064a\u0645\u0646\nYEMEN_TZ = pytz.timezone('Asia/Aden')\n\n# \ud83d\udcbe \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0645\u0646 \u0645\u0644\u0641 JSON\ndef load_saved_numbers():\n    if os.path.exists(SAVED_NUMBERS_FILE):\n        try:\n            with open(SAVED_NUMBERS_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n            return {}\n    return {}\n\n# \ud83d\udcbe \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u0645\u0646 \u0645\u0644\u0641 JSON\ndef load_scheduled_times():\n    if os.path.exists(SCHEDULED_TIMES_FILE):\n        try:\n            with open(SCHEDULED_TIMES_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n            return {}\n    return {}\n\n# \ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0641\u064a \u0645\u0644\u0641 JSON\ndef save_numbers_to_file(numbers):\n    try:\n        with open(SAVED_NUMBERS_FILE, 'w', encoding='utf-8') as f:\n            json.dump(numbers, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n\n# \ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u0641\u064a \u0645\u0644\u0641 JSON\ndef save_scheduled_times(times):\n    try:\n        with open(SCHEDULED_TIMES_FILE, 'w', encoding='utf-8') as f:\n            json.dump(times, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n\n# \ud83d\udcbe \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0648\u0627\u0644\u0623\u0648\u0642\u0627\u062a\nsaved_numbers = load_saved_numbers()  # \u0634\u0643\u0644: {user_id: [numbers]}\nscheduled_times = load_scheduled_times()  # \u0634\u0643\u0644: {user_id: {\"hour\": int, \"ampm\": \"AM\"/\"PM\"}}\nscheduled_jobs = {}  # \u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0640 jobs \u0627\u0644\u062a\u064a \u0633\u062a\u064f\u0644\u063a\u0649 \u0623\u0648 \u062a\u064f\u062d\u062f\u062b\n\n# \ud83d\udd0d \u062f\u0627\u0644\u0629 \u0644\u062c\u0644\u0628 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f \u0645\u0646 \u0645\u0648\u0642\u0639 ADSL \u0627\u0644\u064a\u0645\u0646\ndef get_adsl_info(phone_number: str):\n    try:\n        url = \"http://adsl-yemen.com/adsl4.php\"\n        data = {\n            'mobile': phone_number,\n            'action': 'query'\n        }\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',\n            'Referer': url,\n            'Origin': 'http://adsl-yemen.com'\n        }\n        response = requests.post(url, data=data, headers=headers)\n        response.raise_for_status()\n        soup = BeautifulSoup(response.text, 'html.parser')\n\n        # \u067e\u064a\u0634 \u0641\u0631\u0636: \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0639\u0644\u0649 \u0634\u0643\u0644 div \u064a\u062d\u0645\u0644 \u0639\u0646\u0627\u0648\u064a\u0646 \u062b\u0645 \u0642\u064a\u0645 \u0628\u062c\u0627\u0646\u0628\u0647\n        def get_field_value(field_name):\n            label = soup.find(\"div\", string=field_name)\n            if label:\n                sib = label.find_next_sibling(\"div\")\n                if sib:\n                    return sib.text.strip()\n            return \"\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631\"\n\n        current_balance = get_field_value(\"\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a\")\n        package_value = get_field_value(\"\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629\")\n        expiry_date = get_field_value(\"\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\")\n\n        return {\n            'current_balance': current_balance,\n            'package_value': package_value,\n            'expiry_date': expiry_date,\n            'timestamp': datetime.now(YEMEN_TZ).strftime(\"%Y-%m-%d %H:%M:%S\")\n        }\n    except requests.exceptions.RequestException as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u0645\u0648\u0642\u0639: {e}\")\n        return None\n    except Exception as e:\n        logger.error(f\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0631\u0635\u064a\u062f: {e}\")\n        return None\n\n# \ud83d\udce8 \u062f\u0627\u0644\u0629 \u0644\u0625\u0631\u0633\u0627\u0644 \u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645\nasync def send_balance_info(update_or_context, phone_number, info):\n    if info:\n        response = (\n            f\"\ud83d\udcca *\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\ud83d\udcf1 *\u0627\u0644\u0631\u0642\u0645:* `{phone_number}`\\n\"\n            f\"\u23f0 *\u0648\u0642\u062a \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645:* {info['timestamp']}\\n\\n\"\n            f\"\ud83d\udcb5 *\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a:* `{info['current_balance']}`\\n\"\n            f\"\ud83d\udcb0 *\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629:* `{info['package_value']}`\\n\"\n            f\"\ud83d\udcc5 *\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621:* `{info['expiry_date']}`\\n\\n\"\n            f\"\u2728 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\"\n        )\n    else:\n        response = (\n            \"\u26a0\ufe0f *\u0639\u0630\u0631\u0627\u064b\u060c \u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\uded1 *\u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629:*\\n\"\n            \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0633\u062c\u0644 \u0641\u064a \u062e\u062f\u0645\u0629 ADSL\\n\"\n            \"\u2022 \u0648\u062c\u0648\u062f \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0645\u0624\u0642\u062a\u0629\\n\"\n            \"\u2022 \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645\\n\\n\"\n            \"\ud83d\udd0d \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0631\u0642\u0645 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b\"\n        )\n    # update_or_context \u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0645\u0646 \u0646\u0648\u0639 Update \u0623\u0648 ContextTypes.DEFAULT_TYPE\n    if hasattr(update_or_context, \"message\") and update_or_context.message:\n        await update_or_context.message.reply_text(response, parse_mode='Markdown')\n    elif hasattr(update_or_context, \"reply_text\"):\n        await update_or_context.reply_text(response, parse_mode='Markdown')\n    else:\n        logger.warning(\"\u062a\u0639\u0630\u0631 \u0625\u0631\u0633\u0627\u0644 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645\u060c \u0644\u0645 \u064a\u062a\u0645 \u062a\u062d\u062f\u064a\u062f update \u0623\u0648 context \u0645\u0646\u0627\u0633\u0628\")\n\n# \ud83e\udde9 \u0625\u062f\u0627\u0631\u0629 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\nasync def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    query = update.callback_query\n    await query.answer()\n    user_id = str(update.effective_user.id)\n\n    if query.data == 'add_number':\n        await query.edit_message_text(\"\ud83d\udce5 \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0644\u0625\u0636\u0627\u0641\u062a\u0647 (\u0645\u062b\u0627\u0644: 777123456):\")\n        return ADD_NUMBER\n\n    elif query.data == 'show_numbers':\n        numbers = saved_numbers.get(user_id, [])\n        if not numbers:\n            text = \"\u26a0\ufe0f \u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u062f\u064a\u0643 \u0627\u0644\u0622\u0646.\"\n        else:\n            text = \"\ud83d\udccb *\u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u062f\u064a\u0643:*\\n\\n\" + \"\\n\".join(f\"\u25ab\ufe0f {num}\" for num in numbers)\n        await query.edit_message_text(text, parse_mode='Markdown')\n        return ConversationHandler.END\n\n    elif query.data == 'query_numbers':\n        numbers = saved_numbers.get(user_id, [])\n        if not numbers:\n            await query.edit_message_text(\"\u26a0\ufe0f \u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647\u0627. \u0623\u0636\u0641 \u0623\u0648\u0644\u0627\u064b \u0631\u0642\u0645 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629.\")\n            return ConversationHandler.END\n\n        keyboard = [[InlineKeyboardButton(num, callback_data=f\"query_{num}\")] for num in numbers]\n        keyboard.append([InlineKeyboardButton(\"\ud83d\udd19 \u0627\u0644\u0639\u0648\u062f\u0629\", callback_data='back_to_menu')])\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\"\ud83d\udd0d \u0627\u062e\u062a\u0631 \u0631\u0642\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646 \u0631\u0635\u064a\u062f\u0647:\", reply_markup=reply_markup)\n        return ConversationHandler.END\n\n    elif query.data.startswith('query_'):\n        phone_number = query.data.split('_', 1)[1]\n        await query.edit_message_text(f\"\u23f3 \u062c\u0627\u0631\u064d \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0631\u0635\u064a\u062f \u0644\u0644\u0631\u0642\u0645: {phone_number} ...\")\n        info = await asyncio.to_thread(get_adsl_info, phone_number)\n        await send_balance_info(update.callback_query, phone_number, info)\n        await query.edit_message_text(\"\u2705 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645.\\n\\n\u21a9\ufe0f \u0627\u0633\u062a\u062e\u062f\u0645 /start \u0644\u0644\u0631\u062c\u0648\u0639 \u0625\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629.\")\n        return ConversationHandler.END\n\n    elif query.data == 'manage_numbers':\n        numbers = saved_numbers.get(user_id, [])\n        if not numbers:\n            await query.edit_message_text(\"\u26a0\ufe0f \u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0644\u0625\u062f\u0627\u0631\u062a\u0647\u0627 \u062d\u0627\u0644\u064a\u0627\u064b.\")\n            return ConversationHandler.END\n\n        keyboard = [[InlineKeyboardButton(f\"\u274c \u062d\u0630\u0641 {num}\", callback_data=f\"delete_{num}\")] for num in numbers]\n        keyboard.append([InlineKeyboardButton(\"\ud83d\udd19 \u0627\u0644\u0639\u0648\u062f\u0629\", callback_data='back_to_menu')])\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\"\ud83d\uddd1\ufe0f \u0627\u062e\u062a\u0631 \u0631\u0642\u0645 \u0644\u0644\u062d\u0630\u0641:\", reply_markup=reply_markup)\n        return DELETE_NUMBER\n\n    elif query.data.startswith('delete_'):\n        phone_number = query.data.split('_', 1)[1]\n        numbers = saved_numbers.get(user_id, [])\n        if phone_number in numbers:\n            numbers.remove(phone_number)\n            saved_numbers[user_id] = numbers\n            save_numbers_to_file(saved_numbers)\n            await query.edit_message_text(f\"\u2705 \u062a\u0645 \u062d\u0630\u0641 \u0627\u0644\u0631\u0642\u0645 `{phone_number}` \u0628\u0646\u062c\u0627\u062d.\", parse_mode='Markdown')\n        else:\n            await query.edit_message_text(\"\u26a0\ufe0f \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f \u0628\u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a.\")\n        return ConversationHandler.END\n\n    elif query.data == 'schedule_query':\n        await query.edit_message_text(\n            \"\u23f0 \u0642\u0645 \u0628\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0633\u0627\u0639\u0629 \u0627\u0644\u062a\u064a \u062a\u0631\u064a\u062f \u0623\u0646 \u064a\u062a\u0645 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u0639\u0646\u062f\u0647\u0627:\\n\\n\" +\n            \"\\n\".join(\n                [f\"{h} {'\u0635' if h < 12 else '\u0645'}\" for h in range(1, 13)]\n            )\n        )\n        keyboard = []\n        for h in range(1, 13):\n            keyboard.append([InlineKeyboardButton(str(h), callback_data=f\"hour_{h}\")])\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\"\u23f0 \u0627\u062e\u062a\u0631 \u0627\u0644\u0633\u0627\u0639\u0629 \u0645\u0646 1 \u0625\u0644\u0649 12:\", reply_markup=reply_markup)\n        return SCHEDULE_HOUR\n\n    elif query.data.startswith('hour_'):\n        hour = int(query.data.split('_')[1])\n        context.user_data['schedule_hour'] = hour\n        keyboard = [\n            [InlineKeyboardButton(\"\u0635 (AM)\", callback_data=\"ampm_AM\"),\n             InlineKeyboardButton(\"\u0645 (PM)\", callback_data=\"ampm_PM\")]\n        ]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(f\"\u23f0 \u0627\u062e\u062a\u0631 \u0627\u0644\u0641\u062a\u0631\u0629 (\u0635 / \u0645) \u0644\u0644\u0633\u0627\u0639\u0629 {hour}:\", reply_markup=reply_markup)\n        return SCHEDULE_AMPM\n\n    elif query.data.startswith('ampm_'):\n        ampm = query.data.split('_')[1]\n        user_id = str(update.effective_user.id)\n        hour = context.user_data.get('schedule_hour')\n        if hour is None:\n            await query.edit_message_text(\"\u274c \u062d\u062f\u062b \u062e\u0637\u0623: \u0644\u0645 \u064a\u062a\u0645 \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0633\u0627\u0639\u0629.\")\n            return ConversationHandler.END\n        \n        # \u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0633\u0627\u0639\u0629 \u0628\u0635/\u0645 \u0625\u0644\u0649 24 \u0633\u0627\u0639\u0629\n        if ampm == \"AM\":\n            hour_24 = hour % 12  # 12 \u0635\u0628\u0627\u062d\u064b\u0627 = 0 \u0633\u0627\u0639\u0629\n        else:\n            hour_24 = (hour % 12) + 12  # 12 \u0645\u0633\u0627\u0621\u064b = 12 \u0633\u0627\u0639\u0629 \u0623\u0648 \u063a\u064a\u0631\u0647\u0627\n\n        scheduled_times[user_id] = {\"hour\": hour_24}\n        save_scheduled_times(scheduled_times)\n        \n        # \u0625\u0644\u063a\u0627\u0621 \u062c\u062f\u0648\u0644\u0629 \u0633\u0627\u0628\u0642\u0629 \u0625\u0646 \u0648\u062c\u062f\u062a\n        if user_id in scheduled_jobs:\n            scheduled_jobs[user_id].schedule_removal()\n            del scheduled_jobs[user_id]\n\n        # \u0625\u0636\u0627\u0641\u0629 \u0645\u0647\u0645\u0629 \u0645\u062c\u062f\u0648\u0644\u0629 \u062c\u062f\u064a\u062f\u0629\n        app = context.application\n        job = app.job_queue.run_daily(\n            scheduled_query_callback,\n            time=datetime.now(YEMEN_TZ).replace(hour=hour_24, minute=0, second=0, microsecond=0).timetz(),\n            days=(0, 1, 2, 3, 4, 5, 6),\n            context=user_id,\n            name=user_id\n        )\n        scheduled_jobs[user_id] = job\n\n        await query.edit_message_text(f\"\u2705 \u062a\u0645 \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0633\u0627\u0639\u0629 {hour} {ampm}\")\n        return ConversationHandler.END\n\n    elif query.data == \"help\":\n        help_text = (\n            \"\u2139\ufe0f *\u0643\u064a\u0641\u064a\u0629 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0628\u0648\u062a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL:*\\n\\n\"\n            \"\u2022 \u0623\u0631\u0633\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0648\u0631\u064a.\\n\"\n            \"\u2022 \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0644\u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645\u060c \u0639\u0631\u0636\u0647\u0627\u060c \u0623\u0648 \u062c\u062f\u0648\u0644\u062a\u0647\u0627.\\n\"\n            \"\u2022 \u064a\u0645\u0643\u0646\u0643 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u064a\u0648\u0645\u064a \u0623\u0648 \u062d\u0630\u0641 \u0623\u0631\u0642\u0627\u0645 \u0645\u0646 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a.\\n\"\n            \"\u2022 \u0627\u0644\u0628\u0648\u062a \u064a\u062f\u0639\u0645 \u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0644\u0644\u064a\u0645\u0646.\\n\\n\"\n            \"\u26a0\ufe0f *\u0645\u0644\u0627\u062d\u0638\u0629:* \u062a\u0623\u0643\u062f \u0645\u0646 \u0625\u062f\u062e\u0627\u0644 \u0631\u0642\u0645 \u0633\u0644\u064a\u0645 \u0648\u0645\u0646 \u0636\u0645\u0646 \u0634\u0628\u0643\u0629 ADSL \u0627\u0644\u064a\u0645\u0646.\"\n        )\n        await query.edit_message_text(help_text, parse_mode='Markdown')\n        return ConversationHandler.END\n\n    elif query.data == 'refresh':\n        await start(update, context)\n        return ConversationHandler.END\n\n    elif query.data == 'back_to_menu':\n        await start(update, context)\n        return ConversationHandler.END\n\n    else:\n        await query.edit_message_text(\"\u274c \u062e\u064a\u0627\u0631 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649.\")\n        return ConversationHandler.END\n\n# \ud83d\udce8 \u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f\nasync def add_number(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    user_id = str(update.effective_user.id)\n    text = update.message.text.strip()\n    if not text.isdigit():\n        await update.message.reply_text(\"\u26a0\ufe0f \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0635\u062d\u064a\u062d \u064a\u062a\u0643\u0648\u0646 \u0645\u0646 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637.\")\n        return ADD_NUMBER\n\n    numbers = saved_numbers.get(user_id, [])\n    if text in numbers:\n        await update.message.reply_text(\"\u26a0\ufe0f \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0645\u062d\u0641\u0648\u0638 \u0644\u062f\u064a\u0643 \u0645\u0633\u0628\u0642\u0627\u064b.\")\n        return ConversationHandler.END\n\n    numbers.append(text)\n    saved_numbers[user_id] = numbers\n    save_numbers_to_file(saved_numbers)\n    await update.message.reply_text(f\"\u2705 \u062a\u0645 \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0631\u0642\u0645 `{text}` \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a.\", parse_mode='Markdown')\n    return ConversationHandler.END\n\n# \ud83d\uddd1\ufe0f \u062d\u0630\u0641 \u0631\u0642\u0645 - \u0627\u0644\u0645\u0639\u0627\u0644\u062c \u0647\u0648 CallbackQueryHandler \u0644\u0630\u0644\u0643 \u0623\u062f\u0631\u062c\u0646\u0627\u0647 \u0641\u064a button_handler \u0645\u0628\u0627\u0634\u0631\u0629\n\n# \u23f0 \u0645\u0647\u0645\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0645\u062c\u062f\u0648\u0644 \u0627\u0644\u062a\u064a \u062a\u0639\u0645\u0644 \u064a\u0648\u0645\u064a\u0627\u064b\nasync def scheduled_query_callback(context: ContextTypes.DEFAULT_TYPE):\n    user_id = context.job.context\n    user = await context.bot.get_chat(user_id)\n    user_numbers = saved_numbers.get(user_id, [])\n    if not user_numbers:\n        logger.info(f\"\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {user_id} \u0644\u0627 \u064a\u0645\u0644\u0643 \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0645\u062c\u062f\u0648\u0644.\")\n        return\n\n    for number in user_numbers:\n        info = await asyncio.to_thread(get_adsl_info, number)\n        message = (\n            f\"\ud83d\udcc5 *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL \u0627\u0644\u0645\u062c\u062f\u0648\u0644*\\n\"\n            f\"\u23f0 {datetime.now(YEMEN_TZ).strftime('%Y-%m-%d %H:%M:%S')}\\n\"\n            f\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645: `{number}`\\n\"\n        )\n        if info:\n            message += (\n                f\"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a: `{info['current_balance']}`\\n\"\n                f\"\ud83d\udcb0 \u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629: `{info['package_value']}`\\n\"\n                f\"\ud83d\udcc5 \u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621: `{info['expiry_date']}`\"\n            )\n        else:\n            message += \"\u26a0\ufe0f \u0644\u0645 \u0646\u062a\u0645\u0643\u0646 \u0645\u0646 \u062c\u0644\u0628 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f.\"\n        await context.bot.send_message(chat_id=user_id, text=message, parse_mode='Markdown')\n\n# \ud83d\udce9 \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0631\u0633\u0627\u0644\u0629 \u0646\u0635\u064a\u0629 \u0639\u0627\u062f\u064a\u0629 (\u0623\u0631\u0633\u0644\u062a \u0631\u0642\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0633\u0631\u064a\u0639)\nasync def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):\n    text = update.message.text.strip()\n    if text.isdigit():\n        # \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0633\u0631\u064a\u0639 \u0639\u0646 \u0627\u0644\u0631\u0635\u064a\u062f \u0644\u0631\u0642\u0645 \u0648\u0627\u062d\u062f\n        await update.message.reply_text(f\"\u23f3 \u062c\u0627\u0631\u064d \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f \u0627\u0644\u0631\u0642\u0645 {text} ...\")\n        info = await asyncio.to_thread(get_adsl_info, text)\n        await send_balance_info(update, text, info)\n    else:\n        await update.message.reply_text(\"\u26a0\ufe0f \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0647\u0627\u062a\u0641 \u0635\u0627\u0644\u062d \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0645 /start \u0644\u0639\u0631\u0636 \u0627\u0644\u0642\u0627\u0626\u0645\u0629.\")\n\n# \ud83d\udcdb \u0645\u0639\u0627\u0644\u062c \u0627\u0644\u0623\u062e\u0637\u0627\u0621\nasync def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:\n    logger.error(msg=\"\u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639:\", exc_info=context.error)\n    if isinstance(update, Update) and update.message:\n        await update.message.reply_text(\"\u274c \u062d\u062f\u062b \u062e\u0637\u0623 \u062f\u0627\u062e\u0644\u064a\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b \u0623\u0648 \u0627\u0644\u062a\u0648\u0627\u0635\u0644 \u0645\u0639 \u0627\u0644\u062f\u0639\u0645.\")\n\n# \u23f0 \u0641\u062d\u0635 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u062e\u0644\u0627\u0644 \u0627\u0644\u0640 JobQueue (\u064a\u0645\u0643\u0646 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647 \u0644\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u062a\u063a\u064a\u0631\u0627\u062a \u0623\u062e\u0631\u0649 \u0625\u0630\u0627 \u0623\u0631\u062f\u062a)\nasync def check_scheduled_times(context: ContextTypes.DEFAULT_TYPE):\n    # \u0644\u0627 \u062d\u0627\u062c\u0629 \u0644\u0639\u0645\u0644 \u0623\u064a \u0634\u064a\u0621 \u0644\u0623\u0646\u0646\u0627 \u062c\u062f\u0648\u0644\u0646\u0627 run_daily \u0644\u0643\u0644 \u0645\u0633\u062a\u062e\u062f\u0645 \u0633\u0648\u0627\u0621\n    pass\n\n# \ud83c\udf89 \u0623\u0645\u0631 /start - \u0627\u0644\u062a\u0631\u062d\u064a\u0628 \u0645\u0639 \u0639\u0631\u0636 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    user = update.effective_user\n    \n    welcome_message = (\n        f\"\u2728 *\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643 {user.first_name} \u0641\u064a \u0628\u0648\u062a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL \u0627\u0644\u064a\u0645\u0646* \u2728\\n\\n\"\n        \"\ud83d\ude80 *\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0645\u062a\u0643\u0627\u0645\u0644\u0629:*\\n\"\n        \"\u25ab\ufe0f \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a \u0639\u0646 \u0631\u0635\u064a\u062f \u0623\u064a \u062e\u0637 ADSL\\n\"\n        \"\u25ab\ufe0f \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0633\u0647\u0648\u0644\u0629\\n\"\n        \"\u25ab\ufe0f \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629 \u064a\u0648\u0645\u064a\u0629\\n\"\n        \"\u25ab\ufe0f \u0639\u0631\u0636 \u0627\u0644\u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0641\u0635\u0644\u0629\\n\\n\"\n        \"\ud83d\udccc *\u0643\u064a\u0641\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645:*\\n\"\n        \"\u25aa\ufe0f \u0623\u0631\u0633\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0648\u0631\u064a\\n\"\n        \"\u25aa\ufe0f \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u064a\u0632\u0627\u062a\\n\\n\"\n        \"\ud83d\udd18 *\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0623\u062d\u062f \u0627\u0644\u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629:*\"\n    )\n    \n    keyboard = [\n        [InlineKeyboardButton(\"\u2795 \u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f\", callback_data='add_number'),\n         InlineKeyboardButton(\"\ud83d\uddc2\ufe0f \u0639\u0631\u0636 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='show_numbers')],\n        [InlineKeyboardButton(\"\ud83d\udd0d \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='query_numbers'),\n         InlineKeyboardButton(\"\ud83d\uddd1\ufe0f \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='manage_numbers')],\n        [InlineKeyboardButton(\"\u23f0 \u062c\u062f\u0648\u0644\u0629 \u062a\u0644\u0642\u0627\u0626\u064a\u0629\", callback_data='schedule_query'),\n         InlineKeyboardButton(\"\u2139\ufe0f \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629\", callback_data='help')],\n        [InlineKeyboardButton(\"\ud83d\udd04 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0628\u0648\u062a\", callback_data='refresh')]\n    ]\n    reply_markup = InlineKeyboardMarkup(keyboard)\n    if update.message:\n        await update.message.reply_text(welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n    elif update.callback_query:\n        await update.callback_query.edit_message_text(welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n\n# \ud83d\ude80 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0628\u0648\u062a\nasync def run_bot():\n    application = ApplicationBuilder().token(TOKEN).build()\n\n    job_queue = application.job_queue\n    if job_queue:\n        job_queue.run_repeating(check_scheduled_times, interval=60.0, first=10.0)\n\n    conv_handler = ConversationHandler(\n        entry_points=[CallbackQueryHandler(button_handler)],\n        states={\n            ADD_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_number)],\n            DELETE_NUMBER: [CallbackQueryHandler(button_handler)],  # \u062d\u0630\u0641 \u0631\u0642\u0645 \u064a\u062a\u0645 \u0645\u0646 button_handler\n            SCHEDULE_HOUR: [CallbackQueryHandler(button_handler)],\n            SCHEDULE_AMPM: [CallbackQueryHandler(button_handler)]\n        },\n        fallbacks=[CommandHandler(\"start\", start)],\n        per_message=True\n    )\n    \n    application.add_handler(CommandHandler(\"start\", start))\n    application.add_handler(conv_handler)\n    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))\n    application.add_error_handler(error_handler)\n\n    logger.info(\"\ud83e\udd16 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644...\")\n    await application.run_polling()\n\nif __name__ == '__main__':\n    try:\n        asyncio.run(run_bot())\n    except KeyboardInterrupt:\n        logger.info(\"\u23f9\ufe0f \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0628\u0648\u062a \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\")\n    except Exception as e:\n        logger.error(f\"\u274c \u0641\u0634\u0644 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0628\u0648\u062a: {e}\")\n```\n\n---\n\n## \u0634\u0631\u062d \u0633\u0631\u064a\u0639\n- \u0627\u0644\u0628\u0648\u062a \u064a\u0633\u0645\u062d:\n  - \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u0648\u0625\u062f\u0627\u0631\u062a\u0647\u0627 \u0648\u062d\u0630\u0641\u0647\u0627.\n  - \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a \u0628\u0623\u064a \u0631\u0642\u0645.\n  - \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u064a\u0648\u0645\u064a\u0629 \u062d\u0633\u0628 \u0633\u0627\u0639\u0629 \u0635/\u0645.\n- \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u062a\u062d\u0641\u0638 \u0641\u064a \u0645\u0644\u0641\u0627\u062a JSON \u0645\u0633\u062a\u0642\u0644\u0629 (\u064a\u0645\u0643\u0646 \u062a\u0639\u062f\u064a\u0644\u0647\u0627 \u062d\u0633\u0628 \u0627\u0644\u062d\u0627\u062c\u0629).\n- \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u062a\u0646\u0641\u0630 \u0639\u0628\u0631 `JobQueue` \u0648\u062a\u0631\u0627\u0639\u064a \u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0644\u0644\u064a\u0645\u0646.\n- \u0627\u0644\u0643\u0648\u062f \u0645\u062a\u0648\u0627\u0641\u0642 \u0645\u0639 `python-telegram-bot v20+` \u0628\u0637\u0631\u064a\u0642\u0629 asyncio \u0627\u0644\u062d\u062f\u064a\u062b\u0629.\n- \u064a\u0645\u0643\u0646 \u062a\u0637\u0648\u064a\u0631 \u0627\u0644\u0640 `get_adsl_info` \u062d\u0633\u0628 \u0627\u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u062d\u0642\u064a\u0642\u064a\u0629 \u0644\u0645\u0648\u0642\u0639 adsl-yemen.com \u0625\u0630\u0627 \u062a\u063a\u064a\u0631\u062a \u0627\u0644\u0647\u064a\u0643\u0644\u0629.\n\n---\n\n\u0625\u0630\u0627 \u0627\u062d\u062a\u062c\u062a \u0645\u0633\u0627\u0639\u062f\u0627\u062a \u0625\u0636\u0627\u0641\u064a\u0629 \u0623\u0648 \u0634\u0631\u062d \u0644\u0643\u064a\u0641\u064a\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0628\u0648\u062a \u0623\u0648 \u0646\u0634\u0631\u0647\u060c \u0641\u0642\u0637 \u0623\u062e\u0628\u0631\u0646\u064a! \ud83c\udf1f","behavior":"degenerate_repetition","conversation_hash":"15ec8c8e33ee5ca62b94694266f2131c","conversation_redacted":false,"conversation_toxic":false,"country":"Yemen","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":28169,"n_turns_in_conversation":2,"n_words":2584,"source_row_offset":36155,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:20:44 GMT","turn_id":"182d3127a747a5cb97c32193","turn_index":0,"user_text":"\u0627\u0631\u064a\u062f \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0643\u0627\u0645\u0644 \u0644\u0647\u0630\u0627\n# \ud83c\udf1f \u0627\u0633\u062a\u064a\u0631\u0627\u062f \u0627\u0644\u0645\u0643\u062a\u0628\u0627\u062a \u0627\u0644\u0644\u0627\u0632\u0645\u0629\nfrom bs4 import BeautifulSoup\nimport requests\nfrom telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup\nfrom telegram.ext import (\n    ApplicationBuilder,\n    CommandHandler,\n    MessageHandler,\n    ContextTypes,\n    filters,\n    CallbackQueryHandler,\n    ConversationHandler,\n    JobQueue\n)\nimport logging\nimport nest_asyncio\nimport asyncio\nfrom datetime import datetime, timedelta\nimport pytz\nfrom tabulate import tabulate\nimport json\nimport os\n\n# \ud83d\udd04 \u062a\u0641\u0639\u064a\u0644 nest_asyncio \u0644\u0644\u0633\u0645\u0627\u062d \u0628\u062a\u0634\u063a\u064a\u0644 event loop \u062f\u0627\u062e\u0644 \u0628\u064a\u0626\u0627\u062a Jupyter/Colab\nnest_asyncio.apply()\n\n# \ud83d\udd11 \u062a\u0648\u0643\u0646 \u0627\u0644\u0628\u0648\u062a (\u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0633\u0631\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u0627\u062a \u0627\u0644\u062d\u0642\u064a\u0642\u064a\u0629)\nTOKEN = \"7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0\"\n\n# \ud83d\udcdd \u0625\u0639\u062f\u0627\u062f \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 (Logging)\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO\n)\nlogger = logging.getLogger(__name__)\n\n# \ud83d\uddc3\ufe0f \u062d\u0627\u0644\u0627\u062a \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629\nADD_NUMBER, DELETE_NUMBER, SCHEDULE_HOUR, SCHEDULE_AMPM = range(4)\n\n# \ud83d\udcc2 \u0645\u0644\u0641 \u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\nSAVED_NUMBERS_FILE = \"saved_numbers.json\"\n# \ud83d\udcc2 \u0645\u0644\u0641 \u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629\nSCHEDULED_TIMES_FILE = \"scheduled_times.json\"\n\n# \u23f0 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0644\u0644\u064a\u0645\u0646\nYEMEN_TZ = pytz.timezone('Asia/Aden')\n\n# \ud83d\udcbe \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0645\u0646 \u0645\u0644\u0641 JSON\ndef load_saved_numbers():\n    if os.path.exists(SAVED_NUMBERS_FILE):\n        try:\n            with open(SAVED_NUMBERS_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n            return {}\n    return {}\n\n# \ud83d\udcbe \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u0645\u0646 \u0645\u0644\u0641 JSON\ndef load_scheduled_times():\n    if os.path.exists(SCHEDULED_TIMES_FILE):\n        try:\n            with open(SCHEDULED_TIMES_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n            return {}\n    return {}\n\n# \ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0641\u064a \u0645\u0644\u0641 JSON\ndef save_numbers_to_file(numbers):\n    try:\n        with open(SAVED_NUMBERS_FILE, 'w', encoding='utf-8') as f:\n            json.dump(numbers, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n\n# \ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u0641\u064a \u0645\u0644\u0641 JSON\ndef save_scheduled_times(times):\n    try:\n        with open(SCHEDULED_TIMES_FILE, 'w', encoding='utf-8') as f:\n            json.dump(times, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n\n# \ud83d\udcbe \u062a\u0647\u064a\u0626\u0629 \u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0648\u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629\nsaved_numbers = load_saved_numbers()\nscheduled_times = load_scheduled_times()\nscheduled_jobs = {}\n\n# \ud83d\udd0d \u062f\u0627\u0644\u0629 \u062c\u062f\u064a\u062f\u0629 \u0644\u062c\u0644\u0628 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 requests \u0648 BeautifulSoup\ndef get_adsl_info(phone_number):\n    try:\n        # \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0641\u062d\u0629\n        url = \"http://adsl-yemen.com/adsl4.php\"\n        \n        # \u0628\u064a\u0627\u0646\u0627\u062a POST \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629\n        data = {\n            'mobile': phone_number,\n            'action': 'query'  # \u0642\u062f \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u062a\u0639\u062f\u064a\u0644 \u0647\u0630\u0627 \u062d\u0633\u0628 \u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0641\u0639\u0644\u064a\n        }\n        \n        # \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628 \u0645\u0639 \u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u062d\u0627\u0643\u0627\u0629 \u0645\u062a\u0635\u0641\u062d\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n            'Referer': 'http://adsl-yemen.com/adsl4.php',\n            'Origin': 'http://adsl-yemen.com'\n        }\n        \n        response = requests.post(url, data=data, headers=headers)\n        response.raise_for_status()  # \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0639\u062f\u0645 \u0648\u062c\u0648\u062f \u0623\u062e\u0637\u0627\u0621 \u0641\u064a \u0627\u0644\u0637\u0644\u0628\n        \n        # \u062a\u062d\u0644\u064a\u0644 \u0645\u062d\u062a\u0648\u0649 HTML\n        soup = BeautifulSoup(response.text, 'html.parser')\n        \n        # \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a - \u0647\u0630\u0647 \u0627\u0646\u062a\u0642\u0627\u0621\u0627\u062a \u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629\u060c \u064a\u062c\u0628 \u062a\u0639\u062f\u064a\u0644\u0647\u0627 \u062d\u0633\u0628 \u0627\u0644\u0647\u064a\u0643\u0644 \u0627\u0644\u0641\u0639\u0644\u064a \u0644\u0644\u0635\u0641\u062d\u0629\n        current_balance_div = soup.find(\"div\", string=\"\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a\")\n        package_value_div = soup.find(\"div\", string=\"\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629\")\n        expiry_date_div = soup.find(\"div\", string=\"\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\")\n        \n        # \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0642\u064a\u0645\n        current_balance = current_balance_div.find_next_sibling(\"div\").text.strip() if current_balance_div else \"\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631\"\n        package_value = package_value_div.find_next_sibling(\"div\").text.strip() if package_value_div else \"\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631\"\n        expiry_date = expiry_date_div.find_next_sibling(\"div\").text.strip() if expiry_date_div else \"\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631\"\n        \n        return {\n            'current_balance': current_balance,\n            'package_value': package_value,\n            'expiry_date': expiry_date,\n            'timestamp': datetime.now(YEMEN_TZ).strftime(\"%Y-%m-%d %H:%M:%S\")\n        }\n        \n    except requests.exceptions.RequestException as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u0645\u0648\u0642\u0639: {e}\")\n        return None\n    except Exception as e:\n        logger.error(f\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0631\u0635\u064a\u062f: {e}\")\n        return None\n\n# \ud83d\udce8 \u062f\u0627\u0644\u0629 \u0644\u0625\u0631\u0633\u0627\u0644 \u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 (\u062a\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u064a)\nasync def send_balance_info(update, phone_number, info):\n    if info:\n        response = (\n            f\"\ud83d\udcca *\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\ud83d\udcf1 *\u0627\u0644\u0631\u0642\u0645:* `{phone_number}`\\n\"\n            f\"\u23f0 *\u0648\u0642\u062a \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645:* {info['timestamp']}\\n\\n\"\n            f\"\ud83d\udcb5 *\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a:* `{info['current_balance']}`\\n\"\n            f\"\ud83d\udcb0 *\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629:* `{info['package_value']}`\\n\"\n            f\"\ud83d\udcc5 *\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621:* `{info['expiry_date']}`\\n\\n\"\n            f\"\u2728 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\"\n        )\n    else:\n        response = (\n            \"\u26a0\ufe0f *\u0639\u0630\u0631\u0627\u064b\u060c \u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\uded1 *\u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629:*\\n\"\n            \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0633\u062c\u0644 \u0641\u064a \u062e\u062f\u0645\u0629 ADSL\\n\"\n            \"\u2022 \u0648\u062c\u0648\u062f \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0645\u0624\u0642\u062a\u0629\\n\"\n            \"\u2022 \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645\\n\\n\"\n            \"\ud83d\udd0d \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0631\u0642\u0645 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b\"\n        )\n    \n    if isinstance(update, Update):\n        await update.message.reply_text(response, parse_mode='Markdown')\n    else:\n        await update.reply_text(response, parse_mode='Markdown')\n\n# ... (\u0628\u0642\u064a\u0629 \u0627\u0644\u062f\u0648\u0627\u0644 \u062a\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u064a \u0628\u062f\u0648\u0646 \u062a\u063a\u064a\u064a\u0631)\n\n# \ud83c\udf89 \u0623\u0645\u0631 /start (\u064a\u062a\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u0648)\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    \"\"\"\u0625\u0631\u0633\u0627\u0644 \u0631\u0633\u0627\u0644\u0629 \u062a\u0631\u062d\u064a\u0628\u064a\u0629 \u0627\u062d\u062a\u0631\u0627\u0641\u064a\u0629 \u0645\u0639 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0623\u0632\u0631\u0627\u0631\"\"\"\n    user = update.effective_user\n    \n    # \ud83c\udf08 \u0631\u0633\u0627\u0644\u0629 \u062a\u0631\u062d\u064a\u0628\u064a\u0629 \u0634\u0627\u0645\u0644\u0629\n    welcome_message = (\n        f\"\u2728 *\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643 {user.first_name} \u0641\u064a \u0628\u0648\u062a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL \u0627\u0644\u064a\u0645\u0646* \u2728\\n\\n\"\n        \"\ud83d\ude80 *\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0645\u062a\u0643\u0627\u0645\u0644\u0629:*\\n\"\n        \"\u25ab\ufe0f \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a \u0639\u0646 \u0631\u0635\u064a\u062f \u0623\u064a \u062e\u0637 ADSL\\n\"\n        \"\u25ab\ufe0f \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0633\u0647\u0648\u0644\u0629\\n\"\n        \"\u25ab\ufe0f \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629 \u064a\u0648\u0645\u064a\u0629\\n\"\n        \"\u25ab\ufe0f \u0639\u0631\u0636 \u0627\u0644\u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0641\u0635\u0644\u0629\\n\\n\"\n        \"\ud83d\udccc *\u0643\u064a\u0641\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645:*\\n\"\n        \"\u25aa\ufe0f \u0623\u0631\u0633\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0648\u0631\u064a\\n\"\n        \"\u25aa\ufe0f \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u064a\u0632\u0627\u062a\\n\\n\"\n        \"\ud83d\udd18 *\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0623\u062d\u062f \u0627\u0644\u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629:*\"\n    )\n    \n    keyboard = [\n        [InlineKeyboardButton(\"\u2795 \u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f\", callback_data='add_number'),\n         InlineKeyboardButton(\"\ud83d\uddc2\ufe0f \u0639\u0631\u0636 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='show_numbers')],\n        [InlineKeyboardButton(\"\ud83d\udd0d \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='query_numbers'),\n         InlineKeyboardButton(\"\ud83d\uddd1\ufe0f \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='manage_numbers')],\n        [InlineKeyboardButton(\"\u23f0 \u062c\u062f\u0648\u0644\u0629 \u062a\u0644\u0642\u0627\u0626\u064a\u0629\", callback_data='schedule_query'),\n         InlineKeyboardButton(\"\u2139\ufe0f \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629\", callback_data='help')],\n        [InlineKeyboardButton(\"\ud83d\udd04 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0628\u0648\u062a\", callback_data='refresh')]\n    ]\n    reply_markup = InlineKeyboardMarkup(keyboard)\n    \n    if update.message:\n        await update.message.reply_text(welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n    else:\n        await update.callback_query.edit_message_text(welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n\n# ... (\u0628\u0642\u064a\u0629 \u0627\u0644\u062f\u0648\u0627\u0644 \u062a\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u064a \u0628\u062f\u0648\u0646 \u062a\u063a\u064a\u064a\u0631)\n\n# \ud83d\ude80 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0628\u0648\u062a (\u064a\u062a\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u0648)\nasync def run_bot():\n    # \u0625\u0646\u0634\u0627\u0621 Application \u0645\u0639 JobQueue\n    application = ApplicationBuilder().token(TOKEN).build()\n    \n    # \u0625\u0636\u0627\u0641\u0629 \u0645\u0647\u0645\u0629 \u062f\u0648\u0631\u064a\u0629 \u0644\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629 \u0643\u0644 \u062f\u0642\u064a\u0642\u0629\n    job_queue = application.job_queue\n    if job_queue:\n        job_queue.run_repeating(\n            check_scheduled_times,\n            interval=60.0,  # \u0643\u0644 \u062f\u0642\u064a\u0642\u0629\n            first=10.0      # \u0627\u0644\u0628\u062f\u0621 \u0628\u0639\u062f 10 \u062b\u0648\u0627\u0646\u064a\n        )\n    \n    # \u0625\u0639\u062f\u0627\u062f \u0645\u0639\u0627\u0644\u062c \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629 \u0645\u0639 per_message=True\n    conv_handler = ConversationHandler(\n        entry_points=[CallbackQueryHandler(button_handler)],\n        states={\n            ADD_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_number)],\n            DELETE_NUMBER: [CallbackQueryHandler(delete_number)],\n            SCHEDULE_HOUR: [CallbackQueryHandler(schedule_hour)],\n            SCHEDULE_AMPM: [CallbackQueryHandler(schedule_ampm)]\n        },\n        fallbacks=[CommandHandler(\"start\", start)],\n        per_message=True  # \u0647\u0630\u0627 \u064a\u062d\u0644 \u0627\u0644\u062a\u062d\u0630\u064a\u0631 \u0627\u0644\u0623\u0648\u0644\n    )\n    \n    # \ud83d\udee0\ufe0f \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0627\u062a\n    application.add_handler(CommandHandler(\"start\", start))\n    application.add_handler(conv_handler)\n    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))\n    application.add_error_handler(error_handler)\n\n    logger.info(\"\ud83e\udd16 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644...\")\n    await application.run_polling()\n\n# \u0627\u0644\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0631\u0626\u064a\u0633\u064a (\u064a\u062a\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u0648)\nif __name__ == '__main__':\n    try:\n        asyncio.run(run_bot())\n    except KeyboardInterrupt:\n        logger.info(\"\u23f9\ufe0f \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0628\u0648\u062a \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\")\n    except Exception as e:\n        logger.error(f\"\u274c \u0641\u0634\u0644 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0628\u0648\u062a: {e}\")"},{"assistant_initiates":false,"asst_text":"\u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0630\u064a \u0638\u0647\u0631 \u0644\u0643 \u0647\u0648 `ModuleNotFoundError: No module named 'telegram'`\u060c \u0648\u0647\u0630\u0627 \u064a\u0639\u0646\u064a \u0623\u0646 \u0645\u0643\u062a\u0628\u0629 `python-telegram-bot` \u063a\u064a\u0631 \u0645\u062b\u0628\u062a\u0629 \u0641\u064a \u0628\u064a\u0626\u0629 \u0627\u0644\u0639\u0645\u0644 \u0627\u0644\u062a\u064a \u062a\u0633\u062a\u062e\u062f\u0645\u0647\u0627 (\u0639\u0644\u0649 \u0633\u0628\u064a\u0644 \u0627\u0644\u0645\u062b\u0627\u0644: Jupyter Notebook \u0623\u0648 Google Colab \u0623\u0648 \u0628\u064a\u0626\u0629 \u0623\u062e\u0631\u0649).\n\n\u0644\u062d\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u060c \u064a\u0645\u0643\u0646\u0643 \u062a\u062b\u0628\u064a\u062a \u0627\u0644\u0645\u0643\u062a\u0628\u0629 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0623\u0645\u0631 `pip` \u0641\u064a \u0627\u0644\u062e\u0644\u064a\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0627\u0644\u0640 Jupyter \u0623\u0648 \u0645\u0646 \u0627\u0644\u0637\u0631\u0641\u064a\u0629 (Terminal):\n\n```python\n!pip install python-telegram-bot --upgrade\n```\n\n\u0623\u0648 \u0641\u064a \u062d\u0627\u0644 \u0643\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 \u0628\u064a\u0626\u0629 \u0639\u0627\u062f\u064a\u0629 (Terminal / Command Prompt):\n\n```bash\npip install python-telegram-bot --upgrade\n```\n\n---\n\n### \u0628\u0639\u062f \u0627\u0644\u062a\u062b\u0628\u064a\u062a\n\n\u0642\u0645 \u0628\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0648\u0627\u0629 (restart kernel) \u0623\u0648 \u062c\u0644\u0633\u0629 \u0627\u0644\u0639\u0645\u0644\u060c \u062b\u0645 \u0623\u0639\u062f \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0628\u0648\u062a.\n\n---\n\n### \u0645\u0644\u0627\u062d\u0638\u0629:\n\n- \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0633\u062a\u062e\u062f\u0645 \u0625\u0635\u062f\u0627\u0631 Python 3.7 \u0623\u0648 \u0623\u062d\u062f\u062b\u060c \u0644\u0623\u0646 `python-telegram-bot v20` \u064a\u062d\u062a\u0627\u062c \u0644\u0647\u0630\u0647 \u0627\u0644\u0625\u0635\u062f\u0627\u0631\u0627\u062a.\n\n- \u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 Google Colab\u060c \u0627\u0644\u0623\u0645\u0631 `!pip install` \u0641\u064a \u062e\u0644\u064a\u0629 \u0643\u0648\u062f \u0647\u0648 \u0645\u0627 \u062a\u062d\u062a\u0627\u062c\u0647 \u063a\u0627\u0644\u0628\u064b\u0627.\n\n---\n\n\u0647\u0644 \u062a\u062d\u062a\u0627\u062c \u0645\u0633\u0627\u0639\u062f\u0629 \u0641\u064a \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062a\u062b\u0628\u064a\u062a\u060c \u0623\u0648 \u0644\u062f\u064a\u0643 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u0622\u062e\u0631\u061f","behavior":"degenerate_repetition","conversation_hash":"15ec8c8e33ee5ca62b94694266f2131c","conversation_redacted":false,"conversation_toxic":false,"country":"Yemen","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":1731,"n_turns_in_conversation":2,"n_words":219,"source_row_offset":36156,"source_shard":"turns-00079.parquet","timestamp":"Wed, 14 May 2025 19:20:44 GMT","turn_id":"0fa74606ca2be57773e787da","turn_index":1,"user_text":"\u0638\u0647\u0631 \u0647\u0630\u0627 \u0627\u0644\u062e\u0637\u0627\u0621\n---------------------------------------------------------------------------\nModuleNotFoundError                       Traceback (most recent call last)\n<ipython-input-23-cfcd08d64263> in <cell line: 0>()\n      2 from bs4 import BeautifulSoup\n      3 import requests\n----> 4 from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup\n      5 from telegram.ext import (\n      6     ApplicationBuilder,\n\nModuleNotFoundError: No module named 'telegram'\n\n---------------------------------------------------------------------------\nNOTE: If your import is failing due to a missing package, you can\nmanually install dependencies using either !pip or !apt.\n\nTo view examples of installing some common dependencies, click the\n\"Open Examples\" button below.\n---------------------------------------------------------------------------"}],"shard":{"index":79,"name":"turns-00079.parquet","rows":46297}}
