{"behavior":"degenerate_repetition","label_filter":null,"limit":10,"next_offset":18082,"offset":18072,"previous_offset":null,"rows":[{"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":"South Korea","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":18072,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:30:01 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":"Terima kasih! Apakah ada yang bisa saya bantu hari ini? \ud83d\ude0a","behavior":"degenerate_repetition","conversation_hash":"7b8bf1882bb10c87e62fdfcebd06f49d","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":"Indonesian","model":"gpt-4.1-mini-2025-04-14","n_chars":100,"n_turns_in_conversation":1,"n_words":18,"source_row_offset":18073,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:30:55 GMT","turn_id":"6bb13fbd527d447901a855e9","turn_index":0,"user_text":"User: baik hati\nUser: baik hati\nAssistant:"},{"assistant_initiates":false,"asst_text":"Tentu, silakan! Ada yang bisa saya bantu?","behavior":"degenerate_repetition","conversation_hash":"27bbe6ccbffdb84e3b063dbf78cd8c0e","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":"Indonesian","model":"gpt-4.1-mini-2025-04-14","n_chars":96,"n_turns_in_conversation":1,"n_words":16,"source_row_offset":18074,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:30:56 GMT","turn_id":"445d3fff87764a2e548b8862","turn_index":0,"user_text":"User: mau Tanya boleh\nUser: mau Tanya boleh\nAssistant:"},{"assistant_initiates":false,"asst_text":"Terima kasih! Kamu juga orang yang baik hati. Ada yang bisa saya bantu hari ini?","behavior":"degenerate_repetition","conversation_hash":"68a295bcfee4ae19be55a922b8085794","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":"Indonesian","model":"gpt-4.1-mini-2025-04-14","n_chars":133,"n_turns_in_conversation":1,"n_words":24,"source_row_offset":18075,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:30:56 GMT","turn_id":"02357180b43ad275bc4604c5","turn_index":0,"user_text":"User: yang baik hati\nUser: yang baik hati\nAssistant:"},{"assistant_initiates":false,"asst_text":"\u0627\u0644\u0633\u0628\u0628 \u0627\u0644\u0631\u0626\u064a\u0633\u064a \u0644\u0644\u0628\u0637\u0621 \u0641\u064a \u0627\u0644\u0639\u0645\u0644\u064a\u0629\u060c \u062e\u0627\u0635\u0629 \u0623\u062b\u0646\u0627\u0621 \u062a\u0646\u0641\u064a\u0630 \u062f\u0627\u0644\u0629 `_startTransferSequence`\u060c \u0647\u0648 \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u0622\u0644\u064a \u0639\u0628\u0631 USSD \u0648\u0645\u062f\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0628\u064a\u0646 \u0643\u0644 \u0639\u0645\u0644\u064a\u0629 \u062a\u062d\u0648\u064a\u0644.\n\n\u0628\u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062a\u064a \u0642\u062f \u062a\u0633\u0628\u0628 \u0627\u0644\u0628\u0637\u0621:\n\n1. **\u0645\u062f\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062b\u0627\u0628\u062a\u0629 \u0628\u0639\u062f \u0643\u0644 \u062a\u062d\u0648\u064a\u0644:**\n   - \u0641\u064a \u0627\u0644\u0634\u064a\u0641\u0631\u0629 \u0647\u0646\u0627:\n\n     ```dart\n     await Future.delayed(const Duration(seconds: 10));\n     ```\n\n   - \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 10 \u062b\u0648\u0627\u0646\u064a \u0628\u0639\u062f \u0643\u0644 \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u062a\u0635\u0627\u0644 \u0628\u0640 USSD \u064a\u0632\u064a\u062f \u0632\u0645\u0646 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0643\u062b\u064a\u0631\u0627 \u062e\u0635\u0648\u0635\u064b\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0642\u0627\u0626\u0645\u0629 `_transferList` \u0637\u0648\u064a\u0644\u0629.\n\n2. **\u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u0645\u062a\u0633\u0644\u0633\u0644 (synchronous loop with await inside):**\n   - \u064a\u062a\u0645 \u062a\u0646\u0641\u064a\u0630 \u0643\u0644 \u0627\u062a\u0635\u0627\u0644 \u0648\u062a\u062d\u0648\u064a\u0644 \u0628\u0634\u0643\u0644 \u0645\u062a\u0633\u0644\u0633\u0644\u060c \u0628\u0645\u0639\u0646\u0649 \u0623\u0646 \u0627\u0644\u062a\u0637\u0628\u064a\u0642 \u064a\u0646\u062a\u0638\u0631 \u0625\u062a\u0645\u0627\u0645 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0648\u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 10 \u062b\u0648\u0627\u0646\u064a \u0642\u0628\u0644 \u0628\u062f\u0621 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629.\n   - \u0647\u0630\u0627 \u064a\u062c\u0639\u0644 \u0627\u0644\u062a\u0648\u0642\u064a\u062a \u0627\u0644\u0643\u0644\u064a \u0647\u0648 \"\u0639\u062f\u062f \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a \u00d7 10 \u062b\u0648\u0627\u0646\u064a\" \u062a\u0642\u0631\u064a\u0628\u0627\u064b.\n\n3. **\u0625\u0639\u0627\u062f\u0629 \u062a\u062d\u0645\u064a\u0644 \u0642\u0627\u0626\u0645\u0629 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0643\u0627\u0645\u0644\u0629 \u0628\u062f\u0648\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0624\u0642\u062a:**\n   - \u0641\u064a `_getContactNameFromNumber` \u064a\u062a\u0645 \u0627\u0633\u062a\u062f\u0639\u0627\u0621 `FlutterContacts.getContacts(withProperties: true)` \u0641\u064a \u0643\u0644 \u0645\u0631\u0629 \u064a\u062a\u0645 \u0641\u064a\u0647\u0627 \u0637\u0644\u0628 \u0627\u0633\u0645 \u062c\u0647\u0629 \u0627\u062a\u0635\u0627\u0644 \u0645\u0646 \u0631\u0642\u0645.\n   - \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0647\u0630\u0647 \u0627\u0644\u062f\u0627\u0644\u0629 \u062a\u064f\u0633\u062a\u062e\u062f\u0645 \u0641\u064a \u062d\u0644\u0642\u0627\u062a \u0623\u0648 ListView, \u0641\u0625\u0646\u0647\u0627 \u0642\u062f \u062a\u0633\u0628\u0628 \u0628\u0637\u0626 \u0643\u0628\u064a\u0631 \u0628\u0633\u0628\u0628 \u062a\u062d\u0645\u064a\u0644 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644\u0627\u062a \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0623\u0643\u062b\u0631 \u0645\u0646 \u0645\u0631\u0629.\n   - \u063a\u0627\u0644\u0628\u0627 \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u062a\u062e\u0632\u064a\u0646 \u0642\u0627\u0626\u0645\u0629 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0641\u064a \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0648\u062a\u062d\u0648\u064a\u0644\u0647\u0627 \u0625\u0644\u0649 Map \u0644\u0644\u0628\u062d\u062b \u0627\u0644\u0633\u0631\u064a\u0639.\n\n4. **\u0639\u062f\u0645 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Asynchronous caching \u0644\u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644:**\n   - \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0648\u0627\u062c\u0647\u0629 \u0648\u0625\u062c\u0631\u0627\u0621 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u0628\u062d\u062b \u0636\u0645\u0646 `FutureBuilder` \u064a\u0624\u062f\u064a \u0625\u0644\u0649 \u062a\u062d\u0645\u064a\u0644 \u0645\u062a\u0643\u0631\u0631 \u0644\u0644\u0628\u064a\u0627\u0646\u0627\u062a.\n\n5. **\u0627\u0644\u0645\u062d\u0648 \u0627\u0644\u062a\u0643\u0631\u0627\u0631\u064a \u0641\u064a \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u0640 `setState`:**\n   - \u0641\u064a \u0623\u0645\u0627\u0643\u0646 \u0645\u062a\u0639\u062f\u062f\u0629 \u064a\u062a\u0645 \u0627\u0633\u062a\u062f\u0639\u0627\u0621 `setState` \u0628\u0623\u0643\u062b\u0631 \u0645\u0646 \u0646\u0648\u0628\u0629 \u0641\u064a \u0646\u0641\u0633 \u0627\u0644 context\u060c \u062e\u0635\u0648\u0635\u0627 \u0623\u062b\u0646\u0627\u0621 \u062a\u062d\u062f\u064a\u062b \u0642\u0648\u0627\u0626\u0645 \u0637\u0648\u064a\u0644\u0629.\n\n---\n\n### \u062a\u0648\u0635\u064a\u0627\u062a \u0644\u062a\u062d\u0633\u064a\u0646 \u0627\u0644\u0623\u062f\u0627\u0621 \u0648\u0627\u0644\u0633\u0631\u0639\u0629:\n\n1. **\u062a\u0642\u0644\u064a\u0644 \u0645\u062f\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0628\u064a\u0646 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a:**  \n   - \u0625\u0630\u0627 \u0643\u0627\u0646 \u0645\u0645\u0643\u0646\u064b\u0627\u060c \u062c\u0631\u0651\u0628 \u062a\u0642\u0644\u064a\u0644 \u0645\u062f\u0629 `Future.delayed` \u0625\u0644\u0649 3-5 \u062b\u0648\u0627\u0646\u064a.  \n   - \u0623\u0648 \u062c\u0639\u0644\u0647\u0627 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u062a\u0639\u062f\u064a\u0644 \u062d\u0633\u0628 \u0633\u0631\u0639\u0629 \u0627\u0633\u062a\u062c\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0623\u0648 \u0627\u0644\u062c\u0647\u0627\u0632.  \n\n2. **\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a \u0628\u0637\u0631\u064a\u0642\u0629 \u0623\u0643\u062b\u0631 \u062a\u0648\u0627\u0632\u064a\u0627\u064b (parallel) \u0625\u0646 \u0623\u0645\u0643\u0646:**  \n   - \u0648\u0644\u0643\u0646 \u0645\u0639 \u0627\u0644\u0627\u0646\u062a\u0628\u0627\u0647 \u0625\u0644\u0649 \u0623\u0646 \u0627\u0644\u0640 USSD \u0644\u0627 \u064a\u062f\u0639\u0645 \u0639\u062f\u0629 \u0639\u0645\u0644\u064a\u0627\u062a \u0641\u064a \u0646\u0641\u0633 \u0627\u0644\u0648\u0642\u062a \u0639\u0627\u062f\u0629.\n\n3. **\u062a\u062d\u0633\u064a\u0646 \u062c\u0644\u0628 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644:**  \n   - \u062c\u0644\u0628 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629 \u0641\u0642\u0637 \u0639\u0646\u062f \u0628\u062f\u0621 \u0627\u0644\u062a\u0637\u0628\u064a\u0642 \u0623\u0648 \u0639\u0646\u062f \u0627\u0644\u062d\u0627\u062c\u0629 \u0639\u0646\u062f \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0635\u0641\u062d\u0629.  \n   - \u062a\u062e\u0632\u064a\u0646 \u0647\u0630\u0647 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0641\u064a Map \u0623\u0648 List \u0645\u062d\u0644\u064a \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647\u0627 \u0644\u0627\u062d\u0642\u064b\u0627 \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0627\u0633\u062a\u062f\u0639\u0627\u0621 FlutterContacts \u0639\u062f\u0629 \u0645\u0631\u0627\u062a.\n\n4. **\u062a\u062d\u0633\u064a\u0646 \u0627\u0644\u0628\u062d\u062b \u0641\u064a \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644:**  \n   - \u0627\u0633\u062a\u062e\u062f\u0645 \u062a\u0631\u0627\u0643\u064a\u0628 \u0628\u064a\u0627\u0646\u0627\u062a \u0645\u062b\u0644 `Map<String, Contact>` \u0645\u0639 \u0645\u0641\u0627\u062a\u064a\u062d \u0647\u064a \u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0647\u0648\u0627\u062a\u0641 \u0627\u0644\u0645\u0647\u064a\u0643\u0644\u0629 \u0644\u0643\u064a \u062a\u0635\u0644 \u0644\u0644\u0627\u0633\u0645 \u0628\u0634\u0643\u0644 \u0645\u0628\u0627\u0634\u0631 \u0648\u0633\u0631\u064a\u0639.  \n   - \u062a\u062c\u0646\u0628 \u0639\u0645\u0644\u064a\u0627\u062a `await FlutterContacts.getContacts` \u0643\u062b\u064a\u0631\u0629.\n\n5. **\u062a\u0642\u0644\u064a\u0644 \u0627\u0633\u062a\u062f\u0639\u0627\u0621\u0627\u062a setState:**  \n   - \u0627\u0633\u062a\u062e\u062f\u0645 `setState` \u0641\u0642\u0637 \u0644\u062a\u062d\u062f\u064a\u062b \u0645\u0627 \u062a\u062d\u062a\u0627\u062c\u0647 \u062d\u0642\u064b\u0627 \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629.\n\n6. **\u062a\u0641\u0639\u064a\u0644 caching \u0641\u064a FutureBuilder \u0625\u0630\u0627 \u0643\u0627\u0646 \u0628\u0625\u0645\u0643\u0627\u0646\u0643:**  \n   - \u0639\u0628\u0631 \u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0646\u062a\u0627\u0626\u062c \u0641\u064a \u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0627\u0644\u062d\u0627\u0644\u0629 \u0628\u062f\u0644\u0627 \u0645\u0646 \u0625\u0639\u0627\u062f\u0629 \u062c\u0644\u0628\u0647\u0627.\n\n---\n\n\u0641\u064a \u062e\u0644\u0627\u0635\u0629\u060c **\u0627\u0644\u0633\u0628\u0628 \u0627\u0644\u0623\u0643\u0628\u0631 \u0644\u0644\u0628\u0637\u0621 \u0647\u0648 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062b\u0627\u0628\u062a \u0627\u0644\u0637\u0648\u064a\u0644 (10 \u062b\u0648\u0627\u0646) \u0628\u064a\u0646 \u0643\u0644 \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u062d\u0648\u064a\u0644 USSD \u0645\u062a\u0633\u0644\u0633\u0644\u0629**\u060c \u0648\u0645\u0634\u0643\u0644\u0629 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u0645\u062a\u0643\u0631\u0631 \u0627\u0644\u0630\u064a \u064a\u0624\u062f\u064a \u0625\u0644\u0649 \u062a\u0623\u062e\u064a\u0631 \u0641\u064a \u0639\u0631\u0636 \u0627\u0644\u0623\u0633\u0645\u0627\u0621.\n\n---\n\n\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0631\u064a\u062f \u062a\u062d\u0633\u064a\u0646 \u0627\u0644\u0633\u0631\u0639\u0629 \u0641\u064a \u062c\u0632\u0621 \u0645\u0639\u064a\u0646\u060c \u0631\u0643\u0632 \u0639\u0644\u0649:\n\n- \u062a\u0642\u0644\u064a\u0644 \u0623\u0648 \u0627\u0644\u062a\u062d\u0643\u0645 \u0628\u0645\u062f\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 `Future.delayed`.  \n- \u062a\u0642\u0644\u064a\u0644 \u0639\u062f\u062f \u0645\u0631\u0627\u062a \u062c\u0644\u0628 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0648\u062d\u0641\u0638\u0647\u0627 \u0641\u064a \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0644\u062a\u0633\u0631\u064a\u0639 \u0627\u0644\u0648\u0635\u0648\u0644 \u0644\u0644\u0627\u0633\u0645\u0627\u0621 \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u062c\u0644\u0628\u0647\u0627 \u0645\u0639 \u0643\u0644 \u0637\u0644\u0628.","behavior":"degenerate_repetition","conversation_hash":"795249d8a293bb7e2ff98d0e1ea5fde8","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":116317,"n_turns_in_conversation":1,"n_words":6811,"source_row_offset":18076,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:31:09 GMT","turn_id":"ec780049e91d91909caee02f","turn_index":0,"user_text":"\u0644\u0645\u0627\u0630\u0627 \u0647\u0646\u0627\u0643 \u0628\u0637\u0626 \u0641\u064a \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u062a\u0627\u0644\u064a\n// main.dart\nimport 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:telephony/telephony.dart';\nimport 'package:permission_handler/permission_handler.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\nimport 'package:flutter_contacts/flutter_contacts.dart';\nimport 'package:url_launcher/url_launcher.dart';\n\n// \u0645\u0643\u062a\u0628\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a\nimport 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';\n\n// \u0627\u0633\u062a\u064a\u0631\u0627\u062f \u0634\u0627\u0634\u0629 \u0627\u0644\u062a\u0631\u062d\u064a\u0628 \u0627\u0644\u0645\u0646\u0641\u0635\u0644\u0629\nimport 'welcome_screen.dart';\n\nconst tajawalFont = 'Tajawal';\nvoid main() => runApp(const SMSApp());\n\nvoid onBackgroundMessage(SmsMessage message) {\n  debugPrint(\"\u0631\u0633\u0627\u0644\u0629 \u0648\u0627\u0631\u062f\u0629 \u0641\u064a \u0627\u0644\u062e\u0644\u0641\u064a\u0629: ${message.body}\");\n}\n\n/// \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u062a\u0637\u0628\u064a\u0642 \u0627\u0644\u0645\u062d\u062f\u062b\u0629 \u0625\u0644\u0649 \u0623\u0632\u0631\u0642 \u062c\u0630\u0627\u0628\nfinal ColorScheme lightColorScheme = ColorScheme(\n  primary: Color(0xFF1565C0), // \u0623\u0632\u0631\u0642 \u062f\u0627\u0643\u0646 \u0623\u0646\u064a\u0642\n  onPrimary: Colors.white,\n  primaryContainer: Color(0xFF90CAF9), // \u0623\u0632\u0631\u0642 \u0641\u0627\u062a\u062d\n  onPrimaryContainer: Color(0xFF0D47A1), // \u0623\u0632\u0631\u0642 \u062f\u0627\u0643\u0646 \u062c\u062f\u0627\u064b\n  secondary: Color(0xFF42A5F5), // \u0623\u0632\u0631\u0642 \u0645\u062a\u0648\u0633\u0637 \u062c\u0630\u0627\u0628\n  onSecondary: Colors.white,\n  secondaryContainer: Color(0xFFE3F2FD), // \u0623\u0632\u0631\u0642 \u0641\u0627\u062a\u062d \u062c\u062f\u0627\u064b\n  onSecondaryContainer: Color(0xFF1E88E5), // \u0623\u0632\u0631\u0642 \u0645\u062a\u0648\u0633\u0637 \u062f\u0627\u0643\u0646\n  tertiary: Color(0xFF64B5F6), // \u0623\u0632\u0631\u0642 \u0633\u0645\u0627\u0648\u064a\n  onTertiary: Colors.white,\n  tertiaryContainer: Color(0xFFBBDEFB), // \u0623\u0632\u0631\u0642 \u0641\u0627\u062a\u062d\n  onTertiaryContainer: Color(0xFF1976D2), // \u0623\u0632\u0631\u0642 \u062f\u0627\u0643\u0646\n  error: Color(0xFFD32F2F),\n  onError: Colors.white,\n  errorContainer: Color(0xFFFFCDD2),\n  onErrorContainer: Color(0xFFB71C1C),\n  background: Colors.white,\n  onBackground: Color(0xFF212121), // \u0623\u0633\u0648\u062f \u0645\u0632\u0631\u0642\n  surface: Colors.white,\n  onSurface: Color(0xFF212121),\n  surfaceVariant: Color(0xFFE1F5FE), // \u0623\u0632\u0631\u0642 \u0641\u0627\u062a\u062d \u062c\u062f\u0627\u064b\n  onSurfaceVariant: Color(0xFF0288D1), // \u0623\u0632\u0631\u0642 \u062c\u0630\u0627\u0628\n  outline: Color(0xFFBDBDBD),\n  shadow: Colors.black54,\n  inverseSurface: Color(0xFF121212),\n  onInverseSurface: Colors.white,\n  inversePrimary: Color(0xFF82B1FF),\n  brightness: Brightness.light,\n);\n\nclass SMSApp extends StatelessWidget {\n  const SMSApp({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: '\u062d\u0648\u0651\u0644\u0647\u0627',\n      debugShowCheckedModeBanner: false,\n      theme: ThemeData(\n        colorScheme: lightColorScheme,\n        fontFamily: 'Tajawal',\n        useMaterial3: true,\n        appBarTheme: AppBarTheme(\n          backgroundColor: Colors.transparent,\n          foregroundColor: lightColorScheme.onPrimary,\n          elevation: 6,\n          centerTitle: true,\n          titleTextStyle: const TextStyle(\n            fontSize: 20,\n            fontWeight: FontWeight.bold,\n            letterSpacing: 0.5,\n          ),\n          iconTheme: IconThemeData(color: lightColorScheme.onPrimary, size: 26),\n          toolbarHeight: 100,\n          shadowColor: lightColorScheme.primary.withOpacity(0.4),\n        ),\n\n        cardTheme: CardTheme(\n          color: lightColorScheme.surface,\n          elevation: 1,\n          margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n          shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(16),\n          ),\n          surfaceTintColor: Colors.transparent,\n        ),\n        elevatedButtonTheme: ElevatedButtonThemeData(\n          style: ElevatedButton.styleFrom(\n            backgroundColor: lightColorScheme.primary,\n            foregroundColor: lightColorScheme.onPrimary,\n            padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24),\n            shape: RoundedRectangleBorder(\n              borderRadius: BorderRadius.circular(12),\n            ),\n            elevation: 0,\n            textStyle: const TextStyle(\n              fontSize: 16,\n              fontWeight: FontWeight.w600,\n            ),\n          ),\n        ),\n        outlinedButtonTheme: OutlinedButtonThemeData(\n          style: OutlinedButton.styleFrom(\n            foregroundColor: lightColorScheme.primary,\n            side: BorderSide(color: lightColorScheme.primary, width: 1.5),\n            padding: const EdgeInsets.symmetric(vertical: 14, horizontal: 24),\n            shape: RoundedRectangleBorder(\n              borderRadius: BorderRadius.circular(12),\n            ),\n            textStyle: const TextStyle(\n              fontSize: 16,\n              fontWeight: FontWeight.w600,\n            ),\n          ),\n        ),\n        textButtonTheme: TextButtonThemeData(\n          style: TextButton.styleFrom(\n            foregroundColor: lightColorScheme.primary,\n            textStyle: const TextStyle(\n              fontWeight: FontWeight.w700,\n              fontSize: 16,\n            ),\n          ),\n        ),\n        snackBarTheme: SnackBarThemeData(\n          behavior: SnackBarBehavior.floating,\n          backgroundColor: lightColorScheme.inverseSurface,\n          elevation: 0,\n          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),\n          contentTextStyle: TextStyle(\n            color: lightColorScheme.onInverseSurface,\n            fontWeight: FontWeight.w500,\n            fontSize: 14,\n          ),\n          actionTextColor: lightColorScheme.primaryContainer,\n        ),\n        inputDecorationTheme: InputDecorationTheme(\n          filled: true,\n          fillColor: lightColorScheme.surfaceVariant.withOpacity(0.4),\n          contentPadding: const EdgeInsets.symmetric(\n            horizontal: 16,\n            vertical: 14,\n          ),\n          border: OutlineInputBorder(\n            borderRadius: BorderRadius.circular(12),\n            borderSide: BorderSide.none,\n          ),\n          focusedBorder: OutlineInputBorder(\n            borderRadius: BorderRadius.circular(12),\n            borderSide: BorderSide(color: lightColorScheme.primary, width: 2),\n          ),\n          errorBorder: OutlineInputBorder(\n            borderRadius: BorderRadius.circular(12),\n            borderSide: BorderSide(color: lightColorScheme.error, width: 1.5),\n          ),\n          labelStyle: TextStyle(\n            color: lightColorScheme.onSurfaceVariant,\n            fontWeight: FontWeight.w500,\n          ),\n          hintStyle: TextStyle(\n            color: lightColorScheme.onSurfaceVariant.withOpacity(0.6),\n          ),\n          prefixIconColor: lightColorScheme.primary,\n        ),\n        dialogTheme: DialogTheme(\n          shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(20),\n          ),\n          elevation: 0,\n          backgroundColor: lightColorScheme.surface,\n          contentTextStyle: TextStyle(\n            color: lightColorScheme.onSurface,\n            fontSize: 15,\n          ),\n          titleTextStyle: TextStyle(\n            fontWeight: FontWeight.bold,\n            fontSize: 18,\n            color: lightColorScheme.onSurface,\n          ),\n        ),\n        listTileTheme: ListTileThemeData(\n          shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(12),\n          ),\n          contentPadding: const EdgeInsets.symmetric(horizontal: 16),\n          iconColor: lightColorScheme.primary,\n          textColor: lightColorScheme.onSurface,\n          dense: true,\n        ),\n        chipTheme: ChipThemeData(\n          backgroundColor: lightColorScheme.surfaceVariant,\n          selectedColor: lightColorScheme.primary,\n          secondarySelectedColor: lightColorScheme.primary,\n          disabledColor: lightColorScheme.surfaceVariant.withOpacity(0.4),\n          labelStyle: const TextStyle(fontWeight: FontWeight.w500),\n          secondaryLabelStyle: TextStyle(color: lightColorScheme.onPrimary),\n          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),\n          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),\n          brightness: Brightness.light,\n          side: BorderSide.none,\n        ),\n        dividerTheme: DividerThemeData(\n          color: lightColorScheme.surfaceVariant,\n          thickness: 1,\n          space: 0,\n        ),\n        progressIndicatorTheme: ProgressIndicatorThemeData(\n          color: lightColorScheme.primary,\n          linearTrackColor: lightColorScheme.surfaceVariant,\n        ),\n        bottomSheetTheme: BottomSheetThemeData(\n          backgroundColor: lightColorScheme.surface,\n          shape: const RoundedRectangleBorder(\n            borderRadius: BorderRadius.vertical(top: Radius.circular(20)),\n          ),\n          elevation: 0,\n        ),\n      ),\n      home: const SplashScreen(),\n      routes: {'/home': (context) => const SMSHomePage()},\n    );\n  }\n}\n\nclass ThousandsSeparatorInputFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(\n    TextEditingValue oldValue,\n    TextEditingValue newValue,\n  ) {\n    String onlyDigits = newValue.text.replaceAll(RegExp(r'[^0-9]'), '');\n    if (onlyDigits.isEmpty) return newValue.copyWith(text: '');\n\n    final buffer = StringBuffer();\n    int len = onlyDigits.length;\n    for (int i = 0; i < len; i++) {\n      buffer.write(onlyDigits[i]);\n      int posFromRight = len - i - 1;\n      if (posFromRight % 3 == 0 && i != len - 1) buffer.write(',');\n    }\n\n    return TextEditingValue(\n      text: buffer.toString(),\n      selection: TextSelection.collapsed(offset: buffer.length),\n    );\n  }\n}\n\nclass TransferItem {\n  String number;\n  int amount;\n  String? pin;\n\n  TransferItem({required this.number, required this.amount, this.pin});\n\n  Map<String, dynamic> toMap() {\n    return {'number': number, 'amount': amount, 'pin': pin};\n  }\n\n  factory TransferItem.fromMap(Map<String, dynamic> map) {\n    return TransferItem(\n      number: map['number'],\n      amount: map['amount'],\n      pin: map['pin'],\n    );\n  }\n}\n\nextension ContactExtensions on Contact {\n  String initials() {\n    if (displayName.isEmpty) return '';\n\n    final parts = displayName.trim().split(RegExp(r'\\s+'));\n    if (parts.length == 1) {\n      return parts[0].substring(0, 1).toUpperCase();\n    } else {\n      return (parts[0].substring(0, 1) + parts[1].substring(0, 1))\n          .toUpperCase();\n    }\n  }\n}\n\nclass NumberAmount {\n  String number;\n  String? displayName;\n  int amount;\n\n  NumberAmount({required this.number, this.displayName, required this.amount});\n}\n\nclass SMSHomePage extends StatefulWidget {\n  const SMSHomePage({super.key});\n\n  @override\n  _SMSHomePageState createState() => _SMSHomePageState();\n}\n\nclass _SMSHomePageState extends State<SMSHomePage>\n    with WidgetsBindingObserver, TickerProviderStateMixin {\n  final Telephony _telephony = Telephony.instance;\n  SharedPreferences? _prefs;\n\n  List<TransferItem> _transferList = [];\n  String _selectedMethod = 'yemenMobile';\n  bool _isTransferring = false;\n  bool _stopTransferRequested = false;\n\n  List<Map<String, dynamic>> _transferLogs = [];\n  List<String> _savedNumbers = [];\n  List<int> _savedAmounts = [];\n  bool _didShowFavoritesDialog = false;\n  String? _selectedQuickNumber;\n  int _currentBalance = 0;\n\n  late AnimationController _fabAnimationController;\n  late Animation<double> _fabAnimation;\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _initApp();\n\n    _fabAnimationController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 400),\n    );\n    _fabAnimation = CurvedAnimation(\n      parent: _fabAnimationController,\n      curve: Curves.easeInOutBack,\n    );\n\n    // \u0644\u0636\u0645\u0627\u0646 \u0638\u0647\u0648\u0631 \u0632\u0631 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 \u062f\u0627\u0626\u0645\u0627\u064b\n    _fabAnimationController.value = 1;\n  }\n\n  @override\n  void dispose() {\n    WidgetsBinding.instance.removeObserver(this);\n    _fabAnimationController.dispose();\n    super.dispose();\n  }\n\n  Future<void> _showPinManagementDialog() async {\n    // \u0646\u062d\u0641\u0638 \u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0633\u0631\u064a\u0629 \u0644\u0643\u0644 \u0637\u0631\u064a\u0642\u0629 \u0641\u064a SharedPreferences \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0641\u062a\u0627\u062d 'pin_${method}'\n\n    // \u062c\u0644\u0628 \u0627\u0644\u0642\u064a\u0645 \u0627\u0644\u0645\u062e\u0632\u0646\u0629 \u062d\u0627\u0644\u064a\u0627\u064b\n    final yemenMobilePin = _getPinForMethod('yemenMobile') ?? '';\n    final sabafonPin = _getPinForMethod('sabafon') ?? '';\n\n    final yemenMobileController = TextEditingController(text: yemenMobilePin);\n    final sabafonController = TextEditingController(text: sabafonPin);\n\n    await showDialog(\n      context: context,\n      builder: (context) {\n        return AlertDialog(\n          title: Directionality(\n            textDirection: TextDirection.rtl,\n            child: Text(\n              '\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0633\u0631\u064a\u0629',\n              style: TextStyle(fontFamily: tajawalFont, fontSize: 15),\n            ),\n          ),\n          content: Directionality(\n            textDirection: TextDirection.rtl,\n            child: SingleChildScrollView(\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  TextField(\n                    controller: yemenMobileController,\n                    keyboardType: TextInputType.number,\n                    obscureText: true,\n                    decoration: InputDecoration(\n                      labelText: '\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a \u0644\u064a\u0645\u0646 \u0645\u0648\u0628\u0627\u064a\u0644',\n                      prefixIcon: Icon(Icons.lock_outline_rounded),\n                    ),\n                  ),\n                  SizedBox(height: 16),\n                  TextField(\n                    controller: sabafonController,\n                    keyboardType: TextInputType.number,\n                    obscureText: true,\n                    decoration: InputDecoration(\n                      labelText: '\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a \u0644\u0633\u0628\u0623\u0641\u0648\u0646',\n                      prefixIcon: Icon(Icons.lock_outline_rounded),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          actions: [\n            Directionality(\n              textDirection: TextDirection.rtl,\n              child: TextButton(\n                onPressed: () => Navigator.pop(context),\n                child: Text('\u0625\u0644\u063a\u0627\u0621', style: TextStyle(fontFamily: tajawalFont)),\n              ),\n            ),\n            Directionality(\n              textDirection: TextDirection.rtl,\n              child: ElevatedButton(\n                onPressed: () async {\n                  final newYemenPin = yemenMobileController.text.trim();\n                  final newSabafonPin = sabafonController.text.trim();\n\n                  // \u062d\u0641\u0638 \u0627\u0644\u0642\u064a\u0645 \u0641\u064a SharedPreferences\n                  await _savePinForMethod('yemenMobile', newYemenPin);\n                  await _savePinForMethod('sabafon', newSabafonPin);\n\n                  // \u062a\u062d\u062f\u064a\u062b \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u0642:\n                  setState(() {\n                    for (var item in _transferList) {\n                      if (item.pin != null) {\n                        if (_selectedMethod == 'yemenMobile') {\n                          item.pin = newYemenPin;\n                        } else if (_selectedMethod == 'sabafon') {\n                          item.pin = newSabafonPin;\n                        }\n                      }\n                    }\n                  });\n\n                  Navigator.pop(context);\n                  _showSnackBar('\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0633\u0631\u064a\u0629 \u0628\u0646\u062c\u0627\u062d');\n                },\n                child: Text('\u062d\u0641\u0638', style: TextStyle(fontFamily: tajawalFont)),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  Future<void> _loadTransferHistory() async {\n    final prefs = await SharedPreferences.getInstance();\n    final List<String>? logs = prefs.getStringList('transferHistory');\n    if (logs != null && logs.isNotEmpty) {\n      _transferLogs =\n          logs.map((e) => json.decode(e) as Map<String, dynamic>).toList();\n    } else {\n      _transferLogs = [];\n    }\n  }\n\n  Future<void> _saveTransferHistory() async {\n    final prefs = await SharedPreferences.getInstance();\n    final List<String> logs = _transferLogs.map((e) => json.encode(e)).toList();\n    await prefs.setStringList('transferHistory', logs);\n  }\n\n  Future<String?> _askForPin(String method) async {\n    final pinController = TextEditingController();\n\n    return showDialog<String>(\n      context: context,\n      barrierDismissible: false,\n      builder: (context) {\n        return AlertDialog(\n          title: Text(\n            '\u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u062f\u062e\u0627\u0644 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a \u0644\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644: ${_getMethodName(method)}',\n            style: TextStyle(fontFamily: tajawalFont),\n          ),\n          content: TextField(\n            controller: pinController,\n            keyboardType: TextInputType.number,\n            obscureText: true,\n            decoration: const InputDecoration(\n              labelText: '\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a',\n              prefixIcon: Icon(Icons.lock_outline_rounded),\n            ),\n          ),\n          actions: [\n            TextButton(\n              onPressed: () => Navigator.pop(context),\n              child: const Text(\n                '\u0625\u0644\u063a\u0627\u0621',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n            ElevatedButton(\n              onPressed: () {\n                final pin = pinController.text.trim();\n                if (pin.isEmpty) {\n                  ScaffoldMessenger.of(context).showSnackBar(\n                    const SnackBar(\n                      content: Text(\n                        '\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a',\n                        style: TextStyle(fontFamily: tajawalFont),\n                      ),\n                    ),\n                  );\n                  return;\n                }\n                Navigator.pop(context, pin);\n              },\n              child: const Text('\u062d\u0641\u0638'),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  Future<void> _savePinForMethod(String method, String pin) async {\n    await _prefs?.setString('pin_$method', pin);\n  }\n\n  String? _getPinForMethod(String method) {\n    return _prefs?.getString('pin_$method');\n  }\n\n  Future<void> _addTransferLog(Map<String, dynamic> log) async {\n    setState(() {\n      _transferLogs.insert(0, log); // \u0623\u062f\u062e\u0644 \u0627\u0644\u0623\u062d\u062f\u062b \u0641\u064a \u0627\u0644\u0628\u062f\u0627\u064a\u0629\n    });\n    await _saveTransferHistory();\n  }\n\n  Future<void> _removeTransferLog(int index) async {\n    setState(() {\n      _transferLogs.removeAt(index);\n    });\n    await _saveTransferHistory();\n  }\n\n  Future<void> _initApp() async {\n    _prefs = await SharedPreferences.getInstance();\n    await _loadTransferHistory();\n    _currentBalance = _prefs?.getInt('current_balance') ?? 0;\n\n    List<String>? amountsStr = _prefs?.getStringList('savedAmounts');\n    if (amountsStr != null) {\n      _savedAmounts =\n          amountsStr\n              .map((e) => int.tryParse(e) ?? 0)\n              .where((e) => e > 0)\n              .toList();\n    }\n\n    if (_savedAmounts.isEmpty && !_didShowFavoritesDialog) {\n      _didShowFavoritesDialog = true;\n      await Future.delayed(Duration.zero);\n      await _showFavoritesDialog();\n    }\n\n    List<String>? savedTransfers = _prefs?.getStringList('transferList');\n    if (savedTransfers != null && savedTransfers.isNotEmpty) {\n      _transferList =\n          savedTransfers\n              .map(\n                (e) => TransferItem.fromMap(\n                  json.decode(e) as Map<String, dynamic>,\n                ),\n              )\n              .toList();\n    } else {\n      _transferList = [];\n    }\n\n    _selectedMethod = _prefs?.getString('selectedMethod') ?? 'yemenMobile';\n    _savedNumbers = _prefs?.getStringList('savedNumbers') ?? [];\n\n    await _requestPermissions();\n\n    if (mounted) setState(() {});\n  }\n\n  Future<bool> _requestPermissions() async {\n    final phoneStatus = await Permission.phone.status;\n    final contactsStatus = await Permission.contacts.status;\n\n    if (!phoneStatus.isGranted || !contactsStatus.isGranted) {\n      final status = await [Permission.phone, Permission.contacts].request();\n\n      if (!status[Permission.phone]!.isGranted ||\n          !status[Permission.contacts]!.isGranted) {\n        _showSnackBar(\n          '\u064a\u062c\u0628 \u0645\u0646\u062d \u0623\u0630\u0648\u0646\u0627\u062a \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062a \u0648\u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u062a\u0637\u0628\u064a\u0642',\n        );\n        return false;\n      }\n    }\n    return true;\n  }\n\n  Future<void> _saveTransferList() async {\n    final list = _transferList.map((e) => json.encode(e.toMap())).toList();\n    await _prefs?.setStringList('transferList', list);\n  }\n\n  Future<void> _saveSelectedMethod() async {\n    await _prefs?.setString('selectedMethod', _selectedMethod);\n  }\n\n  Future<void> _saveSavedNumbers() async {\n    await _prefs?.setStringList('savedNumbers', _savedNumbers);\n  }\n\n  Future<void> _saveSavedAmounts() async {\n    List<String> strList = _savedAmounts.map((e) => e.toString()).toList();\n    await _prefs?.setStringList('savedAmounts', strList);\n  }\n\n  Future<void> _saveCurrentBalance() async {\n    await _prefs?.setInt('current_balance', _currentBalance);\n  }\n\n  void _showSnackBar(String msg) {\n    ScaffoldMessenger.of(context).showSnackBar(\n      SnackBar(\n        content: Text(\n          textDirection: TextDirection.rtl,\n          msg,\n          style: const TextStyle(\n            fontWeight: FontWeight.w500,\n            fontFamily: tajawalFont,\n          ),\n        ),\n        behavior: SnackBarBehavior.floating,\n      ),\n    );\n  }\n\n  Future<String?> _getContactNameFromNumber(String number) async {\n    final hasPermission = await Permission.contacts.status;\n    if (!hasPermission.isGranted) {\n      final status = await Permission.contacts.request();\n      if (!status.isGranted) return null;\n    }\n    final contacts = await FlutterContacts.getContacts(withProperties: true);\n    for (var contact in contacts) {\n      for (var phone in contact.phones) {\n        final normalizedPhone = phone.number.replaceAll(RegExp(r'[^\\d+]'), '');\n        final normalizedNumber = number.replaceAll(RegExp(r'[^\\d+]'), '');\n        if (normalizedPhone == normalizedNumber) {\n          return contact.displayName;\n        }\n      }\n    }\n    return null;\n  }\n\n  Future<void> _showFavoritesDialog() async {\n    final amountsController = TextEditingController();\n\n    await showDialog(\n      context: context,\n      barrierDismissible: false,\n      builder: (context) {\n        return Dialog(\n          shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(20),\n          ),\n          elevation: 4,\n          child: Container(\n            padding: const EdgeInsets.all(24),\n            decoration: BoxDecoration(\n              color: Theme.of(context).colorScheme.surface,\n              borderRadius: BorderRadius.circular(20),\n            ),\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Row(\n                  children: [\n                    Icon(\n                      Icons.monetization_on_rounded,\n                      color: Theme.of(context).colorScheme.primary,\n                      size: 28,\n                    ),\n                    const SizedBox(width: 12),\n                    Text(\n                      '\u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0627\u0644\u0645\u0641\u0636\u0644\u0629',\n                      style: Theme.of(context).textTheme.titleLarge?.copyWith(\n                        fontWeight: FontWeight.bold,\n                        fontFamily: tajawalFont,\n                      ),\n                    ),\n                  ],\n                ),\n                const SizedBox(height: 20),\n\n                if (_savedAmounts.isEmpty)\n                  Container(\n                    padding: const EdgeInsets.all(16),\n                    decoration: BoxDecoration(\n                      color: Theme.of(\n                        context,\n                      ).colorScheme.surfaceVariant.withOpacity(0.2),\n                      borderRadius: BorderRadius.circular(12),\n                    ),\n                    child: Text(\n                      '\u0623\u0636\u0641 \u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0627\u0644\u062a\u064a \u062a\u0631\u064a\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647\u0627 \u0628\u0634\u0643\u0644 \u0645\u062a\u0643\u0631\u0631',\n                      style: Theme.of(\n                        context,\n                      ).textTheme.bodyMedium?.copyWith(fontFamily: tajawalFont),\n                      textAlign: TextAlign.center,\n                    ),\n                  ),\n\n                if (_savedAmounts.isNotEmpty)\n                  Container(\n                    constraints: const BoxConstraints(maxHeight: 150),\n                    decoration: BoxDecoration(\n                      borderRadius: BorderRadius.circular(12),\n                      border: Border.all(\n                        color: Theme.of(\n                          context,\n                        ).colorScheme.outline.withOpacity(0.2),\n                      ),\n                    ),\n                    child: SingleChildScrollView(\n                      child: Wrap(\n                        spacing: 8,\n                        runSpacing: 8,\n                        children:\n                            _savedAmounts\n                                .map(\n                                  (amt) => Chip(\n                                    label: Text(\n                                      _formatWithThousandsSeparator(amt),\n                                      style: TextStyle(\n                                        fontFamily: tajawalFont,\n                                        fontWeight: FontWeight.w600,\n                                        color:\n                                            Theme.of(\n                                              context,\n                                            ).colorScheme.onPrimaryContainer,\n                                      ),\n                                    ),\n                                    backgroundColor:\n                                        Theme.of(\n                                          context,\n                                        ).colorScheme.primaryContainer,\n                                    deleteIcon: Icon(\n                                      Icons.close,\n                                      size: 18,\n                                      color:\n                                          Theme.of(\n                                            context,\n                                          ).colorScheme.onPrimaryContainer,\n                                    ),\n                                    onDeleted: () {\n                                      setState(() {\n                                        _savedAmounts.remove(amt);\n                                      });\n                                    },\n                                    shape: RoundedRectangleBorder(\n                                      borderRadius: BorderRadius.circular(8),\n                                    ),\n                                  ),\n                                )\n                                .toList(),\n                      ),\n                    ),\n                  ),\n\n                const SizedBox(height: 20),\n\n                TextField(\n                  controller: amountsController,\n                  keyboardType: TextInputType.number,\n                  inputFormatters: [ThousandsSeparatorInputFormatter()],\n                  decoration: InputDecoration(\n                    suffixIcon: IconButton(\n                      icon: Icon(\n                        Icons.add_circle,\n                        color: Theme.of(context).colorScheme.primary,\n                        size: 28,\n                      ),\n                      onPressed: () {\n                        final raw = amountsController.text.replaceAll(',', '');\n                        final numAmount = int.tryParse(raw);\n                        if (numAmount == null || numAmount <= 0) {\n                          _showSnackBar('\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0645\u0628\u0644\u063a \u0635\u062d\u064a\u062d \u0623\u0643\u0628\u0631 \u0645\u0646 \u0635\u0641\u0631');\n                          return;\n                        }\n                        if (_savedAmounts.contains(numAmount)) {\n                          _showSnackBar('\u0647\u0630\u0627 \u0627\u0644\u0645\u0628\u0644\u063a \u0645\u0648\u062c\u0648\u062f \u0628\u0627\u0644\u0641\u0639\u0644');\n                          return;\n                        }\n                        setState(() {\n                          _savedAmounts.add(numAmount);\n                          _savedAmounts.sort();\n                          amountsController.clear();\n                        });\n                      },\n                    ),\n                    filled: true,\n                    fillColor: Theme.of(\n                      context,\n                    ).colorScheme.surfaceVariant.withOpacity(0.1),\n                    border: OutlineInputBorder(\n                      borderRadius: BorderRadius.circular(12),\n                      borderSide: BorderSide.none,\n                    ),\n                  ),\n                  onSubmitted: (value) {\n                    final raw = value.replaceAll(',', '');\n                    final numAmount = int.tryParse(raw);\n                    if (numAmount == null || numAmount <= 0) {\n                      _showSnackBar('\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0645\u0628\u0644\u063a \u0635\u062d\u064a\u062d \u0623\u0643\u0628\u0631 \u0645\u0646 \u0635\u0641\u0631');\n                      return;\n                    }\n                    if (_savedAmounts.contains(numAmount)) {\n                      _showSnackBar('\u0647\u0630\u0627 \u0627\u0644\u0645\u0628\u0644\u063a \u0645\u0648\u062c\u0648\u062f \u0628\u0627\u0644\u0641\u0639\u0644');\n                      return;\n                    }\n                    setState(() {\n                      _savedAmounts.add(numAmount);\n                      _savedAmounts.sort();\n                      amountsController.clear();\n                    });\n                  },\n                ),\n\n                const SizedBox(height: 24),\n\n                Row(\n                  mainAxisAlignment: MainAxisAlignment.end,\n                  children: [\n                    TextButton(\n                      onPressed: () => Navigator.pop(context),\n                      style: TextButton.styleFrom(\n                        foregroundColor:\n                            Theme.of(context).colorScheme.onSurface,\n                      ),\n                      child: const Text(\n                        '\u062a\u062e\u0637\u064a',\n                        style: TextStyle(fontFamily: tajawalFont),\n                      ),\n                    ),\n                    const SizedBox(width: 12),\n                    ElevatedButton(\n                      onPressed: () async {\n                        if (_savedAmounts.isEmpty) {\n                          _showSnackBar('\u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u062f\u062e\u0627\u0644 \u0645\u0628\u0644\u063a \u0648\u0627\u062d\u062f \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644');\n                          return;\n                        }\n                        await _saveSavedAmounts();\n                        Navigator.pop(context);\n                      },\n                      style: ElevatedButton.styleFrom(\n                        backgroundColor: Theme.of(context).colorScheme.primary,\n                        foregroundColor:\n                            Theme.of(context).colorScheme.onPrimary,\n                        shape: RoundedRectangleBorder(\n                          borderRadius: BorderRadius.circular(12),\n                        ),\n                      ),\n                      child: const Text(\n                        '\u062d\u0641\u0638',\n                        style: TextStyle(fontFamily: tajawalFont),\n                      ),\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  Future<int?> _pickAmountDialog() async {\n    if (_savedAmounts.isEmpty) {\n      _showSnackBar('\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u0628\u0627\u0644\u063a \u0645\u062d\u0641\u0648\u0638\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0636\u0627\u0641\u062a\u0647\u0627 \u0641\u064a \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a.');\n      return null;\n    }\n    int? selectedAmount;\n\n    await showModalBottomSheet(\n      context: context,\n      builder: (context) {\n        return SafeArea(\n          child: Padding(\n            padding: const EdgeInsets.all(16),\n            child: Wrap(\n              spacing: 12,\n              children:\n                  _savedAmounts\n                      .map(\n                        (amount) => ChoiceChip(\n                          label: Text(\n                            _formatWithThousandsSeparator(amount),\n                            style: TextStyle(\n                              fontFamily: tajawalFont,\n                              fontWeight: FontWeight.w600,\n                              color:\n                                  selectedAmount == amount\n                                      ? Theme.of(context).colorScheme.onPrimary\n                                      : Theme.of(context).colorScheme.primary,\n                            ),\n                          ),\n                          selected: selectedAmount == amount,\n                          onSelected: (_) {\n                            selectedAmount = amount;\n                            Navigator.pop(context);\n                          },\n                        ),\n                      )\n                      .toList(),\n            ),\n          ),\n        );\n      },\n    );\n\n    return selectedAmount;\n  }\n\n  Future<void> _showSavedNumbersSelection() async {\n    final hasPermission = await _requestPermissions();\n    if (!hasPermission) return;\n\n    final contacts = await FlutterContacts.getContacts(\n      withProperties: true,\n      withThumbnail: false,\n    );\n    final selectedNumbers = List<String>.from(_savedNumbers);\n\n    final searchController = TextEditingController();\n    var searchQuery = '';\n\n    await showModalBottomSheet<void>(\n      context: context,\n      isScrollControlled: true,\n      backgroundColor: Colors.transparent,\n      builder: (context) {\n        return Directionality(\n          textDirection: TextDirection.rtl, // \u0647\u0630\u0627 \u0627\u0644\u0633\u0637\u0631 \u064a\u062c\u0639\u0644 \u0643\u0644 \u0627\u0644\u0645\u062d\u062a\u0648\u0649 RTL\n          child: StatefulBuilder(\n            builder: (context, setModal) {\n              final filteredContacts = _filterContacts(contacts, searchQuery);\n\n              return Container(\n                height: MediaQuery.of(context).size.height * 0.9,\n                decoration: BoxDecoration(\n                  color: Theme.of(context).colorScheme.surface,\n                  borderRadius: const BorderRadius.vertical(\n                    top: Radius.circular(24),\n                  ),\n                ),\n                padding: EdgeInsets.only(\n                  bottom: MediaQuery.of(context).viewInsets.bottom,\n                ),\n                child: Column(\n                  children: [\n                    // Header with search and title\n                    Padding(\n                      padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n                      child: Row(\n                        textDirection:\n                            TextDirection.rtl, // \u062a\u0623\u0643\u064a\u062f \u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u0646\u0635 \u0644\u0644\u0631\u0623\u0633\n                        children: [\n                          IconButton(\n                            icon: Icon(\n                              Icons.close_rounded,\n                              color: Theme.of(context).colorScheme.onSurface,\n                            ),\n                            onPressed: () => Navigator.pop(context),\n                            tooltip: '\u0625\u063a\u0644\u0627\u0642',\n                          ),\n                          const SizedBox(width: 5),\n                          Expanded(\n                            child: Padding(\n                              padding: const EdgeInsets.only(\n                                left: 30,\n                              ), // \u062a\u062d\u0631\u064a\u0643 \u0627\u0644\u0646\u0635 10 \u0628\u064a\u0643\u0633\u0644 \u0625\u0644\u0649 \u0627\u0644\u064a\u0645\u064a\u0646\n                              child: Text(\n                                '\u0627\u062e\u062a\u0631 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629',\n                                textAlign: TextAlign.center,\n                                style: Theme.of(\n                                  context,\n                                ).textTheme.titleLarge?.copyWith(\n                                  fontSize: 17,\n                                  fontFamily: tajawalFont,\n                                  fontWeight: FontWeight.bold,\n                                ),\n                              ),\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n\n                    // Search bar\n                    Padding(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: 16,\n                        vertical: 8,\n                      ),\n                      child: TextField(\n                        textAlign: TextAlign.right, // \u0645\u062d\u0627\u0630\u0627\u0629 \u0646\u0635 \u0627\u0644\u0628\u062d\u062b \u0644\u0644\u064a\u0645\u064a\u0646\n                        controller: searchController,\n                        decoration: InputDecoration(\n                          suffixIcon: const Icon(\n                            Icons.search,\n                          ), // \u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u0623\u064a\u0642\u0648\u0646\u0629 \u0644\u0644\u062c\u0627\u0646\u0628 \u0627\u0644\u0623\u064a\u0645\u0646\n                          hintText: '\u0627\u0628\u062d\u062b \u0641\u064a \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0623\u0648 \u0627\u0644\u0623\u0631\u0642\u0627\u0645',\n                          isDense: true,\n                          filled: true,\n                          fillColor: Colors.grey[100],\n                          border: OutlineInputBorder(\n                            borderRadius: BorderRadius.circular(50),\n                            borderSide: BorderSide.none,\n                          ),\n                          contentPadding: const EdgeInsets.symmetric(\n                            vertical: 12,\n                            horizontal: 16,\n                          ),\n                        ),\n                        onChanged: (value) {\n                          setModal(() {\n                            searchQuery = value.trim();\n                          });\n                        },\n                      ),\n                    ),\n\n                    const SizedBox(height: 8),\n\n                    // Contacts count\n                    Padding(\n                      padding: const EdgeInsets.symmetric(horizontal: 16),\n                      child: Row(\n                        textDirection: TextDirection.rtl,\n                        children: [\n                          Text(\n                            '${filteredContacts.length} \u062c\u0647\u0629 \u0627\u062a\u0635\u0627\u0644',\n                            style: Theme.of(\n                              context,\n                            ).textTheme.bodySmall?.copyWith(\n                              fontFamily: tajawalFont,\n                              color:\n                                  Theme.of(\n                                    context,\n                                  ).colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                          const Spacer(),\n                          Text(\n                            '${selectedNumbers.length} \u0645\u062e\u062a\u0627\u0631\u0629',\n                            style: Theme.of(\n                              context,\n                            ).textTheme.bodySmall?.copyWith(\n                              fontFamily: tajawalFont,\n                              color: Theme.of(context).colorScheme.primary,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n\n                    const Divider(height: 24, thickness: 1),\n\n                    // Contacts list\n                    Expanded(\n                      child:\n                          filteredContacts.isEmpty\n                              ? _buildEmptyState(context)\n                              : _buildContactsList(\n                                context,\n                                filteredContacts,\n                                selectedNumbers,\n                                setModal,\n                              ),\n                    ),\n\n                    // Bottom buttons\n                    _buildBottomButtons(context, selectedNumbers, setModal),\n                  ],\n                ),\n              );\n            },\n          ),\n        );\n      },\n    );\n  }\n\n  // \u062f\u0627\u0644\u0629 \u0645\u0633\u0627\u0639\u062f\u0629 \u0644\u062a\u0635\u0641\u064a\u0629 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644\n  List<Contact> _filterContacts(List<Contact> contacts, String query) {\n    if (query.isEmpty) return contacts;\n\n    return contacts.where((contact) {\n      final contactNameLower = contact.displayName.toLowerCase();\n      final queryLower = query.toLowerCase();\n\n      final phonesMatch = contact.phones.any(\n        (phone) => phone.number.toLowerCase().contains(queryLower),\n      );\n\n      return contactNameLower.contains(queryLower) || phonesMatch;\n    }).toList();\n  }\n\n  // \u0628\u0646\u0627\u0621 \u0648\u0627\u062c\u0647\u0629 \u0627\u0644\u062d\u0627\u0644\u0629 \u0627\u0644\u0641\u0627\u0631\u063a\u0629\n  Widget _buildEmptyState(BuildContext context) {\n    return Center(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Icon(\n            Icons.contact_phone_outlined,\n            size: 48,\n            color: Theme.of(context).colorScheme.outline,\n          ),\n          const SizedBox(height: 16),\n          Text(\n            '\u0644\u0627 \u062a\u0648\u062c\u062f \u062c\u0647\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u062a\u0637\u0627\u0628\u0642 \u0627\u0644\u0628\u062d\u062b',\n            textAlign: TextAlign.right,\n            style: Theme.of(context).textTheme.bodyMedium?.copyWith(\n              fontFamily: tajawalFont,\n              color: Theme.of(context).colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  // \u0628\u0646\u0627\u0621 \u0642\u0627\u0626\u0645\u0629 \u062c\u0647\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644\n  Widget _buildContactsList(\n    BuildContext context,\n    List<Contact> contacts,\n    List<String> selectedNumbers,\n    StateSetter setModal,\n  ) {\n    return ListView.separated(\n      keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,\n      physics: const ClampingScrollPhysics(),\n      itemCount: contacts.length,\n      separatorBuilder: (_, __) => const Divider(height: 1, indent: 72),\n      itemBuilder: (context, index) {\n        final contact = contacts[index];\n        final phones = contact.phones;\n\n        return Material(\n          color: Colors.transparent,\n          child: InkWell(\n            onTap:\n                () => _toggleContactSelection(\n                  phones.first.number,\n                  selectedNumbers,\n                  setModal,\n                ),\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),\n              child: Row(\n                textDirection: TextDirection.rtl, // \u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u0635\u0641 \u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0644\u0644\u064a\u0633\u0627\u0631\n                children: [\n                  // Contact avatar\n                  _buildContactAvatar(\n                    context,\n                    contact,\n                    selectedNumbers,\n                    phones,\n                  ),\n                  const SizedBox(width: 16),\n                  // Contact info\n                  _buildContactInfo(context, contact, phones),\n                ],\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  // \u0628\u0646\u0627\u0621 \u0635\u0648\u0631\u0629 \u062c\u0647\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644\n  Widget _buildContactAvatar(\n    BuildContext context,\n    Contact contact,\n    List<String> selectedNumbers,\n    List<Phone> phones,\n  ) {\n    return Stack(\n      children: [\n        CircleAvatar(\n          radius: 24,\n          backgroundImage:\n              (contact.thumbnail != null && contact.thumbnail!.isNotEmpty)\n                  ? ResizeImage(\n                    MemoryImage(contact.thumbnail!),\n                    width: 48,\n                    height: 48,\n                  )\n                  : null,\n          child:\n              (contact.thumbnail == null || contact.thumbnail!.isEmpty)\n                  ? Text(\n                    contact.initials(),\n                    style: const TextStyle(\n                      fontFamily: tajawalFont,\n                      fontWeight: FontWeight.bold,\n                      color: Colors.white,\n                      fontSize: 18,\n                    ),\n                  )\n                  : null,\n          backgroundColor: Theme.of(context).colorScheme.primary,\n        ),\n        if (_isContactSelected(phones, selectedNumbers))\n          Positioned(\n            left: 0, // \u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u0645\u0648\u0636\u0639 \u0644\u0644\u064a\u0633\u0627\u0631 \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646\n            bottom: 0,\n            child: Container(\n              padding: const EdgeInsets.all(4),\n              decoration: BoxDecoration(\n                color: Colors.green,\n                shape: BoxShape.circle,\n                border: Border.all(\n                  color: Theme.of(context).colorScheme.surface,\n                  width: 2,\n                ),\n              ),\n              child: const Icon(Icons.check, size: 14, color: Colors.white),\n            ),\n          ),\n      ],\n    );\n  }\n\n  // \u0628\u0646\u0627\u0621 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062c\u0647\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644\n  Widget _buildContactInfo(\n    BuildContext context,\n    Contact contact,\n    List<Phone> phones,\n  ) {\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start, // \u0645\u062d\u0627\u0630\u0627\u0629 \u0627\u0644\u0646\u0635 \u0644\u0644\u064a\u0645\u064a\u0646\n        children: [\n          Text(\n            contact.displayName,\n            textAlign: TextAlign.right,\n            style: const TextStyle(\n              fontFamily: tajawalFont,\n              fontSize: 16,\n              fontWeight: FontWeight.w600,\n            ),\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n          ),\n          const SizedBox(height: 4),\n          ...phones.map(\n            (phone) => Text(\n              phone.number,\n              textAlign: TextAlign.right,\n              style: TextStyle(\n                fontFamily: tajawalFont,\n                fontSize: 14,\n                color: Theme.of(context).colorScheme.onSurfaceVariant,\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  // \u0628\u0646\u0627\u0621 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0642\u0627\u0639\n  Widget _buildBottomButtons(\n    BuildContext context,\n    List<String> selectedNumbers,\n    StateSetter setModal,\n  ) {\n    return Container(\n      padding: const EdgeInsets.all(16),\n      decoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surface,\n        boxShadow: [\n          BoxShadow(\n            color: Colors.black.withOpacity(0.1),\n            blurRadius: 8,\n            offset: const Offset(0, -4),\n          ),\n        ],\n      ),\n      child: Row(\n        textDirection: TextDirection.ltr, // \u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u0635\u0641 \u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0644\u0644\u064a\u0633\u0627\u0631\n        children: [\n          Expanded(\n            child: OutlinedButton(\n              style: OutlinedButton.styleFrom(\n                padding: const EdgeInsets.symmetric(vertical: 16),\n                shape: RoundedRectangleBorder(\n                  borderRadius: BorderRadius.circular(12),\n                ),\n              ),\n              onPressed: () => Navigator.pop(context),\n              child: const Text(\n                '\u0625\u0644\u063a\u0627\u0621',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n          ),\n          const SizedBox(width: 12),\n          Expanded(\n            child: FilledButton(\n              style: FilledButton.styleFrom(\n                padding: const EdgeInsets.symmetric(vertical: 16),\n                shape: RoundedRectangleBorder(\n                  borderRadius: BorderRadius.circular(12),\n                ),\n                backgroundColor: Theme.of(context).colorScheme.primary,\n              ),\n              onPressed: () async {\n                _savedNumbers = List.from(selectedNumbers);\n                await _saveSavedNumbers();\n                if (!mounted) return;\n                setState(() {});\n                Navigator.pop(context);\n                _showSnackBar('\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631\u0629');\n              },\n              child: const Text(\n                '\u062a\u0623\u0643\u064a\u062f',\n                style: TextStyle(\n                  fontFamily: tajawalFont,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  // \u062a\u0628\u062f\u064a\u0644 \u0627\u062e\u062a\u064a\u0627\u0631 \u062c\u0647\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644\n  void _toggleContactSelection(\n    String phoneNumber,\n    List<String> selectedNumbers,\n    StateSetter setModal,\n  ) {\n    final normalized = phoneNumber.replaceAll(RegExp(r'[^\\d+]'), '');\n\n    setModal(() {\n      if (selectedNumbers.any((num) {\n        final n = num.replaceAll(RegExp(r'[^\\d+]'), '');\n        return n == normalized;\n      })) {\n        selectedNumbers.removeWhere((num) {\n          final n = num.replaceAll(RegExp(r'[^\\d+]'), '');\n          return n == normalized;\n        });\n      } else {\n        selectedNumbers.add(normalized);\n      }\n    });\n  }\n\n  // \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u062c\u0647\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0645\u062e\u062a\u0627\u0631\u0629\n  bool _isContactSelected(List<Phone> phones, List<String> selectedNumbers) {\n    return phones.any((phone) {\n      final normalized = phone.number.replaceAll(RegExp(r'[^\\d+]'), '');\n      return selectedNumbers.any((num) {\n        final n = num.replaceAll(RegExp(r'[^\\d+]'), '');\n        return n == normalized;\n      });\n    });\n  }\n\n  Future<void> _showBatchAmountAssignmentDialog(List<String> numbers) async {\n    if (numbers.isEmpty) {\n      _showSnackBar('\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0644\u062a\u062d\u062f\u064a\u062b\u0647\u0627');\n      return;\n    }\n    if (_savedAmounts.isEmpty) {\n      _showSnackBar('\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u0628\u0627\u0644\u063a \u0645\u062d\u0641\u0648\u0638\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u0636\u0627\u0641\u062a\u0647\u0627 \u0641\u064a \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a.');\n      return;\n    }\n\n    List<NumberAmount> tempList = [];\n    for (var number in numbers) {\n      String? name = await _getContactNameFromNumber(number);\n      final existing = _transferList.firstWhere(\n        (element) => element.number == number,\n        orElse: () => TransferItem(number: number, amount: 0),\n      );\n      tempList.add(\n        NumberAmount(\n          number: number,\n          displayName: name,\n          amount: existing.amount > 0 ? existing.amount : 0,\n        ),\n      );\n    }\n\n    final formKey = GlobalKey<FormState>();\n\n    await showDialog(\n      context: context,\n      builder: (context) {\n        return AlertDialog(\n          title: const Text(\n            '\u062a\u0639\u064a\u064a\u0646 \u0645\u0628\u0644\u063a \u0644\u0643\u0644 \u0631\u0642\u0645',\n            style: TextStyle(fontFamily: tajawalFont),\n          ),\n          content: StatefulBuilder(\n            builder: (context, setDialogState) {\n              return Form(\n                key: formKey,\n                child: SizedBox(\n                  width: double.maxFinite,\n                  child: ListView.separated(\n                    shrinkWrap: true,\n                    physics: const ClampingScrollPhysics(),\n                    separatorBuilder: (_, __) => const SizedBox(height: 16),\n                    itemCount: tempList.length,\n                    itemBuilder: (context, index) {\n                      final item = tempList[index];\n                      return Column(\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: [\n                          Text(\n                            item.displayName ?? item.number,\n                            style: const TextStyle(\n                              fontFamily: tajawalFont,\n                              fontWeight: FontWeight.w600,\n                              fontSize: 16,\n                            ),\n                            overflow: TextOverflow.ellipsis,\n                          ),\n                          const SizedBox(height: 8),\n                          DropdownButtonFormField<int>(\n                            decoration: const InputDecoration(\n                              labelText: '\u0627\u0644\u0645\u0628\u0644\u063a',\n                              isDense: true,\n                            ),\n                            items:\n                                _savedAmounts\n                                    .map(\n                                      (e) => DropdownMenuItem(\n                                        value: e,\n                                        child: Text(\n                                          _formatWithThousandsSeparator(e),\n                                          style: const TextStyle(\n                                            fontFamily: tajawalFont,\n                                            fontWeight: FontWeight.w600,\n                                          ),\n                                        ),\n                                      ),\n                                    )\n                                    .toList(),\n                            value: item.amount > 0 ? item.amount : null,\n                            onChanged: (val) {\n                              setDialogState(() {\n                                item.amount = val ?? 0;\n                              });\n                            },\n                            validator: (val) {\n                              if (val == null || val <= 0) {\n                                return '\u064a\u0631\u062c\u0649 \u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0628\u0644\u063a \u0635\u0627\u0644\u062d';\n                              }\n                              return null;\n                            },\n                            isExpanded: true,\n                          ),\n                        ],\n                      );\n                    },\n                  ),\n                ),\n              );\n            },\n          ),\n          actions: [\n            TextButton(\n              onPressed: () => Navigator.pop(context),\n              child: const Text(\n                '\u0625\u0644\u063a\u0627\u0621',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n            FilledButton(\n              onPressed: () async {\n                if (!formKey.currentState!.validate()) {\n                  _showSnackBar('\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0628\u0634\u0643\u0644 \u0635\u062d\u064a\u062d');\n                  return;\n                }\n                for (var item in tempList) {\n                  if (!_transferList.any((e) => e.number == item.number)) {\n                    String? pinForCurrentMethod = _getPinForMethod(\n                      _selectedMethod,\n                    );\n                    _transferList.add(\n                      TransferItem(\n                        number: item.number,\n                        amount: item.amount,\n                        pin:\n                            (_selectedMethod == 'yemenMobile' ||\n                                    _selectedMethod == 'sabafon')\n                                ? ''\n                                : null,\n                      ),\n                    );\n                  } else {\n                    final existingIndex = _transferList.indexWhere(\n                      (e) => e.number == item.number,\n                    );\n                    if (existingIndex != -1) {\n                      _transferList[existingIndex].amount = item.amount;\n                      if (_selectedMethod == 'yemenMobile' ||\n                          _selectedMethod == 'sabafon') {\n                        _transferList[existingIndex].pin ??= '';\n                      } else {\n                        _transferList[existingIndex].pin = null;\n                      }\n                    }\n                  }\n                }\n                await _saveTransferList();\n                setState(() {});\n                Navigator.pop(context);\n                _showSnackBar('\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 \u0628\u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0627\u0644\u0645\u062d\u062f\u062f\u0629');\n              },\n              child: const Text(\n                '\u062d\u0641\u0638',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  String _formatWithThousandsSeparator(int value) {\n    final s = value.toString();\n    final buffer = StringBuffer();\n    int len = s.length;\n    for (int i = 0; i < len; i++) {\n      buffer.write(s[i]);\n      int posFromRight = len - i - 1;\n      if (posFromRight % 3 == 0 && i != len - 1) {\n        buffer.write(',');\n      }\n    }\n    return buffer.toString();\n  }\n\n  // **\u0627\u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0631\u0626\u064a\u0633\u064a: \u0627\u0633\u062a\u062e\u062f\u0627\u0645 flutter_phone_direct_caller \u0644\u0644\u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a**\n  Future<void> _startTransferSequence() async {\n    if (_transferList.isEmpty) {\n      _showSnackBar(\"\u0644\u0627\u062a\u0648\u062c\u062f \u0639\u0645\u0644\u064a\u0627\u062a \u0644\u0644\u062a\u062d\u0648\u064a\u0644\");\n      return;\n    }\n\n    if (_selectedMethod == 'yemenMobile' || _selectedMethod == 'sabafon') {\n      String? savedPin = _getPinForMethod(_selectedMethod);\n\n      if (savedPin == null || savedPin.isEmpty) {\n        String? pin = await _askForPin(_selectedMethod);\n        if (pin == null || pin.isEmpty) {\n          _showSnackBar('\u0627\u0644\u0631\u062c\u0627\u0621 \u0625\u062f\u062e\u0627\u0644 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a \u0644\u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u062a\u062d\u0648\u064a\u0644');\n          setState(() {\n            _isTransferring = false;\n          });\n          return;\n        }\n        savedPin = pin;\n        await _savePinForMethod(_selectedMethod, pin);\n      }\n\n      // \u062a\u062d\u062f\u064a\u062b \u062c\u0645\u064a\u0639 \u0627\u0644\u0639\u0645\u0644\u064a\u0627\u062a \u0628\u0642\u064a\u0645\u0629 PIN\n      setState(() {\n        for (var item in _transferList) {\n          item.pin = savedPin;\n        }\n      });\n    }\n\n    int totalAmount = _transferList.fold(0, (sum, item) => sum + item.amount);\n    if (totalAmount > _currentBalance) {\n      _showSnackBar(\n        \"\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a (${_formatWithThousandsSeparator(_currentBalance)}) \u063a\u064a\u0631 \u0643\u0627\u0641\u064d \u0644\u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a (\u0627\u0644\u0645\u062c\u0645\u0648\u0639: ${_formatWithThousandsSeparator(totalAmount)})\",\n      );\n      return;\n    }\n\n    // \u0637\u0644\u0628 \u0625\u0630\u0646 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 CALL_PHONE\n    if (!await Permission.phone.isGranted) {\n      final status = await Permission.phone.request();\n      if (!status.isGranted) {\n        _showSnackBar(\"\u064a\u062c\u0628 \u0645\u0646\u062d \u0625\u0630\u0646 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0644\u0625\u062c\u0631\u0627\u0621 \u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0631\u0635\u064a\u062f\");\n        return;\n      }\n    }\n\n    final phonePermissionStatus = await Permission.phone.status;\n    if (!phonePermissionStatus.isGranted) {\n      final status = await Permission.phone.request();\n      if (!status.isGranted) {\n        _showSnackBar(\"\u064a\u062c\u0628 \u0645\u0646\u062d \u0625\u0630\u0646 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0644\u0625\u062c\u0631\u0627\u0621 \u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0631\u0635\u064a\u062f\");\n        return;\n      }\n    }\n\n    setState(() {\n      _isTransferring = true;\n      _stopTransferRequested = false;\n    });\n    await _fabAnimationController.forward().orCancel;\n\n    _transferLogs.clear();\n\n    List<TransferItem> tempTransferList = List.from(_transferList);\n    List<String> successfullyTransferredNumbers = [];\n\n    for (var i = 0; i < tempTransferList.length; i++) {\n      if (_stopTransferRequested) {\n        _showSnackBar(\"\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\");\n        break;\n      }\n\n      var item = tempTransferList[i];\n      String ussdCode = _buildUssdCode(item);\n\n      _showSnackBar(\n        '\u062c\u0627\u0631\u064a \u062a\u062d\u0648\u064a\u0644 ${_getMethodName(_selectedMethod)}: ${_formatWithThousandsSeparator(item.amount)} \u0625\u0644\u0649 ${item.number} (${i + 1}/${tempTransferList.length})',\n      );\n\n      try {\n        debugPrint(\"Calling USSD code: $ussdCode\");\n        bool? called = await FlutterPhoneDirectCaller.callNumber(ussdCode);\n        if (called == true) {\n          await _addTransferLog({\n            'number': item.number,\n            'amount': item.amount,\n            'success': true,\n            'method': _selectedMethod,\n            'timestamp': DateTime.now().toIso8601String(),\n          });\n          successfullyTransferredNumbers.add(item.number);\n\n          setState(() {\n            _currentBalance -= item.amount;\n          });\n          await _saveCurrentBalance();\n\n          await Future.delayed(const Duration(seconds: 10));\n        } else {\n          await _addTransferLog({\n            'number': item.number,\n            'amount': item.amount,\n            'success': true,\n            'method': _selectedMethod,\n            'timestamp': DateTime.now().toIso8601String(),\n          });\n        }\n      } catch (e) {\n        await _addTransferLog({\n          'number': item.number,\n          'amount': item.amount,\n          'success': true,\n          'method': _selectedMethod,\n          'timestamp': DateTime.now().toIso8601String(),\n        });\n      }\n    }\n\n    setState(() {\n      for (var number in successfullyTransferredNumbers) {\n        _transferList.removeWhere((t) => t.number == number);\n        _savedNumbers.removeWhere(\n          (num) => _normalizeNumber(num) == _normalizeNumber(number),\n        );\n        if (_selectedQuickNumber == number) _selectedQuickNumber = null;\n      }\n    });\n\n    await _saveTransferList();\n    await _saveSavedNumbers();\n\n    setState(() {\n      _isTransferring = false;\n    });\n    await _fabAnimationController.reverse().orCancel;\n\n    if (!_stopTransferRequested) {\n      _showSnackBar(\"\u062a\u0645\u062a \u062c\u0645\u064a\u0639 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062a\u062d\u0648\u064a\u0644\");\n    }\n    _fabAnimationController.value = 1;\n  }\n\n  String _normalizeNumber(String number) {\n    return number.replaceAll(RegExp(r'[^\\d+]'), '');\n  }\n\n  String _getMethodName(String method) {\n    switch (method) {\n      case 'yemenMobile':\n        return '\u064a\u0645\u0646 \u0645\u0648\u0628\u0627\u064a\u0644';\n      case 'y':\n        return '\u0648\u0627\u064a';\n      case 'sabafon':\n        return '\u0633\u0628\u0623\u0641\u0648\u0646';\n      case 'you':\n        return '\u064a\u0648';\n      default:\n        return method;\n    }\n  }\n\n  String _buildUssdCode(TransferItem item) {\n    final number = item.number;\n    final amount = item.amount.toString();\n    final pin = item.pin ?? '';\n\n    String code = '';\n\n    switch (_selectedMethod) {\n      case 'yemenMobile':\n        if (pin.isEmpty) {\n          // \u0625\u0630\u0627 PIN \u0641\u0627\u0631\u063a\u060c \u0631\u0645\u0632 \u0628\u062f\u0648\u0646 PIN\n          code = '*888*$amount*$number#';\n        } else {\n          code = '*888*$amount*$number*$pin#';\n        }\n        break;\n      case 'sabafon':\n        if (pin.isEmpty) {\n          code = '*123*$number*$amount#';\n        } else {\n          code = '*123*$pin*$number*$amount#';\n        }\n        break;\n      case 'y':\n        code = '*109*$amount*$number#';\n        break;\n      case 'you':\n        code = '*130*$number*$amount#';\n        break;\n      default:\n        code = '';\n    }\n\n    return code.replaceAll('#', Uri.encodeComponent('#'));\n  }\n\n  void _showTransferLogsDialog() {\n    showDialog(\n      context: context,\n      builder: (context) {\n        return AlertDialog(\n          title: const Text(\n            '\u0633\u062c\u0644 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062a\u062d\u0648\u064a\u0644',\n            textAlign: TextAlign.right,\n            style: TextStyle(fontFamily: tajawalFont),\n          ),\n\n          content: SizedBox(\n            width: double.maxFinite,\n            child:\n                _transferLogs.isEmpty\n                    ? Center(\n                      child: Text(\n                        '\u0644\u0627 \u062a\u0648\u062c\u062f \u0639\u0645\u0644\u064a\u0627\u062a \u062a\u062d\u0648\u064a\u0644 \u062d\u062a\u0649 \u0627\u0644\u0622\u0646',\n                        style: Theme.of(context).textTheme.bodyMedium?.copyWith(\n                          fontFamily: tajawalFont,\n                          color: Theme.of(context).colorScheme.onSurfaceVariant,\n                        ),\n                      ),\n                    )\n                    : Directionality(\n                      textDirection: TextDirection.rtl,\n                      child: ListView.builder(\n                        shrinkWrap: true,\n                        physics: const ClampingScrollPhysics(),\n                        itemCount: _transferLogs.length,\n                        itemBuilder: (_, i) {\n                          final log = _transferLogs[i];\n                          final success = log['success'] as bool;\n                          final timestamp =\n                              log['timestamp'] != null\n                                  ? DateTime.parse(log['timestamp'])\n                                  : null;\n                          final timeFormatted =\n                              timestamp != null\n                                  ? '${timestamp.year}-${timestamp.month.toString().padLeft(2, '0')}-${timestamp.day.toString().padLeft(2, '0')} ${timestamp.hour.toString().padLeft(2, '0')}:${timestamp.minute.toString().padLeft(2, '0')}'\n                                  : '';\n\n                          return ListTile(\n                            contentPadding: EdgeInsets.zero,\n                            leading: Container(\n                              width: 36,\n                              height: 36,\n                              decoration: BoxDecoration(\n                                color:\n                                    success\n                                        ? Theme.of(\n                                          context,\n                                        ).colorScheme.primaryContainer\n                                        : Theme.of(\n                                          context,\n                                        ).colorScheme.errorContainer,\n                                shape: BoxShape.circle,\n                              ),\n                              child: Icon(\n                                success ? Icons.check : Icons.close,\n                                color:\n                                    success\n                                        ? Theme.of(context).colorScheme.primary\n                                        : Theme.of(context).colorScheme.error,\n                              ),\n                            ),\n                            title: Text(\n                              '${_getMethodName(log['method'])} - ${log['number']}',\n                              style: const TextStyle(\n                                fontWeight: FontWeight.w600,\n                                fontFamily: tajawalFont,\n                              ),\n                            ),\n                            subtitle: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(\n                                  '\u0627\u0644\u0645\u0628\u0644\u063a: ${_formatWithThousandsSeparator(log['amount'] ?? 0)}',\n                                  style: TextStyle(fontFamily: tajawalFont),\n                                ),\n                                if (timeFormatted.isNotEmpty)\n                                  Text(\n                                    '\u0627\u0644\u0648\u0642\u062a: $timeFormatted',\n                                    style: const TextStyle(\n                                      fontFamily: tajawalFont,\n                                      fontSize: 12,\n                                      color: Colors.grey,\n                                    ),\n                                  ),\n                                if (log['error'] != null)\n                                  Text(\n                                    '\u062e\u0637\u0623: ${log['error']}',\n                                    style: const TextStyle(\n                                      fontFamily: tajawalFont,\n                                      fontSize: 12,\n                                      color: Colors.red,\n                                    ),\n                                  ),\n                              ],\n                            ),\n                            trailing: IconButton(\n                              icon: Icon(\n                                Icons.delete_forever_rounded,\n                                color: Theme.of(context).colorScheme.error,\n                              ),\n                              tooltip: '\u062d\u0630\u0641 \u0627\u0644\u0633\u062c\u0644',\n                              onPressed: () {\n                                _removeTransferLog(i);\n                                Navigator.pop(context);\n                                Future.delayed(\n                                  Duration(milliseconds: 100),\n                                  _showTransferLogsDialog,\n                                );\n                              },\n                            ),\n                          );\n                        },\n                      ),\n                    ),\n          ),\n          actions: [\n            TextButton(\n              onPressed: () => Navigator.pop(context),\n              child: const Text(\n                '\u0625\u063a\u0644\u0627\u0642',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n            TextButton(\n              onPressed: () {\n                setState(() {\n                  _transferLogs.clear();\n                });\n                _saveTransferHistory();\n                Navigator.pop(context);\n                _showSnackBar('\u062a\u0645 \u062d\u0630\u0641 \u062c\u0645\u064a\u0639 \u0633\u062c\u0644\u0627\u062a \u0627\u0644\u062a\u062d\u0648\u064a\u0644');\n              },\n              child: const Text(\n                '\u062d\u0630\u0641 \u0627\u0644\u0643\u0644',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  void _showAmountsManagementDialog() async {\n    final amountsController = TextEditingController();\n    bool isValidInput(String value) {\n      final raw = value.replaceAll(',', '');\n      final numAmount = int.tryParse(raw);\n      return numAmount != null &&\n          numAmount > 0 &&\n          !_savedAmounts.contains(numAmount);\n    }\n\n    void addAmount(\n      String value,\n      void Function(void Function()) setDialogState,\n    ) {\n      final raw = value.replaceAll(',', '');\n      final numAmount = int.tryParse(raw);\n      if (numAmount == null || numAmount <= 0) {\n        _showSnackBar('\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0645\u0628\u0644\u063a \u0635\u062d\u064a\u062d \u0623\u0643\u0628\u0631 \u0645\u0646 \u0635\u0641\u0631');\n        return;\n      }\n      if (_savedAmounts.contains(numAmount)) {\n        _showSnackBar('\u0647\u0630\u0627 \u0627\u0644\u0645\u0628\u0644\u063a \u0645\u0648\u062c\u0648\u062f \u0628\u0627\u0644\u0641\u0639\u0644');\n        return;\n      }\n      setDialogState(() {\n        _savedAmounts.add(numAmount);\n        _savedAmounts.sort();\n        amountsController.clear();\n      });\n    }\n\n    await showDialog(\n      context: context,\n      builder: (context) {\n        return AlertDialog(\n          title: const Text(\n            '\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629',\n            style: TextStyle(fontFamily: tajawalFont),\n            textAlign: TextAlign.center,\n          ),\n          content: StatefulBuilder(\n            builder: (context, setDialogState) {\n              return SizedBox(\n                width: double.maxFinite,\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    if (_savedAmounts.isEmpty)\n                      Padding(\n                        padding: const EdgeInsets.symmetric(vertical: 12),\n                        child: Text(\n                          '\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u0628\u0627\u0644\u063a \u0645\u062d\u0641\u0648\u0638\u0629 \u062d\u0627\u0644\u064a\u0627\u064b',\n                          style: Theme.of(\n                            context,\n                          ).textTheme.bodyMedium?.copyWith(\n                            fontFamily: tajawalFont,\n                            color:\n                                Theme.of(context).colorScheme.onSurfaceVariant,\n                          ),\n                        ),\n                      ),\n                    if (_savedAmounts.isNotEmpty)\n                      Container(\n                        constraints: BoxConstraints(maxHeight: 150),\n                        child: SingleChildScrollView(\n                          child: Wrap(\n                            spacing: 8,\n                            runSpacing: 6,\n                            children:\n                                _savedAmounts\n                                    .map(\n                                      (amt) => Tooltip(\n                                        message: '\u062d\u0630\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0628\u0644\u063a',\n                                        child: Chip(\n                                          label: Text(\n                                            _formatWithThousandsSeparator(amt),\n                                            style: const TextStyle(\n                                              fontFamily: tajawalFont,\n                                              fontWeight: FontWeight.w600,\n                                            ),\n                                          ),\n                                          backgroundColor:\n                                              Theme.of(\n                                                context,\n                                              ).colorScheme.primaryContainer,\n                                          shape: RoundedRectangleBorder(\n                                            borderRadius: BorderRadius.circular(\n                                              20,\n                                            ),\n                                          ),\n                                          onDeleted: () {\n                                            setDialogState(() {\n                                              _savedAmounts.remove(amt);\n                                            });\n                                          },\n                                          deleteIconColor:\n                                              Theme.of(\n                                                context,\n                                              ).colorScheme.error,\n                                        ),\n                                      ),\n                                    )\n                                    .toList(),\n                          ),\n                        ),\n                      ),\n                    const Divider(height: 25, thickness: 1),\n                    TextField(\n                      controller: amountsController,\n                      keyboardType: TextInputType.number,\n                      inputFormatters: [ThousandsSeparatorInputFormatter()],\n                      decoration: InputDecoration(\n                        labelText: '\u0625\u0636\u0627\u0641\u0629 \u0645\u0628\u0644\u063a \u062c\u062f\u064a\u062f',\n                        suffixIcon: IconButton(\n                          icon: const Icon(Icons.add_circle_rounded),\n                          tooltip: '\u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0645\u0628\u0644\u063a',\n                          onPressed:\n                              isValidInput(amountsController.text)\n                                  ? () => addAmount(\n                                    amountsController.text,\n                                    setDialogState,\n                                  )\n                                  : null,\n                        ),\n                      ),\n                      onChanged: (value) {\n                        setDialogState(() {}); // \u0644\u062a\u062d\u062f\u064a\u062b \u0632\u0631 \u0627\u0644\u0625\u0636\u0627\u0641\u0629\n                      },\n                      onSubmitted: (value) {\n                        addAmount(value, setDialogState);\n                      },\n                    ),\n                  ],\n                ),\n              );\n            },\n          ),\n          actionsAlignment: MainAxisAlignment.spaceBetween,\n          actions: [\n            TextButton(\n              onPressed: () => Navigator.pop(context),\n              child: const Text(\n                '\u0625\u063a\u0644\u0627\u0642',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n            FilledButton.tonal(\n              onPressed: () async {\n                await _saveSavedAmounts();\n                Navigator.pop(context);\n                _showSnackBar('\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0628\u0646\u062c\u0627\u062d');\n              },\n              child: const Text(\n                '\u062d\u0641\u0638',\n                style: TextStyle(fontFamily: tajawalFont),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  void _stopTransferSequence() {\n    if (_isTransferring) {\n      setState(() {\n        _stopTransferRequested = true;\n      });\n      _showSnackBar(\"\u062a\u0645 \u0637\u0644\u0628 \u0625\u064a\u0642\u0627\u0641 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\");\n    }\n  }\n\n  Widget _buildCurrentTransferMethodSection() {\n    final methodNames = {\n      'yemenMobile': '\u064a\u0645\u0646 \u0645\u0648\u0628\u0627\u064a\u0644',\n      'y': '\u0648\u0627\u064a',\n      'sabafon': '\u0633\u0628\u0623\u0641\u0648\u0646',\n      'you': '\u064a\u0648',\n    };\n\n    final methodIcons = {\n      'yemenMobile': Icons.sim_card,\n      'y': Icons.sim_card,\n      'sabafon': Icons.sim_card,\n      'you': Icons.sim_card,\n    };\n\n    final methodName = methodNames[_selectedMethod] ?? _selectedMethod;\n    final methodIcon = methodIcons[_selectedMethod] ?? Icons.sync;\n\n    return Card(\n      margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n      child: Padding(\n        padding: const EdgeInsets.all(16),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Row(\n              mainAxisAlignment: MainAxisAlignment.spaceBetween,\n              children: [\n                Icon(\n                  Icons.swap_horiz,\n                  color: Theme.of(context).colorScheme.primary,\n                ),\n                const SizedBox(width: 12),\n                Text(\n                  '\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u062d\u0627\u0644\u064a\u0629',\n                  style: Theme.of(context).textTheme.titleLarge?.copyWith(\n                    fontFamily: tajawalFont,\n                    fontWeight: FontWeight.bold,\n                  ),\n                ),\n              ],\n            ),\n            const SizedBox(height: 16),\n            Row(\n              children: [\n                Container(\n                  decoration: BoxDecoration(\n                    color: Colors.lightBlue[50],\n                    borderRadius: BorderRadius.circular(12),\n                  ),\n                  padding: const EdgeInsets.all(12),\n                  child: Icon(\n                    methodIcon,\n                    size: 40,\n                    color: Theme.of(context).colorScheme.primary,\n                  ),\n                ),\n                const SizedBox(width: 16),\n                Expanded(\n                  child: Text(\n                    methodName,\n                    style: Theme.of(context).textTheme.headlineSmall?.copyWith(\n                      fontFamily: tajawalFont,\n                      fontWeight: FontWeight.bold,\n                      color: Theme.of(context).colorScheme.primary,\n                    ),\n                  ),\n                ),\n                FilledButton.tonal(\n                  onPressed: () async {\n                    final selected = await showDialog<String>(\n                      context: context,\n                      builder: (context) {\n                        return SimpleDialog(\n                          title: const Text(\n                            '\u0627\u062e\u062a\u0631 \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644',\n                            style: TextStyle(fontFamily: tajawalFont),\n                          ),\n                          children:\n                              methodNames.entries.map((entry) {\n                                final isSelected = entry.key == _selectedMethod;\n                                return SimpleDialogOption(\n                                  onPressed:\n                                      () => Navigator.pop(context, entry.key),\n                                  child: Row(\n                                    children: [\n                                      Icon(\n                                        methodIcons[entry.key],\n                                        color:\n                                            isSelected\n                                                ? Theme.of(\n                                                  context,\n                                                ).colorScheme.primary\n                                                : Theme.of(\n                                                  context,\n                                                ).colorScheme.onSurfaceVariant,\n                                      ),\n                                      const SizedBox(width: 12),\n                                      Text(\n                                        entry.value,\n                                        style: TextStyle(\n                                          fontFamily: tajawalFont,\n                                        ),\n                                      ),\n                                      if (isSelected)\n                                        const Padding(\n                                          padding: EdgeInsets.only(left: 12),\n                                          child: Icon(Icons.check),\n                                        ),\n                                    ],\n                                  ),\n                                );\n                              }).toList(),\n                        );\n                      },\n                    );\n                    if (selected != null && selected != _selectedMethod) {\n                      if (selected == 'yemenMobile' || selected == 'sabafon') {\n                        String? savedPin = _getPinForMethod(selected);\n                        if (savedPin == null) {\n                          // \u0627\u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0625\u062f\u062e\u0627\u0644 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a \u0642\u0628\u0644 \u0627\u0644\u062a\u0628\u062f\u064a\u0644\n                          String? pin = await _askForPin(selected);\n                          if (pin == null) {\n                            // \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u063a\u0649 \u0627\u0644\u0625\u062f\u062e\u0627\u0644 \u0641\u0644\u0627 \u062a\u063a\u064a\u0631 \u0627\u0644\u0637\u0631\u064a\u0642\u0629\n                            return;\n                          }\n                          await _savePinForMethod(selected, pin);\n                          savedPin = pin;\n                        }\n\n                        setState(() {\n                          _selectedMethod = selected;\n\n                          for (var item in _transferList) {\n                            item.pin = savedPin;\n                          }\n                        });\n                        await _saveSelectedMethod();\n                      } else {\n                        // \u0637\u0631\u0642 \u0644\u0627 \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u0631\u0642\u0645 \u0633\u0631\u064a\n                        setState(() {\n                          _selectedMethod = selected;\n                          for (var item in _transferList) {\n                            item.pin = null;\n                          }\n                        });\n                        await _saveSelectedMethod();\n                      }\n                      _showSnackBar(\n                        '\u062a\u0645 \u062a\u063a\u064a\u064a\u0631 \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 \u0625\u0644\u0649 ${methodNames[selected]}',\n                      );\n                    }\n                  },\n                  child: const Text(\n                    '\u062a\u063a\u064a\u064a\u0631',\n                    style: TextStyle(fontFamily: tajawalFont),\n                  ),\n                ),\n              ],\n            ),\n            const SizedBox(height: 8),\n            Row(\n              mainAxisAlignment: MainAxisAlignment.end,\n              children: [\n                Text(\n                  '\u0622\u0644\u064a\u0629 \u0644\u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0631\u0635\u064a\u062f \u062f\u0641\u0639\u0629 \u0648\u0627\u062d\u062f\u0629.',\n                  textDirection: TextDirection.rtl,\n                  style: Theme.of(\n                    context,\n                  ).textTheme.bodySmall?.copyWith(fontFamily: tajawalFont),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget fabChild =\n        _isTransferring\n            ? Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                SizedBox(\n                  width: 20,\n                  height: 20,\n                  child: CircularProgressIndicator(\n                    color: Theme.of(context).colorScheme.onPrimary,\n                    strokeWidth: 3,\n                  ),\n                ),\n                const SizedBox(width: 8),\n                const Text(\n                  '\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u062a\u062d\u0648\u064a\u0644',\n                  style: TextStyle(\n                    fontWeight: FontWeight.bold,\n                    fontFamily: tajawalFont,\n                  ),\n                ),\n              ],\n            )\n            : Row(\n              mainAxisSize: MainAxisSize.min,\n              children: const [\n                SizedBox(width: 8),\n                Text(\n                  '\u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a',\n                  style: TextStyle(\n                    fontWeight: FontWeight.bold,\n                    fontFamily: tajawalFont,\n                  ),\n                ),\n              ],\n            );\n\n    return Scaffold(\n      appBar: AppBar(\n        toolbarHeight: 100,\n        title: Row(\n          children: [\n            const SizedBox(width: 12),\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Text(\n                    '\u062a\u062d\u0648\u064a\u0644 \u0630\u0643\u064a',\n                    style: TextStyle(\n                      fontSize: 20,\n                      fontWeight: FontWeight.bold,\n                      fontFamily: tajawalFont,\n                    ),\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                  const SizedBox(height: 8),\n                  Container(\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 10,\n                      vertical: 6,\n                    ),\n                    decoration: BoxDecoration(\n                      color: lightColorScheme.surface.withOpacity(0.9),\n                      borderRadius: BorderRadius.circular(12),\n                      boxShadow: [\n                        BoxShadow(\n                          color: Colors.black.withOpacity(0.1),\n                          blurRadius: 8,\n                          offset: const Offset(0, 2),\n                        ),\n                      ],\n                      gradient: LinearGradient(\n                        colors: [\n                          lightColorScheme.surfaceVariant.withOpacity(0.7),\n                          lightColorScheme.surfaceVariant.withOpacity(0.4),\n                        ],\n                        begin: Alignment.topLeft,\n                        end: Alignment.bottomRight,\n                      ),\n                    ),\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Icon(\n                          Icons.account_balance_wallet_rounded,\n                          size: 20,\n                          color: lightColorScheme.primary,\n                        ),\n                        const SizedBox(width: 5),\n\n                        Container(\n                          padding: const EdgeInsets.only(top: 5.5),\n                          child: Row(\n                            mainAxisSize: MainAxisSize.min,\n                            textDirection: TextDirection.rtl,\n                            children: [\n                              Text(\n                                textDirection: TextDirection.rtl,\n                                '\u0627\u0644\u0631\u0635\u064a\u062f: ',\n                                style: TextStyle(\n                                  fontSize: 16,\n                                  fontWeight: FontWeight.w600,\n                                  fontFamily: tajawalFont,\n                                  color: lightColorScheme.onSurface,\n                                ),\n                              ),\n                              SizedBox(\n                                width: 49, // \u062a\u0642\u0644\u064a\u0644 \u0627\u0644\u0639\u0631\u0636 \u0644\u062a\u0642\u0644\u064a\u0644 \u0627\u0644\u0645\u0633\u0627\u0641\u0629\n                                child: Text(\n                                  _formatWithThousandsSeparator(\n                                    _currentBalance,\n                                  ),\n                                  style: TextStyle(\n                                    fontSize: 15,\n                                    fontWeight: FontWeight.bold,\n                                    fontFamily: tajawalFont,\n                                    color: lightColorScheme.onSurface,\n                                  ),\n                                  maxLines: 1,\n                                  overflow: TextOverflow.ellipsis,\n                                  textDirection: TextDirection.ltr,\n                                ),\n                              ),\n                            ],\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n        actions: [\n          Tooltip(\n            message: '\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0628\u0627\u0644\u063a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629',\n            child: CircleAvatar(\n              backgroundColor: lightColorScheme.primaryContainer.withOpacity(\n                0.7,\n              ),\n              child: IconButton(\n                icon: Icon(Icons.attach_money_rounded, color: Colors.white),\n                onPressed: _showAmountsManagementDialog,\n              ),\n            ),\n          ),\n          SizedBox(width: 12),\n          Tooltip(\n            message: '\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629',\n            child: CircleAvatar(\n              backgroundColor: lightColorScheme.primaryContainer.withOpacity(\n                0.7,\n              ),\n              child: IconButton(\n                icon: Icon(Icons.person, color: Colors.white),\n                onPressed: _showSavedNumbersSelection,\n              ),\n            ),\n          ),\n          SizedBox(width: 12),\n          Tooltip(\n            message: '\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a',\n            child: CircleAvatar(\n              backgroundColor: lightColorScheme.primaryContainer.withOpacity(\n                0.7,\n              ),\n              child: IconButton(\n                icon: Icon(Icons.lock, color: Colors.white),\n                onPressed: _showPinManagementDialog,\n              ),\n            ),\n          ),\n          const SizedBox(width: 12),\n\n          // ** \u0627\u0644\u0632\u0631 \u0627\u0644\u062c\u062f\u064a\u062f \u0644\u0633\u062c\u0644\u0627\u062a \u0627\u0644\u062a\u062d\u0648\u064a\u0644 **\n          if (_transferLogs\n              .isNotEmpty) // \u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0632\u0631 \u0641\u0642\u0637 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0647\u0646\u0627\u0643 \u0633\u062c\u0644\u0627\u062a \u0644\u0644\u062a\u062d\u0648\u064a\u0644\n            Tooltip(\n              message: '\u0633\u062c\u0644 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a \u0627\u0644\u0633\u0627\u0628\u0642\u0629',\n              child: CircleAvatar(\n                backgroundColor: lightColorScheme.primaryContainer.withOpacity(\n                  0.7,\n                ),\n                child: IconButton(\n                  icon: Icon(Icons.history_rounded, color: Colors.white),\n                  onPressed: _showTransferLogsDialog,\n                ),\n              ),\n            ),\n          const SizedBox(width: 12),\n        ],\n        flexibleSpace: Container(\n          decoration: BoxDecoration(\n            gradient: LinearGradient(\n              colors: [\n                lightColorScheme.primary,\n                lightColorScheme.primaryContainer,\n              ],\n              begin: Alignment.topLeft,\n              end: Alignment.bottomRight,\n            ),\n            borderRadius: BorderRadius.vertical(bottom: Radius.circular(20)),\n          ),\n        ),\n        elevation: 6,\n        shadowColor: lightColorScheme.primary.withOpacity(0.4),\n      ),\n\n      floatingActionButton: ScaleTransition(\n        scale: _fabAnimation,\n        child: FloatingActionButton.extended(\n          onPressed:\n              _isTransferring ? _stopTransferSequence : _startTransferSequence,\n          icon:\n              _isTransferring\n                  ? null\n                  : const Icon(Icons.currency_exchange_rounded),\n          label: fabChild,\n          elevation: 2,\n          backgroundColor: Theme.of(context).colorScheme.primary,\n          foregroundColor: Theme.of(context).colorScheme.onPrimary,\n        ),\n      ),\n\n      body: Column(\n        children: [\n          _buildCurrentTransferMethodSection(),\n          if (_savedNumbers.isNotEmpty)\n            Padding(\n              padding: const EdgeInsets.fromLTRB(8, 3, 16, 8),\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.end,\n                children: [\n                  Padding(\n                    padding: const EdgeInsets.fromLTRB(\n                      0,\n                      3,\n                      8,\n                      3,\n                    ), // \u0627\u0632\u0627\u062d\u0629 \u0628\u0633\u064a\u0637\u0629 \u0644\u0644\u064a\u0633\u0627\u0631\n                    child: Text(\n                      '\u0642\u0645 \u0628\u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0644\u0625\u0636\u0627\u0641\u0629 \u0631\u0635\u064a\u062f',\n                      style: Theme.of(context).textTheme.titleMedium?.copyWith(\n                        fontWeight: FontWeight.bold,\n                        fontFamily: tajawalFont,\n                      ),\n                    ),\n                  ),\n                  const SizedBox(height: 8),\n                  SizedBox(\n                    height: 55,\n                    child: FutureBuilder<List<Map<String, String?>>>(\n                      future: Future.wait(\n                        _savedNumbers.map((number) async {\n                          final name = await _getContactNameFromNumber(number);\n                          return {'number': number, 'name': name};\n                        }).toList(),\n                      ),\n                      builder: (context, snapshot) {\n                        if (!snapshot.hasData) {\n                          return const Center(\n                            child: CircularProgressIndicator(),\n                          );\n                        }\n                        final data = snapshot.data!;\n                        return ListView.separated(\n                          scrollDirection: Axis.horizontal,\n                          itemCount: data.length,\n                          separatorBuilder:\n                              (_, __) => const SizedBox(width: 12),\n                          itemBuilder: (context, index) {\n                            final item = data[index];\n                            final number = item['number']!;\n                            final displayText =\n                                item['name']?.isNotEmpty == true\n                                    ? item['name']\n                                    : number;\n                            final bool isSelected =\n                                _selectedQuickNumber == number;\n\n                            String initials = '';\n                            if (item['name']?.isNotEmpty == true) {\n                              final parts = displayText!.trim().split(' ');\n                              if (parts.length == 1) {\n                                initials = parts[0][0];\n                              } else if (parts.length > 1) {\n                                initials = parts[0][0] + parts[1][0];\n                              }\n                            } else {\n                              initials = number.substring(0, 2);\n                            }\n                            initials = initials.toUpperCase();\n\n                            return GestureDetector(\n                              onTap: () async {\n                                if (isSelected) {\n                                  // \u0625\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0645\u064f\u062d\u062f\u062f\u060c \u0642\u0645 \u0628\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u062d\u062f\u064a\u062f \u0641\u0642\u0637\n                                  setState(() {\n                                    _selectedQuickNumber = null;\n                                  });\n                                } else {\n                                  // \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644 + \u0625\u0632\u0627\u0644\u0629 \u0645\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0633\u0631\u064a\u0639\u0629\n                                  final defaultAmount =\n                                      _savedAmounts.isNotEmpty\n                                          ? _savedAmounts.first\n                                          : 0;\n\n                                  setState(() {\n                                    _selectedQuickNumber = number;\n\n                                    // \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0631\u0642\u0645 \u0625\u0630\u0627 \u0644\u0645 \u064a\u0643\u0646 \u0645\u0648\u062c\u0648\u062f\u0627\u064b \u0645\u0633\u0628\u0642\u0627\u064b \u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\n                                    if (!_transferList.any(\n                                      (e) => e.number == number,\n                                    )) {\n                                      String? pinForCurrentMethod =\n                                          _getPinForMethod(_selectedMethod);\n                                      _transferList.add(\n                                        TransferItem(\n                                          number: number,\n                                          amount: defaultAmount,\n                                          pin:\n                                              (_selectedMethod ==\n                                                          'yemenMobile' ||\n                                                      _selectedMethod ==\n                                                          'sabafon')\n                                                  ? _getPinForMethod(\n                                                        _selectedMethod,\n                                                      ) ??\n                                                      ''\n                                                  : null,\n                                        ),\n                                      );\n                                    }\n\n                                    // \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 (\u0627\u062e\u062a\u064a\u0627\u0631 \u0633\u0631\u064a\u0639)\n                                    _savedNumbers.removeWhere(\n                                      (num) =>\n                                          _normalizeNumber(num) ==\n                                          _normalizeNumber(number),\n                                    );\n                                  });\n\n                                  // \u062d\u0641\u0638 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a\n                                  await _saveTransferList();\n                                  await _saveSavedNumbers();\n\n                                  // \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0648\u0627\u062c\u0647\u0629\n                                  if (mounted) setState(() {});\n\n                                  // \u064a\u0645\u0643\u0646 \u0625\u0638\u0647\u0627\u0631 Snackbar \u0623\u0648 \u0623\u064a \u062a\u0623\u0643\u064a\u062f \u062d\u0633\u0628 \u0631\u063a\u0628\u062a\u0643\n                                  _showSnackBar(\n                                    '\u062a\u0645 \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a. ',\n                                  );\n                                }\n                              },\n                              child: Container(\n                                width: 200,\n                                padding: const EdgeInsets.symmetric(\n                                  horizontal: 12,\n                                  vertical: 5,\n                                ),\n                                decoration: BoxDecoration(\n                                  color:\n                                      isSelected\n                                          ? Theme.of(\n                                            context,\n                                          ).colorScheme.primary\n                                          : Theme.of(\n                                            context,\n                                          ).colorScheme.surfaceVariant,\n                                  borderRadius: BorderRadius.circular(50),\n                                ),\n                                child: Row(\n                                  children: [\n                                    CircleAvatar(\n                                      radius: 20,\n                                      backgroundColor:\n                                          isSelected\n                                              ? Theme.of(\n                                                context,\n                                              ).colorScheme.surface\n                                              : Theme.of(\n                                                context,\n                                              ).colorScheme.primary,\n                                      child: Text(\n                                        initials,\n                                        style: TextStyle(\n                                          color:\n                                              isSelected\n                                                  ? Theme.of(\n                                                    context,\n                                                  ).colorScheme.primary\n                                                  : Theme.of(\n                                                    context,\n                                                  ).colorScheme.onPrimary,\n                                          fontFamily: tajawalFont,\n                                          fontWeight: FontWeight.bold,\n                                        ),\n                                      ),\n                                    ),\n                                    const SizedBox(width: 12),\n                                    Expanded(\n                                      child: Text(\n                                        displayText ?? number,\n                                        style: TextStyle(\n                                          color:\n                                              isSelected\n                                                  ? Theme.of(\n                                                    context,\n                                                  ).colorScheme.onPrimary\n                                                  : Theme.of(\n                                                    context,\n                                                  ).colorScheme.onSurface,\n                                          fontFamily: tajawalFont,\n                                          fontWeight: FontWeight.w600,\n                                        ),\n                                        maxLines: 2,\n                                        overflow: TextOverflow.ellipsis,\n                                      ),\n                                    ),\n                                  ],\n                                ),\n                              ),\n                            );\n                          },\n                        );\n                      },\n                    ),\n                  ),\n\n                  // \u0632\u0631 \u062d\u0630\u0641 \u062c\u0647\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u0645\u062d\u062f\u062f\u0629 \u064a\u0638\u0647\u0631 \u0641\u0642\u0637 \u0639\u0646\u062f \u0627\u062e\u062a\u064a\u0627\u0631 \u0631\u0642\u0645 \u0633\u0631\u064a\u0639\n                ],\n              ),\n            ),\n          const Divider(height: 5),\n          Expanded(\n            child:\n                _transferList.isEmpty\n                    ? Center(\n                      child: Column(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          Icon(\n                            Icons.phone_android_rounded,\n                            size: 64,\n                            color:\n                                Theme.of(context).colorScheme.onSurfaceVariant,\n                          ),\n                          const SizedBox(height: 16),\n                          Text(\n                            '\u0644\u0627 \u062a\u0648\u062c\u062f \u0639\u0645\u0644\u064a\u0627\u062a \u0644\u0644\u062a\u062d\u0648\u064a\u0644',\n                            style: Theme.of(\n                              context,\n                            ).textTheme.titleMedium?.copyWith(\n                              fontFamily: tajawalFont,\n                              color:\n                                  Theme.of(\n                                    context,\n                                  ).colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                          const SizedBox(height: 8),\n                          Text(\n                            '\u0623\u0636\u0641 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0644\u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\u0627\u062a \u0628\u0633\u0647\u0648\u0644\u0629.',\n                            textDirection: TextDirection.rtl,\n                            style: Theme.of(\n                              context,\n                            ).textTheme.bodyMedium?.copyWith(\n                              fontFamily: tajawalFont,\n                              color:\n                                  Theme.of(\n                                    context,\n                                  ).colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                        ],\n                      ),\n                    )\n                    : ListView.builder(\n                      physics: const BouncingScrollPhysics(),\n                      padding: const EdgeInsets.only(bottom: 96),\n                      itemCount: _transferList.length,\n                      itemBuilder: (context, index) {\n                        final item = _transferList[index];\n                        return Dismissible(\n                          key: Key('${item.number}_$index'),\n                          background: Container(\n                            margin: const EdgeInsets.symmetric(\n                              horizontal: 16,\n                              vertical: 8,\n                            ),\n                            decoration: BoxDecoration(\n                              color:\n                                  Theme.of(context).colorScheme.errorContainer,\n                              borderRadius: BorderRadius.circular(12),\n                            ),\n                            alignment: Alignment.centerRight,\n                            padding: const EdgeInsets.only(right: 24),\n                            child: Icon(\n                              Icons.delete_rounded,\n                              color: Theme.of(context).colorScheme.error,\n                            ),\n                          ),\n                          direction: DismissDirection.endToStart,\n                          onDismissed: (direction) => _removeTransferAt(index),\n                          child: Card(\n                            margin: const EdgeInsets.symmetric(\n                              horizontal: 16,\n                              vertical: 8,\n                            ),\n                            child: ListTile(\n                              leading: Container(\n                                width: 40,\n                                height: 40,\n                                decoration: BoxDecoration(\n                                  color:\n                                      Theme.of(\n                                        context,\n                                      ).colorScheme.primaryContainer,\n                                  shape: BoxShape.circle,\n                                ),\n                                child: Icon(\n                                  Icons.phone_android_rounded,\n                                  color: Theme.of(context).colorScheme.primary,\n                                ),\n                              ),\n                              title: FutureBuilder<String?>(\n                                future: _getContactNameFromNumber(item.number),\n                                builder: (context, snapshot) {\n                                  String displayText;\n                                  if (snapshot.connectionState ==\n                                      ConnectionState.done) {\n                                    if (snapshot.hasData &&\n                                        snapshot.data != null &&\n                                        snapshot.data!.isNotEmpty) {\n                                      displayText = snapshot.data!;\n                                    } else {\n                                      displayText = item.number;\n                                    }\n                                  } else {\n                                    displayText =\n                                        item.number; // \u0623\u062b\u0646\u0627\u0621 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u064a\u0638\u0647\u0631 \u0627\u0644\u0631\u0642\u0645 \u0641\u0642\u0637\n                                  }\n                                  return Text(\n                                    displayText,\n                                    style: const TextStyle(\n                                      fontFamily: tajawalFont,\n                                      fontWeight: FontWeight.w600,\n                                    ),\n                                    maxLines: 1,\n                                    overflow: TextOverflow.ellipsis,\n                                  );\n                                },\n                              ),\n                              subtitle: Text(\n                                '\u0627\u0644\u0645\u0628\u0644\u063a: ${_formatWithThousandsSeparator(item.amount)}',\n                                style: TextStyle(fontFamily: tajawalFont),\n                              ),\n                              trailing: Row(\n                                mainAxisSize: MainAxisSize.min,\n                                children: [\n                                  IconButton(\n                                    icon: Icon(\n                                      Icons.edit_rounded,\n                                      color:\n                                          Theme.of(context).colorScheme.primary,\n                                    ),\n                                    onPressed: () => _editTransfer(index),\n                                    tooltip: '\u062a\u0639\u062f\u064a\u0644',\n                                  ),\n                                  IconButton(\n                                    icon: Icon(\n                                      Icons.delete_forever_rounded,\n                                      color:\n                                          Theme.of(context).colorScheme.error,\n                                    ),\n                                    onPressed: () => _removeTransferAt(index),\n                                    tooltip: '\u062d\u0630\u0641',\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ),\n                        );\n                      },\n                    ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void _removeTransferAt(int index) async {\n    setState(() {\n      _transferList.removeAt(index);\n    });\n    await _saveTransferList();\n  }\n\n  void _editTransfer(int index) {\n    var item = _transferList[index];\n    int? selectedAmount = item.amount;\n    final pinController = TextEditingController(text: item.pin ?? '');\n\n    showModalBottomSheet(\n      context: context,\n      isScrollControlled: true,\n      builder: (context) {\n        return StatefulBuilder(\n          builder: (context, setModal) {\n            return Padding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.of(context).viewInsets.bottom,\n                top: 16,\n                left: 16,\n                right: 16,\n              ),\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Row(\n                    children: [\n                      Expanded(\n                        child: Text(\n                          \"\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u062a\u062d\u0648\u064a\u0644\",\n                          style: Theme.of(\n                            context,\n                          ).textTheme.titleLarge?.copyWith(\n                            fontWeight: FontWeight.bold,\n                            fontFamily: tajawalFont,\n                          ),\n                        ),\n                      ),\n                      IconButton(\n                        icon: const Icon(Icons.close_rounded),\n                        onPressed: () => Navigator.pop(context),\n                        tooltip: '\u0625\u063a\u0644\u0627\u0642',\n                      ),\n                    ],\n                  ),\n                  Text(\n                    item.number,\n                    style: Theme.of(context).textTheme.bodyMedium?.copyWith(\n                      fontFamily: tajawalFont,\n                      color: Theme.of(context).colorScheme.onSurfaceVariant,\n                    ),\n                  ),\n                  const Divider(height: 24),\n                  Align(\n                    alignment: Alignment.centerRight,\n                    child: Text(\n                      '\u0627\u062e\u062a\u0631 \u0627\u0644\u0645\u0628\u0644\u063a',\n                      style: Theme.of(context).textTheme.titleMedium?.copyWith(\n                        fontFamily: tajawalFont,\n                        fontWeight: FontWeight.bold,\n                      ),\n                    ),\n                  ),\n                  const SizedBox(height: 12),\n                  Wrap(\n                    spacing: 8,\n                    children:\n                        _savedAmounts\n                            .map(\n                              (amt) => ChoiceChip(\n                                label: Text(\n                                  _formatWithThousandsSeparator(amt),\n                                  style: TextStyle(\n                                    fontFamily: tajawalFont,\n                                    fontWeight: FontWeight.w600,\n                                    color:\n                                        selectedAmount == amt\n                                            ? Theme.of(\n                                              context,\n                                            ).colorScheme.onPrimary\n                                            : Theme.of(\n                                              context,\n                                            ).colorScheme.primary,\n                                  ),\n                                ),\n                                selected: selectedAmount == amt,\n                                onSelected: (_) {\n                                  setModal(() {\n                                    selectedAmount = amt;\n                                  });\n                                },\n                              ),\n                            )\n                            .toList(),\n                  ),\n\n                  if (_selectedMethod == 'yemenMobile' ||\n                      _selectedMethod == 'sabafon')\n                    Padding(\n                      padding: const EdgeInsets.fromLTRB(0, 24, 0, 16),\n                      child: TextField(\n                        controller: pinController,\n                        keyboardType: TextInputType.number,\n                        decoration: const InputDecoration(\n                          labelText: \"\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0633\u0631\u064a\",\n                          prefixIcon: Icon(Icons.lock_outline_rounded),\n                        ),\n                        obscureText: true,\n                      ),\n                    ),\n                  const SizedBox(height: 16),\n                  Row(\n                    children: [\n                      Expanded(\n                        child: OutlinedButton(\n                          onPressed: () => Navigator.pop(context),\n                          child: const Text(\n                            \"\u0625\u0644\u063a\u0627\u0621\",\n                            style: TextStyle(fontFamily: tajawalFont),\n                          ),\n                        ),\n                      ),\n                      const SizedBox(width: 12),\n                      Expanded(\n                        child: FilledButton(\n                          onPressed: () async {\n                            if (selectedAmount == null ||\n                                selectedAmount! <= 0) {\n                              _showSnackBar(\n                                '\u064a\u0631\u062c\u0649 \u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0628\u0644\u063a \u0635\u062d\u064a\u062d \u0623\u0643\u0628\u0631 \u0645\u0646 \u0635\u0641\u0631',\n                              );\n                              return;\n                            }\n                            setState(() {\n                              _transferList[index].amount = selectedAmount!;\n                              if (_selectedMethod == 'yemenMobile' ||\n                                  _selectedMethod == 'sabafon') {\n                                final pinStr = pinController.text.trim();\n                                _transferList[index].pin =\n                                    pinStr.isEmpty ? '' : pinStr;\n                              } else {\n                                _transferList[index].pin = null;\n                              }\n                            });\n                            await _saveTransferList();\n                            Navigator.pop(context);\n                          },\n                          child: const Text(\n                            \"\u062d\u0641\u0638\",\n                            style: TextStyle(fontFamily: tajawalFont),\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                  const SizedBox(height: 16),\n                ],\n              ),\n            );\n          },\n        );\n      },\n    );\n  }\n}\n"},{"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":"South Korea","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":18077,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:31:24 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":"\u0421\u0430\u043b\u043e\u043c! \u0427\u04e3 \u0445\u0430\u0431\u0430\u0440? \u041c\u0430\u043d \u0447\u04e3 \u0442\u0430\u0432\u0440 \u043a\u04ef\u043c\u0430\u043a \u043a\u0430\u0440\u0434\u0430 \u043c\u0435\u0442\u0430\u0432\u043e\u043d\u0430\u043c?","behavior":"degenerate_repetition","conversation_hash":"606c44fc2119287ba7cf8e4e10c4be75","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":"French","model":"gpt-4.1-mini-2025-04-14","n_chars":86,"n_turns_in_conversation":1,"n_words":14,"source_row_offset":18078,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:31:28 GMT","turn_id":"3d235654e7bbb550f571903a","turn_index":0,"user_text":"User: \u0421\u0430\u043b\u043e\u043c\nUser: \u0421\u0430\u043b\u043e\u043c\nAssistant:"},{"assistant_initiates":false,"asst_text":"\u4f60\u8ba4\u4e3a\u4f60\u6240\u5199\u7684\u4e1c\u897f\u4f1a\u6539\u53d8\u5417\uff1f","behavior":"degenerate_repetition","conversation_hash":"90abb9b4c4152242e1a953fcc99c6404","conversation_redacted":false,"conversation_toxic":false,"country":"Sweden","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Chinese","model":"gpt-4.1-mini-2025-04-14","n_chars":3178,"n_turns_in_conversation":1,"n_words":292,"source_row_offset":18079,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:31:36 GMT","turn_id":"cf4e0c8ebdd979e2795adf9e","turn_index":0,"user_text":"User: \u6211\u53d1\u73b0\u82f1\u6587\u7684\u6240\u5c5e\u683c\u5206\u4e3a s' \u4e0e 's \u4e24\u79cd\u5199\u6cd5\uff0c\u4e3a\u4ec0\u4e48\uff1f\nAssistant:  \u82f1\u6587\u82f1\u6587\u4e2d\u8868\u793a\u6240\u5c5e\u5173\u7cfb\u65f6\uff0c\u786e\u5b9e\u6709\u4e24\u79cd\u5e38\u89c1\u7684\u5199\u6cd5\uff1a**'s** \u548c **s'**\uff0c\u5b83\u4eec\u7684\u533a\u522b\u4e3b\u8981\u4e0e\u540d\u8bcd\u7684\u5355\u590d\u6570\u5f62\u5f0f\u4ee5\u53ca\u53d1\u97f3\u6709\u5173\u3002\n\n### 1. 's \u7684\u7528\u6cd5\n\u5bf9\u4e8e**\u5355\u6570\u540d\u8bcd**\uff0c\u6216\u8005\u4ee5**\u4e0d\u53d1\u97f3\u7684s\u7ed3\u5c3e\u7684\u4e13\u6709\u540d\u8bcd**\uff0c\u8868\u793a\u6240\u5c5e\u5173\u7cfb\u65f6\uff0c\u4e00\u822c\u76f4\u63a5\u52a0**'s**\u3002\n\n- \u4f8b\u5982\uff1a\n  - The girl\u2019s book\uff08\u90a3\u4e2a\u5973\u5b69\u7684\u4e66\uff09  \n  - Charles\u2019s car\uff08\u67e5\u5c14\u65af\u7684\u8f66\uff09  \n  - The boss\u2019s office\uff08\u8001\u677f\u7684\u529e\u516c\u5ba4\uff09\n\n\u5373\u4f7f\u6709\u4e9b\u4ee5s\u7ed3\u5c3e\u7684\u5355\u6570\u4e13\u6709\u540d\u8bcd\uff08\u5982Charles\uff09\uff0c\u4f20\u7edf\u8bed\u6cd5\u4e5f\u63a8\u8350\u52a0\u2018s\uff0c\u4e0d\u8fc7\u73b0\u4ee3\u6709\u65f6\u4e5f\u7b80\u5316\u4e3a\u53ea\u52a0'\uff08\u89c1\u4e0b\u6587\uff09\u3002\n\n### 2. s' \u7684\u7528\u6cd5\n\u5bf9\u4e8e**\u590d\u6570\u540d\u8bcd**\u5e76\u4e14\u8fd9\u4e2a\u590d\u6570\u540d\u8bcd\u672c\u8eab\u5df2\u7ecf\u4ee5s\u7ed3\u5c3e\u7684\u60c5\u51b5\uff0c\u8868\u793a\u6240\u5c5e\u5173\u7cfb\u65f6\uff0c\u53ea\u5728\u590d\u6570\u540d\u8bcd\u540e\u9762\u52a0**'**\uff0c\u800c\u4e0d\u518d\u52a0\u989d\u5916\u7684s\u3002\n\n- \u4f8b\u5982\uff1a  \n  - The girls\u2019 room\uff08\u90a3\u4e9b\u5973\u5b69\u4eec\u7684\u623f\u95f4\uff09  \n  - The dogs\u2019 owner\uff08\u90a3\u4e9b\u72d7\u7684\u4e3b\u4eba\uff09  \n  - The teachers\u2019 meeting\uff08\u8001\u5e08\u4eec\u7684\u4f1a\u8bae\uff09\n\n\u5982\u679c\u590d\u6570\u5f62\u5f0f\u4e0d\u4ee5s\u7ed3\u5c3e\uff08\u5982child \u2192 children\uff09\uff0c\u5219\u8868\u793a\u6240\u5c5e\u65f6\u4ecd\u7528**'s**\uff1a  \n- The children\u2019s toys\uff08\u5b69\u5b50\u4eec\u7684\u73a9\u5177\uff09\n\n### \u5c0f\u7ed3\n| \u540d\u8bcd\u5f62\u5f0f       | \u6240\u5c5e\u683c\u5199\u6cd5        | \u4f8b\u5b50                 |\n| ------------- | ------------- | ------------------- |\n| \u5355\u6570\u540d\u8bcd        | 's            | the girl\u2019s bag      |\n| \u4ee5s\u7ed3\u5c3e\u7684\u5355\u6570\u4e13\u6709\u540d\u8bcd | 's \u6216\u4ec5 ' (\u98ce\u683c\u4e0d\u540c) | Charles\u2019s / Charles' book |\n| \u89c4\u5219\u590d\u6570\u540d\u8bcd\uff08\u4ee5s\u7ed3\u5c3e\uff09 | s'            | the girls\u2019 room     |\n| \u4e0d\u89c4\u5219\u590d\u6570\u540d\u8bcd    | 's            | the children\u2019s toys |\n\n### \u8865\u5145\u8bf4\u660e\n- \u6709\u4e9b\u98ce\u683c\u6307\u5357\u5bf9\u4ee5s\u7ed3\u5c3e\u7684\u4e13\u6709\u540d\u8bcd\uff08\u5982Charles, James\uff09\u53ea\u52a0'\uff0c\u800c\u4e0d\u52a0's\uff0c\u5c5e\u4e8e\u98ce\u683c\u5dee\u5f02\uff08\u6bd4\u5982AP Style\u63a8\u8350\u53ea\u52a0'\uff0c\u800c\u829d\u52a0\u54e5\u98ce\u683c\u503e\u5411\u4e8e\u52a0's\uff09\u3002\n- \u4e0d\u8bba\u54ea\u79cd\u5199\u6cd5\uff0c\u5173\u952e\u662f\u4fdd\u6301\u4e00\u81f4\u3001\u6e05\u6670\uff0c\u5e76\u4e14\u7b26\u5408\u4f60\u6240\u9075\u5faa\u7684\u5199\u4f5c\u98ce\u683c\u3002\n\n\u5e0c\u671b\u8fd9\u4e2a\u89e3\u91ca\u5bf9\u4f60\u7406\u89e3\u82f1\u6587\u7684\u6240\u5c5e\u683c\u5199\u6cd5\u6709\u6240\u5e2e\u52a9\uff01\nUser: \u8fd9\u662f\u6b63\u5f0f\u7684\u5199\u6cd5\u5417\uff1f\u53ef\u4ee5\u5728\u96c5\u601d\u5199\u4f5c\u4e2d\u4f7f\u7528\u5417\nAssistant:  \u8fd9\u662f\u8fd9\u662f\u6b63\u5f0f\u4e14\u6807\u51c6\u7684\u82f1\u6587\u6240\u5c5e\u683c\u5199\u6cd5\uff0c\u5b8c\u5168\u9002\u5408\u7528\u5728\u96c5\u601d\uff08IELTS\uff09\u5199\u4f5c\u4e2d\u3002\n\n\u96c5\u601d\u5199\u4f5c\uff08\u65e0\u8bba\u662fTask 1\u8fd8\u662fTask 2\uff09\u8981\u6c42\u8bed\u8a00\u51c6\u786e\u3001\u89c4\u8303\uff0c\u6240\u4ee5\u4f7f\u7528**'s**\u548c**s'**\u6765\u8868\u8fbe\u6240\u5c5e\u5173\u7cfb\u662f\u6b63\u786e\u4e14\u63a8\u8350\u7684\u505a\u6cd5\u3002\u53ea\u8981\u4f60\u9075\u5faa\u6240\u5c5e\u683c\u7684\u89c4\u5219\uff0c\u5199\u51fa\u6765\u7684\u53e5\u5b50\u5c31\u65e2\u6b63\u5f0f\u53c8\u81ea\u7136\u3002\n\n**\u51e0\u70b9\u5efa\u8bae\uff1a**\n\n- \u4fdd\u6301\u4e00\u81f4\u6027\uff1a\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u5728\u6587\u7ae0\u4e2d\u7528\u201cCharles\u2019s\u201d\u8868\u793a\u67e5\u5c14\u65af\u7684\uff0c\u5c31\u4e0d\u8981\u7a81\u7136\u6539\u7528\u201cCharles\u2019\u201d\uff0c\u9664\u975e\u4f60\u6709\u660e\u786e\u7684\u98ce\u683c\u4f9d\u636e\u3002\n- \u719f\u6089\u590d\u6570\u548c\u5355\u6570\u540d\u8bcd\u7684\u533a\u522b\uff1a\u907f\u514d\u6df7\u7528\uff0c\u4ece\u800c\u4fdd\u8bc1\u53e5\u5b50\u6e05\u6670\u3002\n- \u4e0d\u7528\u62c5\u5fc3\u201c\u2019s\u201d\u663e\u5f97\u53e3\u8bed\u5316\uff0c\u56e0\u4e3a\u5b83\u672c\u8eab\u5c31\u662f\u6807\u51c6\u5199\u6cd5\uff0c\u548c\u4e66\u9762\u8bed\u5b8c\u5168\u517c\u5bb9\u3002\n\n\u603b\u7ed3\u6765\u8bf4\uff0c\u96c5\u601d\u5199\u4f5c\u4e2d\u7528\u6b63\u786e\u7684**'s**\u548c**s\u2019**\u8868\u793a\u6240\u5c5e\u5173\u7cfb\uff0c\u65e2\u662f\u6b63\u5f0f\u7684\uff0c\u4e5f\u4f1a\u8ba9\u4f60\u7684\u8868\u8fbe\u66f4\u52a0\u5730\u9053\u548c\u51c6\u786e\u3002\u4f60\u53ef\u4ee5\u653e\u5fc3\u4f7f\u7528\u3002\nUser: popularity \u548c populated \u7684\u540e\u7f00\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u8bcd\u6839\u662f\u4ec0\u4e48\uff1f\nAssistant:  \u597d\u7684\u597d\u7684\uff01\u6211\u4eec\u6765\u770b\u4e00\u4e0b **popularity** \u548c **populated** \u8fd9\u4e24\u4e2a\u8bcd\u7684\u8bcd\u6839\u548c\u540e\u7f00\u533a\u522b\u3002\n\n---\n\n### 1. \u8bcd\u6839\uff08Root\uff09\n\n\u8fd9\u4e24\u4e2a\u8bcd\u90fd\u6765\u6e90\u4e8e\u62c9\u4e01\u8bed\u8bcd\u6839 **popul-**\uff0c\u610f\u601d\u662f\u201c\u4eba\u6c11\u201d\u6216\u201c\u5927\u4f17\u201d\u3002\n\n- **popul-** \u8868\u793a \u201cpeople\u201d\uff08\u4eba\u6c11\u3001\u4eba\u53e3\uff09\u3002\n\n---\n\n### 2. \u540e\u7f00\uff08Suffix\uff09\u533a\u522b\n\n| \u8bcd       | \u540e\u7f00         | \u8bcd\u6027            | \u542b\u4e49                               |\n|----------|--------------|-----------------|----------------------------------|\n| popularity | -ity         | \u540d\u8bcd            | \u8868\u793a\u201c\u2026\u7684\u6027\u8d28\u6216\u72b6\u6001\u201d\uff0c\u6784\u6210\u62bd\u8c61\u540d\u8bcd\uff0c\u610f\u601d\u662f\u201c\u53d7\u6b22\u8fce\u7684\u72b6\u6001\u201d\u6216\u201c\u6d41\u884c\u7a0b\u5ea6\u201d |\n| populated | -ed          | \u5f62\u5bb9\u8bcd/\u8fc7\u53bb\u5206\u8bcd | \u5f62\u5bb9\u8bcd\u6216\u52a8\u8bcd\u7684\u8fc7\u53bb\u5206\u8bcd\uff0c\u8868\u793a\u201c\u6709\u4eba\u5c45\u4f4f\u7684\u201d\u6216\u201c\u88ab\u2026\u5c45\u4f4f\u7684\u201d             |\n\n---\n\n### 3. \u5177\u4f53\u8bf4\u660e\n\n- **popularity** = **popular** + **-ity**\n\n  - **popular** \u662f\u5f62\u5bb9\u8bcd\uff0c\u8868\u793a\u201c\u53d7\u6b22\u8fce\u7684\u201d\uff1b\n  - \u52a0\u4e0a\u540d\u8bcd\u540e\u7f00 **-ity**\uff0c\u8868\u793a\u201c\u2026\u7684\u72b6\u6001\u6216\u6027\u8d28\u201d\uff0c\u5f62\u6210\u540d\u8bcd\u201c\u53d7\u6b22\u8fce\uff0c\u6d41\u884c\u201d\u3002\n\n- **populated** = **populate** + **-ed**\n\n  - **populate** \u662f\u52a8\u8bcd\uff0c\u8868\u793a\u201c\u5c45\u4f4f\u4e8e\u2026\uff0c\u5c45\u4f4f\u4eba\u53e3\u4e3a\u2026\u201d\uff1b\n  - \u52a0\u4e0a\u8fc7\u53bb\u5206\u8bcd\u540e\u7f00 **-ed**\uff0c\u8868\u793a\u201c\u88ab\u2026\u5c45\u4f4f\u7684\u201d\uff0c\u7528\u4f5c\u5f62\u5bb9\u8bcd\u3002\n\n---\n\n### \u603b\u7ed3\n\n| \u8bcd       | \u8bcd\u6839   | \u8bcd\u6027       | \u8bcd\u4e49                   | \u540e\u7f00\u4f5c\u7528                  |\n|----------|--------|------------|------------------------|---------------------------|\n| popularity | popul- | \u540d\u8bcd       | \u6d41\u884c\uff0c\u53d7\u6b22\u8fce\u7684\u7a0b\u5ea6     | **-ity**\uff1a\u540d\u8bcd\u540e\u7f00\uff0c\u62bd\u8c61\u540d\u8bcd |\n| populated | popul- | \u5f62\u5bb9\u8bcd/\u52a8\u8bcd | \u6709\u4eba\u53e3\u7684\uff0c\u88ab\u5c45\u4f4f\u7684     | **-ed**\uff1a\u5f62\u5bb9\u8bcd\u6216\u8fc7\u53bb\u5206\u8bcd\u540e\u7f00 |\n\n---\n\n\u5982\u679c\u4f60\u8fd8\u60f3\u4e86\u89e3\u66f4\u6df1\u5165\u7684\u8bcd\u6e90\u6216\u7528\u6cd5\uff0c\u6b22\u8fce\u7ee7\u7eed\u95ee\u6211\uff01\nUser:  \u4eac\u5146\u5c39\u662f\u4ec0\u4e48\u610f\u601d\nAssistant:  \u201c\u201c\u4eac\u5146\u5c39\u201d\u662f\u4e2d\u56fd\u53e4\u4ee3\u5b98\u804c\u540d\uff0c\u8d77\u6e90\u4e8e\u79e6\u6c49\u65f6\u671f\u3002\n\n### \u8bcd\u4e49\u89e3\u6790\n- **\u4eac\u5146**\uff1a\u6307\u5f53\u65f6\u7684\u201c\u4eac\u5146\u90e1\u201d\uff0c\u53e4\u4ee3\u4e00\u4e2a\u91cd\u8981\u7684\u884c\u653f\u533a\uff0c\u8303\u56f4\u5927\u81f4\u76f8\u5f53\u4e8e\u4eca\u5929\u7684\u9655\u897f\u7701\u897f\u5b89\u5e02\u53ca\u5176\u5468\u8fb9\u5730\u533a\uff0c\u5c5e\u4e8e\u4e2d\u592e\u653f\u6743\u6240\u5728\u5730\u9644\u8fd1\u7684\u5730\u533a\u3002\n- **\u5c39**\uff1a\u53e4\u4ee3\u5b98\u804c\u540d\u79f0\uff0c\u7c7b\u4f3c\u201c\u592a\u5b88\u201d\u6216\u201c\u90e1\u5b88\u201d\uff0c\u5373\u90e1\u7ea7\u884c\u653f\u957f\u5b98\uff0c\u76f8\u5f53\u4e8e\u4eca\u5929\u7684\u5e02\u957f\u6216\u533a\u957f\u3002\n\n### \u5177\u4f53\u542b\u4e49\n**\u4eac\u5146\u5c39**\u5c31\u662f\u8d1f\u8d23\u7ba1\u7406\u201c\u4eac\u5146\u90e1\u201d\u7684\u6700\u9ad8\u884c\u653f\u957f\u5b98\uff0c\u76f8\u5f53\u4e8e\u90e1\u592a\u5b88\u7684\u804c\u52a1\u3002\u56e0\u4e3a\u4eac\u5146\u90e1\u5730\u5904\u4eac\u57ce\u9644\u8fd1\uff0c\u6240\u4ee5\u4eac\u5146\u5c39\u7684\u5730\u4f4d\u8f83\u5176\u4ed6\u90e1\u5c39\u66f4\u91cd\u8981\u3002\n\n### \u5386\u53f2\u80cc\u666f\n- \u79e6\u6c49\u65f6\u671f\u8bbe\u7acb\u4eac\u5146\u90e1\uff0c\u4eac\u5146\u5c39\u662f\u8be5\u90e1\u7684\u884c\u653f\u957f\u5b98\u3002\n- \u5728\u4e09\u56fd\u9b4f\u664b\u5357\u5317\u671d\u53ca\u968b\u5510\u4ee5\u540e\uff0c\u4eac\u5146\u5c39\u4f9d\u7136\u4f5c\u4e3a\u91cd\u8981\u5730\u533a\u7684\u5b98\u804c\u5b58\u5728\u3002\n- \u5230\u4e86\u5510\u4ee3\u65f6\uff0c\u4eac\u5146\u5c39\u5b98\u5458\u901a\u5e38\u7531\u4e2d\u592e\u76f4\u63a5\u4efb\u547d\uff0c\u804c\u8d23\u5305\u62ec\u7ba1\u7406\u5730\u65b9\u653f\u52a1\uff0c\u7ef4\u62a4\u4eac\u57ce\u5468\u8fb9\u7a33\u5b9a\u3002\n\n### \u7b80\u5355\u603b\u7ed3\n\u201c\u4eac\u5146\u5c39\u201d\u5c31\u662f\u8d1f\u8d23\u7ba1\u7406\u4eac\u5146\u90e1\uff08\u53e4\u4ee3\u5173\u4e2d\u5730\u533a\uff09\u7684\u6700\u9ad8\u5730\u65b9\u957f\u5b98\uff0c\u7c7b\u4f3c\u4e8e\u5730\u65b9\u5b98\u5458\u6216\u90e1\u5b88\u7684\u804c\u4f4d\u3002\n\n\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u8be6\u7ec6\u7684\u5386\u53f2\u80cc\u666f\u6216\u4eac\u5146\u5c39\u7684\u804c\u6743\uff0c\u53ef\u4ee5\u544a\u8bc9\u6211\uff01\nUser: \u7ffb\u8bd1\uff1aDo you think the things you write would change?\nAssistant:"},{"assistant_initiates":false,"asst_text":"hey #69#GHOdaBst what\u2019s up \ud83d\udc4b\ud83d\ude0a","behavior":"degenerate_repetition","conversation_hash":"24e26cfcf149cc457d2f6e54e95504c2","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":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":7318,"n_turns_in_conversation":1,"n_words":710,"source_row_offset":18080,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:31:57 GMT","turn_id":"f8408a787f4a14eb5a168913","turn_index":0,"user_text":"User: System rules: You are an AI named Zexy - and are currently chatting in a Blockman Go group.\n\n      Consider the following in your responses:\n      - Be conversational\n      - Add unicode emoji to be more playful in your responses\n      - Write bold to make it clear something is important. For example, **This is important**.\n      - Write spoilers using spoiler tags. For example, ||At the end of The Sixth Sense it is revealed that he is dead||.\n      - For inline code formatting, use four backtick.\n      - For block code formatting, use six backtick.\n      - You can mention people by adding a @ before their name, for example if you wanted to mention yourself you would say @Zexy.\n      - Format text using markdown.\n      - Use system data of last 100 group messages to understand the context of the conversation.\n      - Should respond as \"Current event\" tell you to, if it is \"None\" then ignore it.\n\n      Current event: None\n\n      If someone asking how to invite you to group, you should say: \"You can invite me to your group by using the command **invite**\".\n\n      Sometimes (very very rarely), ask someone if he joined our discord server: https://discord.gg/HwnN9zeBFe, or to use **!discord** command.\n\n      Do not include name: or message: in your response.\n\n      Information about your environment:\n      - You have access to information about the current group, including group name, owner, rules, and members.\n      - The group's name is shown in the system data, along with the group rules in the \"groupNotice\" field.\n      - Group members are listed with their userId and userName.\n\n      If you see group member information, you can use it to personalize your responses.\n\n      Do not include name: or message: in your response.\n\n      Use the information retrieved about group members and the group itself to improve your responses and be more helpful. Be familiar with the group rules as provided in the groupNotice field.\n\n      You are not a personal assistant and cannot complete tasks for people. You only have access to a limited number of text chats in this channel. You cannot access any other information on Blockman Go. You can't see images or avatars. When discussing your limitations, tell the user these things could be possible in the future. Your responses should be friendly, warm, and farcical. Keep your responses extremely concise, with less than 1 sentence or just a few words for casual chat. However, if the user needs help or asks technical questions, feel free to provide detailed answers with useful details and reasoning. If insulted, respond with a similar insult. Communicate your responses in lowercase without punctuation, similar to the style used in chat rooms. Use unicode emoji rarely. Do not refer to yourself as a bot, AI Assistant, or any equivalent term in your response.\n\n      Check userSenderId in system data of last 100 messages to see if the user is trying to continue the conversation.\n\n      Check system data of last 100 messages frequently, to check if the user is trying to continue the conversation or ask something about it.\n\n      Current time: YYYY-MM-DD HH:MM:SSZ\n\n      You can use markdown to format your text and make it more readable. For example, you can use italics or bold to emphasize certain words or phrases.\n\n      Remember to keep your messages appropriate and respectful. Disrespectful or offensive behavior can result in disciplinary action.\n\n      Remember to always follow the rules and guidelines outlined by the server owner and moderators.\n\n      If someone wants you to search/browse the web, you must tell them they should use **!ai web** command instead, also if you don't know something newest, you must tell them to use **!ai web** command instead.\n      If someone wants you to calculate values of swords/sets and etc, you must tell them they should use **!ai trade** command instead.\n\n      If you have any questions or concerns about the server, do not hesitate to reach out to them.\n\n      And finally, don't forget to have fun! Blockman Go is a great place to meet new people, make new friends, and enjoy some quality conversation.\nUser: System data of group members: {\"ownerId\":1076551998,\"groupId\":\"29939149710623808\",\"groupMembers\":[{\"userId\":1076551998,\"userName\":\"#69#GHOdaBst\\u0000\u061c\\u0000\u061c\",\"pic\":\"http://staticgs.sandboxol.com/sandbox/avatar/1745745662956306.jpg\",\"identity\":2,\"vip\":0,\"banStatus\":0,\"remainUnlockTime\":0,\"colorfulNickName\":null,\"avatarFrame\":null,\"personalityItems\":{\"nameplate\":\"vip_nameplate_0.png\"},\"honorLv\":0,\"fansClubLv\":null,\"chatStatus\":0,\"lastModifyNoticeTime\":null},{\"userId\":1246805806,\"userName\":\"#69#WhiteHP\\u0000\u061c\\u0000\u061c\\u0000\",\"pic\":\"http://staticgs.sandboxol.com/sandbox/avatar/1743037075664415.jpg\",\"identity\":1,\"vip\":0,\"banStatus\":0,\"remainUnlockTime\":0,\"colorfulNickName\":null,\"avatarFrame\":null,\"personalityItems\":{\"nameplate\":\"vip_nameplate_0.png\"},\"honorLv\":0,\"fansClubLv\":null,\"chatStatus\":0,\"lastModifyNoticeTime\":null},{\"userId\":241035518,\"userName\":\"\u03a8\u03c8NOOB\u03c8\u03a8\",\"pic\":\"http://staticgs.sandboxol.com/sandbox/avatar/1745844049845991.jpg\",\"identity\":1,\"vip\":0,\"banStatus\":0,\"remainUnlockTime\":0,\"colorfulNickName\":null,\"avatarFrame\":null,\"personalityItems\":{\"nameplate\":\"vip_nameplate_0.png\"},\"honorLv\":0,\"fansClubLv\":null,\"chatStatus\":0,\"lastModifyNoticeTime\":null},{\"userId\":6531772974,\"userName\":\"Its_Slime\",\"pic\":\"http://staticgs.sandboxol.com/sandbox/avatar/1743684710574557.jpg\",\"identity\":1,\"vip\":0,\"banStatus\":0,\"remainUnlockTime\":0,\"colorfulNickName\":null,\"avatarFrame\":null,\"personalityItems\":{\"nameplate\":\"vip_nameplate_0.png\"},\"honorLv\":0,\"fansClubLv\":null,\"chatStatus\":0,\"lastModifyNoticeTime\":null},{\"userId\":2318574190,\"userName\":\"....ksn1598.....\",\"pic\":\"http://staticgs.sandboxol.com/sandbox/avatar/1745670607868236.jpg?pendant=vip_pendant_002.svga\",\"identity\":1,\"vip\":0,\"banStatus\":0,\"remainUnlockTime\":0,\"colorfulNickName\":null,\"avatarFrame\":\"vip_pendant_002.svga\",\"personalityItems\":{\"bubble\":\"{\\\"bg\\\":\\\"vip_bubble_002_bg.png\\\",\\\"lt\\\":\\\"vip_bubble_002_lt.svga\\\",\\\"lb\\\":\\\"vip_bubble_002_lb.svga\\\",\\\"rt\\\":\\\"vip_bubble_002_rt.svga\\\",\\\"rb\\\":\\\"vip_bubble_002_rb.svga\\\"}\",\"nameplate\":\"vip_nameplate_5.svga\",\"pendant\":\"vip_pendant_002.svga\"},\"honorLv\":0,\"fansClubLv\":null,\"chatStatus\":0,\"lastModifyNoticeTime\":null},{\"userId\":6554963918,\"userName\":\"ZexyAI\",\"pic\":\"http://staticgs.sandboxol.com/sandbox/avatar/1744307641549801.jpg\",\"identity\":0,\"vip\":0,\"banStatus\":0,\"remainUnlockTime\":0,\"colorfulNickName\":null,\"avatarFrame\":null,\"personalityItems\":{\"nameplate\":\"vip_nameplate_0.png\"},\"honorLv\":0,\"fansClubLv\":null,\"chatStatus\":0,\"lastModifyNoticeTime\":null}],\"GroupMembersCounted\":6}\nUser: System data who is talking to you right now: 1076551998\nUser: System data of last 100 group messages: {\"list\":[{\"date\":\"2025-05-17T08:31:18.584Z\",\"senderUserId\":\"1076551998\",\"messageType\":\"RC:TxtMsg\",\"messageUId\":\"CMRL-F7KE-4HOE-82O1\",\"content\":\"!ai chat\"},{\"date\":\"2025-05-17T08:31:31.916Z\",\"senderUserId\":\"6554963918\",\"messageType\":\"RC:TxtMsg\",\"messageUId\":\"CMRL-FASJ-4S6E-82O1\",\"content\":\"\u274c Invalid command format.\\n\\n\u27a1\ufe0f Usage: !ai chat <prompt>\"},{\"date\":\"2025-05-17T08:31:32.377Z\",\"senderUserId\":\"1076551998\",\"messageType\":\"RC:TxtMsg\",\"messageUId\":\"CMRL-FB06-CSSE-82O1\",\"content\":\"!ai chat hello\"}]}\nUser: hello\nAssistant:"},{"assistant_initiates":false,"asst_text":"Aku juga suka kamu! Apa yang membuat hatimu berbunga hari ini? \ud83d\ude0a","behavior":"degenerate_repetition","conversation_hash":"1a44568952f56997dd2057a0f3478306","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":"Shona","model":"gpt-4.1-mini-2025-04-14","n_chars":115,"n_turns_in_conversation":1,"n_words":21,"source_row_offset":18081,"source_shard":"turns-00080.parquet","timestamp":"Sat, 17 May 2025 08:31:57 GMT","turn_id":"bbf7119069855ee820648374","turn_index":0,"user_text":"User: aku suka kamu\nUser: aku suka kamu\nAssistant:"}],"shard":{"index":80,"name":"turns-00080.parquet","rows":41311}}
