← Back to list | Download | 2026-04-23-10-34-notification2-Esra.log (743,899 bytes)
=== Eye Viewer Log Rotated at 2026-04-21 17:02:58 +0000 ===
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28557, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28558, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-21 17:04:25";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Hope it satisfies expectations of the fantastic woman you are and who deserves it";
    "message_id" = 28559;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28558;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28560, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-21 17:05:15";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "You decide. If you tell we start now, we start now.";
    "message_id" = 28561;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28560;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28561]
    "content-available" = 1;
}, AnyHashable("message_id"): 28561, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28562]
    "content-available" = 1;
}, AnyHashable("message_id"): 28563, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-21 17:06:35";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Deal ! Timer has started !!!!!";
    "message_id" = 28563;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28562;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_id"): 28563, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-21 17:06:47";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Hope you will duly enjoy and explore baby !";
    "message_id" = 28564;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28563;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28564]
    "content-available" = 1;
}, AnyHashable("message_id"): 28565, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28566, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-21 17:08:13";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And with both our work challenges in last weeks, I miss seeing her. And won't be able to ask now !";
    "message_id" = 28567;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28566;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28567]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-21 17:08:43";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Ha ha. Yes. Be my guest ! And let me know each time how relieved you feel to make me jealous";
    "message_id" = 28569;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28568;
    "replied_message" = "And thank you for 1-1 showers\Ud83d\Ude0f I\U2019ll do during each one and Im thinking to take a shower twice a day \Ud83e\Udd2a\Ud83e\Udd2a\Ud83e\Udd2a";
    "replied_sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "replied_sender_name" = Esra;
    "reply_to_id" = 28566;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28569, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28569, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
        <UITapGestureRecognizer: 0x13e572e40; id = 3377; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d2e1b80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bf200>)>>
    }>, <UITapGestureRecognizer: 0x13e572e40; id = 3377; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d2e1b80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bf200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d47c600; id = 3376; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d2e1b80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d2e1b80>)>>
    }>])
        <UITapGestureRecognizer: 0x13e572e40; id = 3377; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d2e1b80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bf200>)>>
    }>, <UITapGestureRecognizer: 0x13e572e40; id = 3377; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d2e1b80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bf200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d47c600; id = 3376; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d2e1b80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d2e1b80>)>>
    }>])
        <UITapGestureRecognizer: 0x13c628b40; id = 3436; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d411e00>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bed00>)>>
    }>, <UITapGestureRecognizer: 0x13c628b40; id = 3436; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d411e00>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bed00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d198a00; id = 3435; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d411e00>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d411e00>)>>
    }>])
        <UITapGestureRecognizer: 0x13c628b40; id = 3436; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d411e00>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bed00>)>>
    }>, <UITapGestureRecognizer: 0x13c628b40; id = 3436; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d411e00>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2bed00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d198a00; id = 3435; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d411e00>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d411e00>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
        <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>>
    }>, <UITapGestureRecognizer: 0x13d063340; id = 3495; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x13d2be800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13d7ad600; id = 3494; state = Possible; view = <Eye.PhotoCropOverlayView: 0x13d3b0780>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x13d3b0780>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28570]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28570, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28570]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-21 17:10:20";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Wooooooow;
    "message_id" = 28571;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28569;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28571, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28572, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-21 17:10:30";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I can feel how demanding she already is !!!!";
    "message_id" = 28572;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28571;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-21 17:10:39";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Thank you my love, thank you !";
    "message_id" = 28573;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28572;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
0   Eye                                 0x00000001004a9cd0 Eye + 728272
1   Eye                                 0x00000001004aecd4 Eye + 748756
2   Eye                                 0x00000001004aee90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-21 17:11:28";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I want her so deeply, he is desperate. Really.";
    "message_id" = 28575;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28574;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28575, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
0   Eye                                 0x00000001004a9cd0 Eye + 728272
1   Eye                                 0x00000001004aecd4 Eye + 748756
2   Eye                                 0x00000001004aee90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x00000001004a9cd0 Eye + 728272
1   Eye                                 0x00000001004aecd4 Eye + 748756
2   Eye                                 0x00000001004aee90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x00000001004a9cd0 Eye + 728272
1   Eye                                 0x00000001004aecd4 Eye + 748756
2   Eye                                 0x00000001004aee90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102d0dcd0 Eye + 728272
1   Eye                                 0x0000000102d12cd4 Eye + 748756
2   Eye                                 0x0000000102d12e90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102d0dcd0 Eye + 728272
1   Eye                                 0x0000000102d12cd4 Eye + 748756
2   Eye                                 0x0000000102d12e90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102d0dcd0 Eye + 728272
1   Eye                                 0x0000000102d12cd4 Eye + 748756
2   Eye                                 0x0000000102d12e90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102d0dcd0 Eye + 728272
1   Eye                                 0x0000000102d12cd4 Eye + 748756
2   Eye                                 0x0000000102d12e90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28582, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28583]
    "content-available" = 1;
}, AnyHashable("message_id"): 28584, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28585, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-21 18:50:38";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "True ! Tongue, feet, breast. Even nose !";
    "message_id" = 28586;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28585;
    "replied_message" = "What if I touch you with my tongue \Ud83d\Ude0f";
    "replied_sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "replied_sender_name" = Esra;
    "reply_to_id" = 28585;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28586, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28586, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28587, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-21 18:51:09";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "That's true my baby. I'm very far from a sexy boy. At least to my eyes. Different from your point of view I assume...";
    "message_id" = 28587;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28586;
    "replied_message" = "Baby, are you kidding me \Ud83d\Ude44\Ud83d\Ude44\Ud83d\Ude44 just legs?! Come ooon!!";
    "replied_sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "replied_sender_name" = Esra;
    "reply_to_id" = 28584;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28587, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28588, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28589]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28590]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28599]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28600]
    "content-available" = 1;
}, AnyHashable("message_id"): 28604, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28606, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 05:34:17";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Good morning my looooove, my mistress, my goddess, my addiction, my world of desires !!!";
    "message_id" = 28606;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28605;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28606]
    "crypto_version" = 0;
    datesent = "2026-04-22 07:46:54";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "21 minutes already today and it's not even 10am for me !";
    "message_id" = 28630;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28629;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28630]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
0   Eye                                 0x0000000102695cd0 Eye + 728272
1   Eye                                 0x000000010269acd4 Eye + 748756
2   Eye                                 0x000000010269ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("session_id"): iosILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): <null>, AnyHashable("type"): camera_connected]
0   Eye                                 0x0000000102695cd0 Eye + 728272
1   Eye                                 0x000000010269acd4 Eye + 748756
2   Eye                                 0x000000010269ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102695cd0 Eye + 728272
1   Eye                                 0x000000010269acd4 Eye + 748756
2   Eye                                 0x000000010269ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
        <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>>
    }>, <UITapGestureRecognizer: 0x11a52e940; id = 1928; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1258b2800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x127b35c00; id = 1927; state = Possible; view = <Eye.PhotoCropOverlayView: 0x130cc6f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x130cc6f80>)>>
    }>])
0   Eye                                 0x0000000102695cd0 Eye + 728272
1   Eye                                 0x000000010269acd4 Eye + 748756
2   Eye                                 0x000000010269ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102695cd0 Eye + 728272
1   Eye                                 0x000000010269acd4 Eye + 748756
2   Eye                                 0x000000010269ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "LocalDataTask <35C330CA-A429-4EA3-BCCB-2B688547D9BA>.<89>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE, NSErrorFailingURLKey=https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE, _kCFStreamErrorDomainKey=4} - keeping existing messages
    "LocalDataTask <2810860D-255B-4AFB-B080-CD501BA82CA5>.<92>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE, NSErrorFailingURLKey=https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE, _kCFStreamErrorDomainKey=4} - keeping existing messages
    "content-available" = 1;
}, AnyHashable("message_id"): 28632, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:51:58";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Do you see my camera baby ?";
    "message_id" = 28632;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28631;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28633]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28635, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28637, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28638, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:53:33";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I just got your 6 messages in one go";
    "message_id" = 28639;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28638;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28639]
    "content-available" = 1;
}]
    "crypto_version" = 1;
    datesent = "2026-04-22 07:53:45";
    "file_name" = "f2317109ac17cc77.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28640;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 783184;
    "prev_session_message_id" = 28639;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_f2317109ac17cc77.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28640]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28640, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:53:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Was it the right sequence ?";
    "message_id" = 28641;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28640;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28641]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28641, AnyHashable("session_id"): ILUIWU]
0   Eye                                 0x0000000105005cd0 Eye + 728272
1   Eye                                 0x000000010500acd4 Eye + 748756
2   Eye                                 0x000000010500ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28642, AnyHashable("session_id"): ILUIWU]
        <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>>
    }>, <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x128bb3800; id = 1280; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x128e2d900>)>>
    }>])
        <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>>
    }>, <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x128bb3800; id = 1280; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x128e2d900>)>>
    }>])
        <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>>
    }>, <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x128bb3800; id = 1280; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x128e2d900>)>>
    }>])
        <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>>
    }>, <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x128bb3800; id = 1280; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x128e2d900>)>>
    }>])
        <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>>
    }>, <UITapGestureRecognizer: 0x12ed0df40; id = 1281; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x128c87700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x128bb3800; id = 1280; state = Possible; view = <Eye.PhotoCropOverlayView: 0x128e2d900>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x128e2d900>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28643, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 07:54:48";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "The one after \"Look where I am end of month\" ?";
    "message_id" = 28644;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28643;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28645, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:55:01";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Oh nice !";
    "message_id" = 28645;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28644;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28645]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28646, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:55:07";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "With Emrah again ?";
    "message_id" = 28646;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28645;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 07:55:57";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Cool ! And your husband also ?";
    "message_id" = 28650;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28649;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28650]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 07:56:16";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "End May right ?";
    "message_id" = 28652;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28651;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28652]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28654, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28655, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28627, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28656, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:56:37";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I may be in Portugal at these dates for a workshop.";
    "message_id" = 28656;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28655;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28657, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:56:44";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "A full week is long !";
    "message_id" = 28657;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28656;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28657, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 07:57:22";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And mountains also";
    "message_id" = 28660;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28659;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28660]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28661, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 07:57:49";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "For Portugal or for a long full week ?";
    "message_id" = 28661;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28660;
    "replied_message" = "Oh\Ud83d\Ude25";
    "replied_sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "replied_sender_name" = Esra;
    "reply_to_id" = 28658;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28659]
    "content-available" = 1;
}, AnyHashable("message_id"): 28660]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28661, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("type"): camera_connected, AnyHashable("session_id"): iosILUIWU]
    "content-available" = 1;
}, AnyHashable("type"): camera_connected, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28664, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28662, AnyHashable("session_id"): ILUIWU]
        <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>>
    }>, <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>; must-fail = {
        <UIPanGestureRecognizer: 0x15917ec00; id = 629; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x152c2db80>)>>
    }>])
        <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>>
    }>, <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>; must-fail = {
        <UIPanGestureRecognizer: 0x15917ec00; id = 629; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x152c2db80>)>>
    }>])
        <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>>
    }>, <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>; must-fail = {
        <UIPanGestureRecognizer: 0x15917ec00; id = 629; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x152c2db80>)>>
    }>])
        <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>>
    }>, <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>; must-fail = {
        <UIPanGestureRecognizer: 0x15917ec00; id = 629; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x152c2db80>)>>
    }>])
        <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>>
    }>, <UITapGestureRecognizer: 0x159365180; id = 630; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x152295900>)>; must-fail = {
        <UIPanGestureRecognizer: 0x15917ec00; id = 629; state = Possible; view = <Eye.PhotoCropOverlayView: 0x152c2db80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x152c2db80>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28665]
    "content-available" = 1;
}, AnyHashable("message_id"): 28665]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:00:40";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Ah that may be a good root cause base. Thanks baby, will check when back home";
    "message_id" = 28667;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28666;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28667, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28666]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28667, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28668, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28669, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28671, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28672, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28673, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:04:18";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Nice ! And you had to be in office absolutely?";
    "message_id" = 28673;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28672;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:04:34";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Yeah \Ud83c\Udf89";
    "message_id" = 28675;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28674;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28675, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28675]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:04:58";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Tomorrow I'll try to be home";
    "message_id" = 28676;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28675;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28676, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:05:12";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Ah nice !";
    "message_id" = 28678;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28677;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28678, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28678, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:05:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Happy bday to my baby's friend";
    "message_id" = 28680;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28679;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:05:27";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Yes I saw this morning !";
    "message_id" = 28682;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28681;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28682, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_id"): 28682, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:05:47";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Hence not alone next 4 days \Ud83d\Ude22";
    "message_id" = 28683;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28682;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28683, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28683, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "LocalWebSocketTask <20FA9C02-CE77-4D44-AE4B-B9B31687A07B>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <20FA9C02-CE77-4D44-AE4B-B9B31687A07B>.<1>}
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:06:39";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Anyway, we always found ways and we will always find ways";
    "message_id" = 28685;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28684;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "LocalWebSocketTask <FA39F3A6-93B8-4923-904D-F9DABF90AC1D>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <FA39F3A6-93B8-4923-904D-F9DABF90AC1D>.<1>}
    "crypto_version" = 0;
    datesent = "2026-04-22 08:06:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And one of your orders is anyway recurrent day on day";
    "message_id" = 28686;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28685;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28686, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "LocalWebSocketTask <643A5127-AD67-4710-9CAB-5D0809B24326>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <643A5127-AD67-4710-9CAB-5D0809B24326>.<1>}
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28693, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28691]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28690]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28689, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28692]
    "content-available" = 1;
}, AnyHashable("message_id"): 28694, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28696, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28697, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:25";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I have baby";
    "message_id" = 28698;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28697;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28698, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}]
    "crypto_version" = 1;
    datesent = "2026-04-22 08:19:42";
    "file_name" = "2f5ae78d2850faab.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28699;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 2469098;
    "prev_session_message_id" = 28698;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_2f5ae78d2850faab.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28699, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28699]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28699, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28699, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28700, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28702]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28702]
0   Eye                                 0x0000000103071cd0 Eye + 728272
1   Eye                                 0x0000000103076cd4 Eye + 748756
2   Eye                                 0x0000000103076e90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:57:42";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "The attraction you have on me is really amazing, can really feel it physically.";
    "message_id" = 28706;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28705;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28705, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28706, AnyHashable("operation_type"): 3]
0   Eye                                 0x0000000104e89cd0 Eye + 728272
1   Eye                                 0x0000000104e8ecd4 Eye + 748756
2   Eye                                 0x0000000104e8ee90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28709, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 10:07:58";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Yes my love";
    "message_id" = 28709;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28708;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28709, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 10:08:04";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\Ud83d\Ude0d\Ud83d\Ude0d\Ud83d\Ude0d\Ud83d\Ude0d\Ud83d\Ude0d\Ud83d\Ude0d\Ud83d\Ude0d\Ud83d\Ude0d";
    "message_id" = 28710;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28709;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28710, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_id"): 28712, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28713]
    "content-available" = 1;
}]
0   Eye                                 0x0000000102d15cd0 Eye + 728272
1   Eye                                 0x0000000102d1acd4 Eye + 748756
2   Eye                                 0x0000000102d1ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
0   Eye                                 0x0000000102d15cd0 Eye + 728272
1   Eye                                 0x0000000102d1acd4 Eye + 748756
2   Eye                                 0x0000000102d1ae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28717]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28719]
    "content-available" = 1;
}, AnyHashable("message_id"): 28720]
0   Eye                                 0x00000001047a5cd0 Eye + 728272
1   Eye                                 0x00000001047aacd4 Eye + 748756
2   Eye                                 0x00000001047aae90 Eye + 749200
3   UIKitCore                           0x0000000189ff1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x0000000189ff1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x0000000189ff11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000189b35a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x0000000189afa310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000018f6eb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000018f729c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "crypto_version" = 0;
    datesent = "2026-04-22 14:41:47";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Great !";
    "message_id" = 28721;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28720;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28721, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28721, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28723, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28725, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Hence now \Ud83d\Ude0a";
    "message_id" = 28727;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28726;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28727]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28726]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:57";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Oh;
    "message_id" = 28728;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28727;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:59";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Sorry babyyy";
    "message_id" = 28729;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28728;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28731, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:12";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "You'll okay a bit later today or not at all ?";
    "message_id" = 28731;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28730;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_id"): 28731, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
        <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>>
    }>, <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x10e3f3c00; id = 1227; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfb9680>)>>
    }>])
        <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>>
    }>, <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x10e3f3c00; id = 1227; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfb9680>)>>
    }>])
        <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>>
    }>, <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x10e3f3c00; id = 1227; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfb9680>)>>
    }>])
        <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>>
    }>, <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x10e3f3c00; id = 1227; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfb9680>)>>
    }>])
        <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>>
    }>, <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x10e3f3c00; id = 1227; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfb9680>)>>
    }>])
        <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>>
    }>, <UITapGestureRecognizer: 0x10d2e3840; id = 1228; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x10e1f8a00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x10e3f3c00; id = 1227; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfb9680>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfb9680>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:41";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Just finished my last call. Now working on messages issues on \Ud83d\Udc41\Ufe0f.";
    "message_id" = 28733;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28732;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:53";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Hello my loooove";
    "message_id" = 28736;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28735;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28736]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28737]
        <UITapGestureRecognizer: 0x10e31c500; id = 1746; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfbb480>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c514500>)>>
    }>, <UITapGestureRecognizer: 0x10e31c500; id = 1746; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfbb480>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c514500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x130d3f200; id = 1745; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfbb480>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfbb480>)>>
    }>])
        <UITapGestureRecognizer: 0x10e31c500; id = 1746; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfbb480>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c514500>)>>
    }>, <UITapGestureRecognizer: 0x10e31c500; id = 1746; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfbb480>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c514500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x130d3f200; id = 1745; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10dfbb480>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10dfbb480>)>>
    }>])
        <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>>
    }>, <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x111715a00; id = 1804; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10e24a580>)>>
    }>])
        <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>>
    }>, <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x111715a00; id = 1804; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10e24a580>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28738, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:14";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I need these legs";
    "message_id" = 28738;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28737;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
        <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>>
    }>, <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x111715a00; id = 1804; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10e24a580>)>>
    }>])
        <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>>
    }>, <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x111715a00; id = 1804; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10e24a580>)>>
    }>])
        <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>>
    }>, <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x111715a00; id = 1804; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10e24a580>)>>
    }>])
        <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>>
    }>, <UITapGestureRecognizer: 0x111640280; id = 1805; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12c515e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x111715a00; id = 1804; state = Possible; view = <Eye.PhotoCropOverlayView: 0x10e24a580>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x10e24a580>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:17";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Hardly;
    "message_id" = 28739;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28738;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:28";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "My babyyy";
    "message_id" = 28742;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28741;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28743]
    "content-available" = 1;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:49";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "They won't anymore after tonight's shower \Ud83d\Ude09";
    "message_id" = 28744;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28743;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28744]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:27";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Aren't you slightly less willing after coming like it is the case for men ?";
    "message_id" = 28748;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28747;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28748, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28752, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28798]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28804, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 2;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 05:29:00";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Does it mean... he was playful ?";
    "message_id" = 28810;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28809;
    "replied_message" = "\Ud83e\Udd2d";
    "replied_sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "replied_sender_name" = Esra;
    "reply_to_id" = 28808;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("replied_sender_name"): Esra, AnyHashable("sender_name"): Laurent, AnyHashable("datesent"): 2026-04-23 05:29:00, AnyHashable("replied_sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("replied_message"): 🤭, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28810, AnyHashable("thumb_file_name"): , AnyHashable("message"): Does it mean... he was playful ?, AnyHashable("reply_to_id"): 28808, AnyHashable("operation_type"): 0, AnyHashable("timer"): 0, AnyHashable("message_type"): 0]
[08:38:36] [BACKGROUND] Background fetch triggered
[08:38:36] [BACKGROUND] Fetching recent messages for pre-cache
[08:38:36] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[08:38:36] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[08:38:36] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[08:38:36] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[08:38:36] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:38:36] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:38:36] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28723, 28722]
[08:38:36] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28723, 28722]
[08:38:36] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:38:36] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[08:38:36] [BACKGROUND] Pre-downloaded 0 thumbnails
[08:38:36] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[08:46:26] [BACKGROUND] Background fetch triggered
[08:46:26] [BACKGROUND] Fetching recent messages for pre-cache
[08:46:27] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[08:46:27] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[08:46:27] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[08:46:27] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[08:46:27] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:46:27] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:46:27] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28723, 28722]
[08:46:27] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28723, 28722]
[08:46:27] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:46:27] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[08:46:27] [BACKGROUND] Pre-downloaded 0 thumbnails
[08:46:27] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[08:54:18] [BACKGROUND] Background fetch triggered
[08:54:18] [BACKGROUND] Fetching recent messages for pre-cache
[08:54:19] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[08:54:19] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[08:54:19] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[08:54:19] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[08:54:19] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:54:19] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:54:19] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28723, 28722]
[08:54:19] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28723, 28722]
[08:54:19] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:54:19] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[08:54:19] [BACKGROUND] Pre-downloaded 0 thumbnails
[08:54:19] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:02:14] [BACKGROUND] Background fetch triggered
[09:02:14] [BACKGROUND] Fetching recent messages for pre-cache
[09:02:15] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:02:15] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:02:15] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:02:15] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:02:15] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:02:15] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:02:15] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28723, 28722]
[09:02:15] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28723, 28722]
[09:02:15] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:02:15] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[09:02:15] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:02:15] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:10:25] [BACKGROUND] Background fetch triggered
[09:10:25] [BACKGROUND] Fetching recent messages for pre-cache
[09:10:25] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:10:26] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:10:26] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:10:26] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:10:26] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:10:26] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:10:26] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28723, 28722]
[09:10:26] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28723, 28722]
[09:10:26] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:10:26] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[09:10:26] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:10:26] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:16:59] [PUSH] Silent push received
[09:16:59] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 06:16:59 +0000, appState=2, message_id=28815, type=nil
[09:16:59] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:16:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 06:16:59 +0000
[09:16:59] [PUSH_TRACE] ⬇️ Processing embedded message_id=28815
[09:16:59] [PUSH_EMBED] 📩 Received embedded message: id=28815, type=0, sender=Laurent
[09:16:59] [PUSH_TRACE] ⬇️ Message details: text="Any plans for today baby ?...", datesent=2026-04-23 06:16:56
[09:16:59] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:16:59] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28815
[09:16:59] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28815
[09:16:59] [PUSH_EMBED] ✅ Saved message 28815 to local DB (sync)
[09:16:59] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28815
[09:16:59] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28815
[09:16:59] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28815
[09:16:59] [PUSH_TRACE] 📦 Cache state: valid=true, count=52, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[09:16:59] [PUSH_EMBED] Inserted message 28815 into existing cache (now 53 messages)
[09:16:59] [PUSH_TRACE] 📦 ✅ Inserted message 28815, cache now has IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:16:59] [PUSH_TRACE] 📦 EXITING cache update queue for message 28815
[09:16:59] [PUSH_EMBED] Fetching evolution data for message 28815 in background
[09:16:59] [PUSH_EMBED] ✅ Fully processed message 28815
[09:16:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28815
[09:16:59] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=true
[09:16:59] [PUSH] Embedded message handled instantly from silent push
[09:16:59] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[09:16:59] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28815
[09:16:59] [PUSH_EMBED] Got evolution data for message 28815, saving to local DB
[09:16:59] [PUSH_EMBED] Saved evolution data for message 28815
[09:18:25] [BACKGROUND] Background fetch triggered
[09:18:25] [BACKGROUND] Fetching recent messages for pre-cache
[09:18:26] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:18:26] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:18:26] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:18:26] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:18:26] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:18:26] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:18:26] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[09:18:26] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[09:18:26] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:18:26] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[09:18:26] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:18:26] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:26:25] [BACKGROUND] Background fetch triggered
[09:26:25] [BACKGROUND] Fetching recent messages for pre-cache
[09:26:25] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:26:26] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:26:26] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:26:26] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:26:26] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:26:26] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:26:26] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[09:26:26] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[09:26:26] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:26:26] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[09:26:26] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:26:26] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:33:50] [BACKGROUND] Background fetch triggered
[09:33:50] [BACKGROUND] Fetching recent messages for pre-cache
[09:33:51] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:33:51] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:33:51] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:33:51] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:33:51] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:33:51] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:33:51] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[09:33:51] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[09:33:51] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:33:51] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[09:33:51] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:33:51] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:41:23] [BACKGROUND] Background fetch triggered
[09:41:23] [BACKGROUND] Fetching recent messages for pre-cache
[09:41:24] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:41:24] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:41:24] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:41:24] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:41:24] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:41:24] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:41:24] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[09:41:24] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[09:41:24] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:41:24] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[09:41:24] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:41:24] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:49:45] [BACKGROUND] Background fetch triggered
[09:49:45] [BACKGROUND] Fetching recent messages for pre-cache
[09:49:46] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:49:46] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:49:46] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:49:46] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:49:46] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:49:46] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:49:46] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[09:49:46] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[09:49:46] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:49:46] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[09:49:46] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:49:46] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:57:35] [BACKGROUND] Background fetch triggered
[09:57:35] [BACKGROUND] Fetching recent messages for pre-cache
[09:57:36] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:57:36] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:57:36] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:57:36] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:57:36] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:57:36] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:57:36] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[09:57:36] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[09:57:36] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:57:36] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[09:57:36] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:57:36] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[10:05:49] [BACKGROUND] Background fetch triggered
[10:05:49] [BACKGROUND] Fetching recent messages for pre-cache
[10:05:49] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[10:05:49] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:05:49] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:05:49] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:05:49] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:05:49] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:05:49] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28724, 28723, 28722]
[10:05:49] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28724, 28723, 28722]
[10:05:49] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:05:49] [BACKGROUND] Pre-cached 53 ChatMessage objects for instant display (preserved 3 from push)
[10:05:49] [BACKGROUND] Pre-downloaded 0 thumbnails
[10:05:49] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[10:10:34] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:10:34] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:10:35] [CLIENT_SIG] WebSocket opened
[10:10:35] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:10:35] [CLIENT_SIG] Connected! clientId=iW8qLtABWJ-E5Fjx
[10:10:35] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:10:35] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)[10:10:37] [LOG] Pruned 26 entries older than 3 hours
[10:10:37] [SECURITY] Restored real session: ILUIWU
[10:10:37] [SECURITY] Restored real session: ILUIWU
[10:10:37] [SECURITY] Saved real session: ILUIWU
[10:10:37] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[10:10:37] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:10:37] [UPLOAD_QUEUE] ✅ Database integrity check passed
[10:10:37] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[10:10:37] Documents Directory: /var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/Documents
[10:10:37] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[10:10:37] [CAPTURE_HOST] live-feed moved hosted view to plain container
[10:10:37] [THEME] Applying current theme
[10:10:37] [CHAT] Applied day theme (mode: day)
[10:10:37] [SECURITY] Saved real session: ILUIWU
[10:10:37] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[10:10:37] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:10:37] [NETWORK] Network monitor started
[10:10:37] [NETWORK] Status changed: connected
[10:10:37] Did transition
[10:10:37] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[10:10:37] [VIEWER] Screen lock enabled - normal idle behavior
[10:10:37] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[10:10:37] [VCC] ========== VideoConnectionClass INIT ==========
[10:10:37] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[10:10:37] [DATA AUDIO] ========== setupWebRTC() START ==========
[10:10:37] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[10:10:37] [DATA AUDIO] Creating encoder/decoder factories...
[10:10:37] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[10:10:37] [CODEC] Viewer selected encoder: AV1 (best quality)
[10:10:37] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[10:10:37] [DATA AUDIO] ✅ Factory created
[10:10:37] [DATA AUDIO] RTCAudioSession locked
[10:10:37] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[10:10:37] [DATA AUDIO] RTCAudioSession unlocked
[10:10:37] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[10:10:37] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[10:10:37] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[10:10:37] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:10:37] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[10:10:37] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[10:10:37] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:10:37] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[10:10:37] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[10:10:37] Did transition
[10:10:37] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[10:10:37] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:10:37] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:10:37] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:10:37] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[10:10:37] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:10:37] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[10:10:37] [READBY_OPT] No message IDs to fetch - skipping server call
[10:10:37] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[10:10:37] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[10:10:37] [GALLERY_DB] Raw datesent for msg 28718: '2026-04-22 12:02:50'
[10:10:37] [GALLERY_DB] ✅ Loaded 1255 media messages
[10:10:37] [MIGRATION] No messages need sender_name backfill
[10:10:37] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[10:10:37] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[10:10:37] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[10:10:37] [USER] ✅ User registered successfully
[10:10:37] [USER] User registration successful
[10:10:37] [INCREMENTAL_SYNC] ✅ No new messages
[10:10:37] [GALLERY] Filtered 1255 -> 1232 (only with local thumbnails)
[10:10:37] [GALLERY] First 5 after sort (newest first):
[10:10:37] [GALLERY]   0: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[10:10:37] [GALLERY]   1: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[10:10:37] [GALLERY]   2: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[10:10:37] [GALLERY]   3: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[10:10:37] [GALLERY]   4: id=28713, date=2026-04-22 10:12:56, file=55cec5a39e78220e.jpg
[10:10:38] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[10:10:38] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[10:10:38] [SERVER] Starting reconnect polling (5s interval)
[10:10:38] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[10:10:38] [ICONS] Offset applied: -14.6
[10:10:38] [ICONS] New left margin: 11.2, New right margin: 11.3
[10:10:38] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[10:10:38] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:10:38] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:10:38] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:10:38] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[10:10:38] [ICONS] Chat center: (31.2, 87.0)
[10:10:38] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[10:10:38] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[10:10:38] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[10:10:38] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[10:10:38] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[10:10:38] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[10:10:38] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[10:10:38] [ICONS] Screen width: 440.0
[10:10:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:10:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28815, 28814, 28813, 28812, 28811]
[10:10:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:10:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:38] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:10:38] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[10:10:38] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:10:38] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[10:10:38] [CELL_UPLOAD] configure: msgId=28734, file=653beabd4db198ba.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:10:38] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:10:38] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=653beabd4db198ba.jpg, overlayExists=true
[10:10:38] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[10:10:38] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28811 → 28812
[10:10:38] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28812 → 28813
[10:10:38] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28813 → 28814
[10:10:38] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28814 → 28815
[10:10:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:10:38] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[10:10:38] [UNSENT_RETRY] Checking for unsent messages...
[10:10:38] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[10:10:38] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[10:10:38] [UPLOAD_RECOVERY] Session: ILUIWU
[10:10:38] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[10:10:38] [UPLOAD_RECOVERY] Checking recent media messages on server...
[10:10:38] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[10:10:38] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[10:10:38] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[10:10:38] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[10:10:38] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[10:10:38] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28362, file=99bb302f2e76748c.jpg, upload_status=complete
[10:10:38] new_session POST ok: token len=157
[10:10:38] HELLO → sent (fetched token, role=query)
[10:10:38] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[10:10:38] [PENDING_UPLOAD] Total pending upload messages: 0
[10:10:38] [UNSENT_RETRY] No unsent messages found
[10:10:38] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3725, currentOffset=3725
[10:10:38] [SCROLL] Scrolling to 3725, animated=false
[10:10:38] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=false
[10:10:38] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:10:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:10:38] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28815
[10:10:38] [PUSH] handlePollEventsNotification userInfo: [:]
[10:10:38] [PUSH] No message_id in userInfo
[10:10:38] [PUSH] No operation_type in userInfo
[10:10:38] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:10:38] [PUSH_TRACE] 📬 POLL: cache state: valid=false, count=0, IDs=[]
[10:10:38] [PUSH_TRACE] 📬 POLL: memory state: count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:38] [FAST_REFRESH] Already have 50 messages in memory
[10:10:38] [FAST_REFRESH] maxMemoryId=28815, maxLocalId=28815
[10:10:38] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:10:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:10:38] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:10:38] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:10:38] [READBY_OPT] No message IDs to fetch - skipping server call
[10:10:38] [GAP_FIX] Incremental sync will use since_id=28815 (background max=0, current DB max=28815)
[10:10:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[10:10:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[10:10:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[10:10:38] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:10:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:10:38] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:10:38] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[10:10:38] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[10:10:38] [SIG] hello_ok received for query connection - ready to query agents
[10:10:38] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[10:10:38] [SIG] get_agents request sent for sessionId=ILUIWU
[10:10:38] [SIG] get_agents request sent for sessionId=iosILUIWU
[10:10:38] [SERVER] Stopped reconnect polling
[10:10:38] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:10:38] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[10:10:38] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[10:10:38] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:10:38] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[10:10:38] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[10:10:38] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[10:10:38] [SERVER] Starting reconnect polling (5s interval)
[10:10:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=73
[10:10:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28815, 28814, 28813, 28812, 28811]
[10:10:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:10:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:38] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:10:38] [SCROLL] wasNearBottom=true, threshold=758, offset=3725, contentH=4483, boundsH=758, forceScroll=true
[10:10:38] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:10:38] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[10:10:38] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3725, currentOffset=3725
[10:10:38] [SCROLL] Scrolling to 3725, animated=false
[10:10:38] [UPLOAD_RECOVERY] ✅ All media files verified on server
[10:10:38] [INCREMENTAL_SYNC] ✅ No new messages
[10:10:38] [FAST_REFRESH] Incremental sync complete - 50 messages
[10:10:40] [PUSH] Silent push received
[10:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=0, message_id=nil, type=nil
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[10:10:40] [PUSH_EMBED] No embedded message_data in notification
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:10:40] [PUSH] No embedded data, pre-loading messages from server
[10:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:10:40] [CLIENT_SIG] Event received: type=3 messageId=28812
[10:10:40] [WS_EVENT] Received event: type=3, messageId=28812
[10:10:40] [WS_EVENT] Read receipt for message 28812 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:10:40] [PUSH] Silent push received
[10:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=0, message_id=nil, type=nil
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[10:10:40] [PUSH_EMBED] No embedded message_data in notification
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:10:40] [PUSH] No embedded data, pre-loading messages from server
[10:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:10:40] [CLIENT_SIG] Event received: type=3 messageId=28813
[10:10:40] [WS_EVENT] Received event: type=3, messageId=28813
[10:10:40] [WS_EVENT] Read receipt for message 28813 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:10:40] [CLIENT_SIG] Event received: type=3 messageId=28815
[10:10:40] [WS_EVENT] Received event: type=3, messageId=28815
[10:10:40] [WS_EVENT] Read receipt for message 28815 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:10:40] [CLIENT_SIG] Event received: type=3 messageId=28814
[10:10:40] [WS_EVENT] Received event: type=3, messageId=28814
[10:10:40] [WS_EVENT] Read receipt for message 28814 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:10:40] [PUSH] Silent push received
[10:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=0, message_id=nil, type=nil
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[10:10:40] [PUSH_EMBED] No embedded message_data in notification
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:10:40] [PUSH] No embedded data, pre-loading messages from server
[10:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:10:40] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:10:40] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:10:40] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[10:10:40] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:10:40] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:10:40] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:10:40] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28815
[10:10:40] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28812, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:10:40] [PUSH] Parsed message_id: 28812
[10:10:40] [PUSH] Parsed operation_type: 3
[10:10:40] [PUSH] Taking direct action: opType=3, messageId=28812
[10:10:40] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28812
[10:10:40] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:10:40] [PUSH] Silent push received
[10:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=0, message_id=nil, type=nil
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[10:10:40] [PUSH_EMBED] No embedded message_data in notification
[10:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=false
[10:10:40] [PUSH] No embedded data, pre-loading messages from server
[10:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:10:40] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:10:40] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:10:40] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:10:40] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:10:40] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:10:40] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28815
[10:10:40] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28813, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[10:10:40] [PUSH] Parsed message_id: 28813
[10:10:40] [PUSH] Parsed operation_type: 3
[10:10:40] [PUSH] Taking direct action: opType=3, messageId=28813
[10:10:40] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28813
[10:10:40] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:10:40] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:10:40] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[10:10:40] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:10:40] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:10:40] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:40] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:10:40] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28815
[10:10:40] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28814, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:10:40] [PUSH] Parsed message_id: 28814
[10:10:40] [PUSH] Parsed operation_type: 3
[10:10:40] [PUSH] Taking direct action: opType=3, messageId=28814
[10:10:40] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28814
[10:10:41] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:10:41] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:10:41] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:10:41] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:10:41] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:41] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:41] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[10:10:41] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:41] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:10:41] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:10:41] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:41] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:10:41] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28815
[10:10:41] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28815, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
[10:10:41] [PUSH] Parsed message_id: 28815
[10:10:41] [PUSH] Parsed operation_type: 3
[10:10:41] [PUSH] Taking direct action: opType=3, messageId=28815
[10:10:41] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28815
[10:10:42] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:10:42] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:10:43] [SERVER] Polling - attempting to reconnect...
[10:10:43] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:10:43] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:10:45] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:10:45] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[10:10:45] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[10:10:45] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[10:10:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28815, 28814, 28813, 28812]
[10:10:45] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:10:45] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:45] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:10:45] [SCROLL] wasNearBottom=true, threshold=447, offset=4036, contentH=4483, boundsH=447, forceScroll=false
[10:10:45] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:10:45] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:10:45] [SCROLL] 💓 alive, visible=45...52, rows=53, estHeight=0.0, heightCalls=115
[10:10:45] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:10:45] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:10:45] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4113, currentOffset=4113
[10:10:45] [SCROLL] Scrolling to 4113, animated=true
[10:10:45] [CLIENT_SIG] Event received: type=0 messageId=28816
[10:10:45] [WS_EVENT] Received event: type=0, messageId=28816
[10:10:45] [WS_EVENT] 📨 New message notification (msgId=28816) - triggering incremental refresh, currentMsgCount=51
[10:10:45] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[10:10:45] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[10:10:45] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[10:10:45] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28816,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:10:45"}
[10:10:45] [CHAT] receive_message.php JSON: ["file_name": , "message_id": 28816, "datesent_utc": 2026-04-23 07:10:45, "ok": 1, "message_type": 0, "session_id": ILUIWU]
[10:10:45] [DB_UPGRADE] Upgrading message ID: -1 → 28816, preserveOriginalDate=false
[10:10:45] [DB_UPGRADE] ✅ Upgraded -1 → 28816 with send_status=0, 1 row(s) affected
[10:10:45] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28816
[10:10:45] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28816
[10:10:45] ReloadData 9
[10:10:46] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:10:46] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28816]
[10:10:46] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:46] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:46] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:10:46] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[10:10:46] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[10:10:46] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:10:46] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28816, 28815, 28814, 28813, 28812]
[10:10:46] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:10:46] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:46] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:10:46] [SCROLL] wasNearBottom=true, threshold=447, offset=4113, contentH=4560, boundsH=447, forceScroll=true
[10:10:46] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:10:46] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:10:46] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4113, currentOffset=4113
[10:10:46] [SCROLL] Scrolling to 4113, animated=false
[10:10:48] [SERVER] Polling - attempting to reconnect...
[10:10:48] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:10:48] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:10:48] [MENU] dismissAnyExistingMenu called
[10:10:48] [MENU] dismissAnyExistingMenu completed
[10:10:48] [EMOJI_PICKER] Starting emoji picker for message 28814
[10:10:48] [MENU] Created button 'Reply' at index 0
[10:10:48] [MENU] Created button 'Copy' at index 1
[10:10:48] [MENU] Created button 'Delete' at index 2
[10:10:48] [MENU] Menu added at y=504.5
[10:10:48] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x109bc8000; baseClass = UITextView; frame = (44 8; 320 36
[10:10:48] [SCROLL] 💓 alive, visible=44...52, rows=53, estHeight=0.0, heightCalls=60
[10:10:48] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[10:10:48] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[10:10:48] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[10:10:48] [EMOJI_PICKER] ✅ Picker shown at y=371.5
[10:10:49] [MENU] menuButtonTouchDown - button title: Reply, tag: 0
[10:10:49] [MENU] menuButtonTapped - button title: Reply, tag: 0
[10:10:49] [MENU] Button frame: (0.0, 0.0, 120.0, 44.0), superview: true
[10:10:49] [MENU] Found action closure, dismissing menu first
[10:10:49] [MENU] dismissAnyExistingMenu called
[10:10:49] [MENU] Found menu with tag 9999, removing
[10:10:49] [MENU] Removing blur effect
[10:10:49] [MENU] Removing floating message snapshot
[10:10:49] [MENU] Dismissing emoji picker
[10:10:49] [MENU] Recorded dismissal time for debounce
[10:10:49] [MENU] dismissAnyExistingMenu completed
[10:10:49] [MENU] Menu dismissed, executing action
[10:10:49] [REPLY_DEBUG] ✅ startReplyTo called - set messageToReplyTo to message 28814
[10:10:49] [MENU] Action executed
[10:10:49] [SCROLL_END_DECEL] messagesTable offsetY=3803, insetTop=0, pendingVelocityY=0.0
[10:10:49] [SCROLL_BTN] Showing button - 381pt from bottom > half 223pt
[10:10:49] [SCROLL_END_DECEL] messagesTable offsetY=4186, insetTop=0, pendingVelocityY=0.0
[10:10:50] [PUSH] Silent push received
[10:10:50] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:50 +0000, appState=0, message_id=nil, type=nil
[10:10:50] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:50] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:50 +0000
[10:10:50] [PUSH_EMBED] No embedded message_data in notification
[10:10:50] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:10:50] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=false
[10:10:50] [PUSH] No embedded data, pre-loading messages from server
[10:10:50] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:10:50] [CLIENT_SIG] Event received: type=3 messageId=28816
[10:10:50] [WS_EVENT] Received event: type=3, messageId=28816
[10:10:50] [WS_EVENT] Read receipt for message 28816 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:10:50] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:10:50] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:10:50] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:10:50] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:10:50] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:50] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[10:10:50] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28725]
[10:10:50] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28725]
[10:10:50] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:50] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[10:10:50] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:10:50] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:10:50] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:10:50] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28816
[10:10:50] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28816]
[10:10:50] [PUSH] Parsed message_id: 28816
[10:10:50] [PUSH] Parsed operation_type: 3
[10:10:50] [PUSH] Taking direct action: opType=3, messageId=28816
[10:10:50] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28816
[10:10:53] [SERVER] Polling - attempting to reconnect...
[10:10:53] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:10:53] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:10:58] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[10:10:58] [SERVER] Polling - attempting to reconnect...
[10:10:58] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:10:58] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:10:58] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=179ms
[10:11:02] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:11:03] [SERVER] Polling - attempting to reconnect...
[10:11:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:08] [SERVER] Polling - attempting to reconnect...
[10:11:08] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:08] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:09] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:11:09] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:11:09] [SCROLL] 💓 alive, visible=47...52, rows=53, estHeight=0.0, heightCalls=10
[10:11:10] [SCROLL_END_DECEL] messagesTable offsetY=4240, insetTop=0, pendingVelocityY=0.0
[10:11:11] [SCROLL] 💓 alive, visible=47...52, rows=53, estHeight=0.0, heightCalls=0
[10:11:13] [SERVER] Polling - attempting to reconnect...
[10:11:13] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:13] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:16] [REPLY_DEBUG] 📤 didTapSend - Sending message WITH reply to message 28814
[10:11:16] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[10:11:16] [REPLY_DEBUG] 🔗 sendMessage START - Captured reply to message 28814
[10:11:16] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=52
[10:11:16] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[10:11:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-2, 28816, 28815, 28814, 28813]
[10:11:16] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:11:16] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-2, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[10:11:16] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:11:16] [SCROLL] wasNearBottom=true, threshold=447, offset=4186, contentH=4560, boundsH=447, forceScroll=false
[10:11:16] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:11:16] [SCROLL] 💓 alive, visible=46...53, rows=54, estHeight=0.0, heightCalls=61
[10:11:16] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=0
[10:11:16] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:11:16] [REPLY_DEBUG] 🔗 sendMessage HTTP BODY - Added reply_to_id=28814 to request body
[10:11:16] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4209, currentOffset=4209
[10:11:16] [SCROLL] Scrolling to 4209, animated=true
[10:11:16] [SCROLL_END_DECEL] messagesTable offsetY=4209, insetTop=0, pendingVelocityY=0.0
[10:11:16] [CLIENT_SIG] Event received: type=0 messageId=28817
[10:11:16] [WS_EVENT] Received event: type=0, messageId=28817
[10:11:16] [WS_EVENT] 📨 New message notification (msgId=28817) - triggering incremental refresh, currentMsgCount=52
[10:11:16] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:11:16] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28816
[10:11:16] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[10:11:16] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28817,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:11:16"}
[10:11:16] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "message_id": 28817, "file_name": , "datesent_utc": 2026-04-23 07:11:16, "ok": 1, "message_type": 0]
[10:11:16] [DB_UPGRADE] Upgrading message ID: -2 → 28817, preserveOriginalDate=false
[10:11:16] [DB_UPGRADE] ✅ Upgraded -2 → 28817 with send_status=0, 1 row(s) affected
[10:11:16] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 28817
[10:11:16] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 28817
[10:11:16] ReloadData 9
[10:11:16] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:11:16] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28817]
[10:11:17] [REPLY_LOAD] ViewController+Database mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:11:17] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[10:11:17] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[10:11:17] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:11:17] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:11:17] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[10:11:17] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=118
[10:11:17] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28817, 28816, 28815, 28814, 28813]
[10:11:17] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:11:17] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[10:11:17] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:11:17] [SCROLL] wasNearBottom=true, threshold=447, offset=4209, contentH=4656, boundsH=447, forceScroll=true
[10:11:17] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:11:17] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:11:17] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4209, currentOffset=4209
[10:11:17] [SCROLL] Scrolling to 4209, animated=false
[10:11:18] [CAM_CONN] 💓 PING #2 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[10:11:18] [SERVER] Polling - attempting to reconnect...
[10:11:18] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:18] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:18] [MENU] dismissAnyExistingMenu called
[10:11:18] [MENU] dismissAnyExistingMenu completed
[10:11:18] [EMOJI_PICKER] Starting emoji picker for message 28815
[10:11:18] [MENU] Created button 'Reply' at index 0
[10:11:18] [MENU] Created button 'Copy' at index 1
[10:11:18] [MENU] Created button 'Delete' at index 2
[10:11:18] [MENU] Menu added at y=494.0
[10:11:19] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x109bc8000; baseClass = UITextView; frame = (44 8; 320 36
[10:11:19] [SCROLL] 💓 alive, visible=44...53, rows=54, estHeight=0.0, heightCalls=61
[10:11:19] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[10:11:19] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[10:11:19] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[10:11:19] [EMOJI_PICKER] ✅ Picker shown at y=382.0
[10:11:19] [MENU] menuButtonTouchDown - button title: Reply, tag: 0
[10:11:19] [MENU] menuButtonTapped - button title: Reply, tag: 0
[10:11:19] [MENU] Button frame: (0.0, 0.0, 120.0, 44.0), superview: true
[10:11:19] [MENU] Found action closure, dismissing menu first
[10:11:19] [MENU] dismissAnyExistingMenu called
[10:11:19] [MENU] Found menu with tag 9999, removing
[10:11:19] [MENU] Removing blur effect
[10:11:19] [MENU] Removing floating message snapshot
[10:11:19] [MENU] Dismissing emoji picker
[10:11:19] [MENU] Recorded dismissal time for debounce
[10:11:19] [MENU] dismissAnyExistingMenu completed
[10:11:19] [MENU] Menu dismissed, executing action
[10:11:19] [REPLY_DEBUG] ✅ startReplyTo called - set messageToReplyTo to message 28815
[10:11:19] [MENU] Action executed
[10:11:19] [SCROLL_BTN] Showing button - 377pt from bottom > half 223pt
[10:11:19] [SCROLL_END_DECEL] messagesTable offsetY=3904, insetTop=0, pendingVelocityY=0.0
[10:11:19] [SCROLL_END_DECEL] messagesTable offsetY=4282, insetTop=0, pendingVelocityY=0.0
[10:11:23] [SERVER] Polling - attempting to reconnect...
[10:11:23] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:23] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:27] [SCROLL] 💓 alive, visible=48...53, rows=54, estHeight=0.0, heightCalls=9
[10:11:27] [SCROLL_END_DECEL] messagesTable offsetY=4336, insetTop=0, pendingVelocityY=0.0
[10:11:28] [SERVER] Polling - attempting to reconnect...
[10:11:28] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:28] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:29] [SCROLL] 💓 alive, visible=48...53, rows=54, estHeight=0.0, heightCalls=0
[10:11:33] [SERVER] Polling - attempting to reconnect...
[10:11:33] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:33] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:36] [SCROLL] 💓 alive, visible=48...53, rows=54, estHeight=0.0, heightCalls=2
[10:11:36] [SCROLL_END_DECEL] messagesTable offsetY=4299, insetTop=0, pendingVelocityY=0.0
[10:11:38] [CAM_CONN] 💓 PING #3 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[10:11:38] [SERVER] Polling - attempting to reconnect...
[10:11:38] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:38] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:38] [SCROLL] 💓 alive, visible=49...53, rows=54, estHeight=0.0, heightCalls=0
[10:11:38] [SCROLL_END_DECEL] messagesTable offsetY=4353, insetTop=0, pendingVelocityY=0.0
[10:11:39] [REPLY_DEBUG] 📤 didTapSend - Sending message WITH reply to message 28815
[10:11:39] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[10:11:39] [REPLY_DEBUG] 🔗 sendMessage START - Captured reply to message 28815
[10:11:39] [SEND_MESSAGE] ✅ Added optimistic message id=-3 to arrays, newMsgCount=53
[10:11:39] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:11:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-3, 28817, 28816, 28815, 28814]
[10:11:39] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[10:11:39] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-3, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809]
[10:11:39] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[10:11:39] [SCROLL] wasNearBottom=true, threshold=375, offset=4353, contentH=4656, boundsH=375, forceScroll=false
[10:11:39] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[10:11:39] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:11:39] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:11:39] [REPLY_DEBUG] 🔗 sendMessage HTTP BODY - Added reply_to_id=28815 to request body
[10:11:39] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4359, currentOffset=4359
[10:11:39] [SCROLL] Scrolling to 4359, animated=true
[10:11:39] [SCROLL_END_DECEL] messagesTable offsetY=4359, insetTop=0, pendingVelocityY=0.0
[10:11:39] [CLIENT_SIG] Event received: type=0 messageId=28818
[10:11:39] [WS_EVENT] Received event: type=0, messageId=28818
[10:11:39] [WS_EVENT] 📨 New message notification (msgId=28818) - triggering incremental refresh, currentMsgCount=53
[10:11:39] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[10:11:39] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28817, maxMemoryId=28817
[10:11:39] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28817
[10:11:39] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28818,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:11:39"}
[10:11:39] [CHAT] receive_message.php JSON: ["file_name": , "message_type": 0, "ok": 1, "datesent_utc": 2026-04-23 07:11:39, "session_id": ILUIWU, "message_id": 28818]
[10:11:39] [DB_UPGRADE] Upgrading message ID: -3 → 28818, preserveOriginalDate=false
[10:11:39] [DB_UPGRADE] ✅ Upgraded -3 → 28818 with send_status=0, 1 row(s) affected
[10:11:39] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -3 → 28818
[10:11:39] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -3 → 28818
[10:11:39] ReloadData 9
[10:11:39] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:11:39] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28818]
[10:11:39] [REPLY_LOAD] ViewController+Database mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:11:39] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809]
[10:11:39] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 53, first 10 IDs=[28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809]
[10:11:39] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:11:39] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[10:11:39] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[10:11:39] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=179
[10:11:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28818, 28817, 28816, 28815, 28814]
[10:11:39] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[10:11:39] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809]
[10:11:39] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[10:11:39] [SCROLL] wasNearBottom=true, threshold=393, offset=4359, contentH=4752, boundsH=393, forceScroll=true
[10:11:39] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[10:11:40] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:11:40] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4359, currentOffset=4359
[10:11:40] [SCROLL] Scrolling to 4359, animated=false
[10:11:40] [SCROLL] 💓 alive, visible=49...54, rows=55, estHeight=0.0, heightCalls=60
[10:11:43] [SERVER] Polling - attempting to reconnect...
[10:11:43] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:43] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:48] [SERVER] Polling - attempting to reconnect...
[10:11:48] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:48] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:52] [SCROLL] 💓 alive, visible=49...54, rows=55, estHeight=0.0, heightCalls=2
[10:11:53] [SCROLL_END_DECEL] messagesTable offsetY=4359, insetTop=0, pendingVelocityY=0.0
[10:11:53] [SERVER] Polling - attempting to reconnect...
[10:11:53] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:53] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:55] [SCROLL] 💓 alive, visible=49...54, rows=55, estHeight=0.0, heightCalls=0
[10:11:56] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:11:56] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=53, isReloading=false
[10:11:56] [SEND_MESSAGE] ✅ Added optimistic message id=-4 to arrays, newMsgCount=54
[10:11:56] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[10:11:56] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[-4, 28818, 28817, 28816, 28815]
[10:11:56] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:11:56] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-4, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:11:56] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:11:56] [SCROLL] wasNearBottom=true, threshold=447, offset=4305, contentH=4752, boundsH=447, forceScroll=false
[10:11:56] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:11:56] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[10:11:56] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:11:56] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:11:56] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4357, currentOffset=4357
[10:11:56] [SCROLL] Scrolling to 4357, animated=true
[10:11:56] [CLIENT_SIG] Event received: type=0 messageId=28819
[10:11:56] [WS_EVENT] Received event: type=0, messageId=28819
[10:11:56] [WS_EVENT] 📨 New message notification (msgId=28819) - triggering incremental refresh, currentMsgCount=54
[10:11:56] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[10:11:56] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28818, maxMemoryId=28818
[10:11:56] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28818
[10:11:56] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28819,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:11:56"}
[10:11:56] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "datesent_utc": 2026-04-23 07:11:56, "file_name": , "message_type": 0, "ok": 1, "message_id": 28819]
[10:11:56] [DB_UPGRADE] Upgrading message ID: -4 → 28819, preserveOriginalDate=false
[10:11:56] [DB_UPGRADE] ✅ Upgraded -4 → 28819 with send_status=0, 1 row(s) affected
[10:11:56] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -4 → 28819
[10:11:56] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -4 → 28819
[10:11:56] ReloadData 9
[10:11:56] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:11:56] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28819]
[10:11:56] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 54 msgs, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:11:56] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 54, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:11:56] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:11:56] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:11:56] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=54
[10:11:56] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=182
[10:11:56] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28819, 28818, 28817, 28816, 28815]
[10:11:56] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:11:56] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:11:56] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:11:56] [SCROLL] wasNearBottom=true, threshold=447, offset=4357, contentH=4804, boundsH=447, forceScroll=true
[10:11:56] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:11:56] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[10:11:56] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4357, currentOffset=4357
[10:11:56] [SCROLL] Scrolling to 4357, animated=false
[10:11:58] [CAM_CONN] 💓 PING #4 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[10:11:58] [SERVER] Polling - attempting to reconnect...
[10:11:58] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:11:58] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:11:59] [MENU] dismissAnyExistingMenu called
[10:11:59] [MENU] dismissAnyExistingMenu completed
[10:11:59] [SCROLL_BEGIN_DRAG] messagesTable offsetY=4357, insetTop=0, topDistance=4357, rows=56, prefetchedCount=0
[10:11:59] [SCROLL] 💓 alive, visible=49...55, rows=56, estHeight=0.0, heightCalls=63
[10:12:00] [SCROLL_WILL_END] velocity=(0.000, -0.858), currentY=4046, targetY=3622, movingTowardTop=true, decelNow=false, dragging=true
[10:12:00] [SCROLL_WILL_END] captured upward momentum velocityY=-0.8579313678566641
[10:12:00] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=4046, topInset=0, pendingVelocityY=-0.8579313678566641, targetNearTop=4046
[10:12:00] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x109bc8000; baseClass = UITextView; frame = (44 8; 320 36
[10:12:00] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[10:12:00] [SCROLL] 💓 alive, visible=45...55, rows=56, estHeight=0.0, heightCalls=12
[10:12:00] [MENU] dismissAnyExistingMenu called
[10:12:00] [MENU] dismissAnyExistingMenu completed
[10:12:00] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3908, insetTop=0, topDistance=3908, rows=56, prefetchedCount=0
[10:12:00] [SCROLL_WILL_END] velocity=(0.000, 0.000), currentY=3893, targetY=3893, movingTowardTop=false, decelNow=true, dragging=false
[10:12:00] [SCROLL_WILL_END] cleared upward momentum capture
[10:12:00] [SCROLL_END_DRAG] messagesTable decelerate=false, offsetY=3893, topInset=0, pendingVelocityY=0.0, targetNearTop=3893
[10:12:00] [SCROLL_END_DECEL] messagesTable offsetY=3893, insetTop=0, pendingVelocityY=0.0
[10:12:01] [MENU] dismissAnyExistingMenu called
[10:12:01] [MENU] dismissAnyExistingMenu completed
[10:12:01] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3893, insetTop=0, topDistance=3893, rows=56, prefetchedCount=0
[10:12:01] [SCROLL_WILL_END] velocity=(0.000, -1.129), currentY=3850, targetY=3291, movingTowardTop=true, decelNow=false, dragging=true
[10:12:01] [SCROLL_WILL_END] captured upward momentum velocityY=-1.129104016778943
[10:12:01] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3850, topInset=0, pendingVelocityY=-1.129104016778943, targetNearTop=3850
[10:12:01] [SCROLL] 💓 alive, visible=44...53, rows=56, estHeight=0.0, heightCalls=3
[10:12:01] [SCROLL_BTN] Showing button - 385pt from bottom > half 379pt
[10:12:01] [MENU] dismissAnyExistingMenu called
[10:12:01] [MENU] dismissAnyExistingMenu completed
[10:12:01] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3661, insetTop=0, topDistance=3661, rows=56, prefetchedCount=0
[10:12:01] [SCROLL_WILL_END] velocity=(0.000, 0.000), currentY=3661, targetY=3661, movingTowardTop=false, decelNow=true, dragging=false
[10:12:01] [SCROLL_WILL_END] cleared upward momentum capture
[10:12:01] [SCROLL_END_DRAG] messagesTable decelerate=false, offsetY=3661, topInset=0, pendingVelocityY=0.0, targetNearTop=3661
[10:12:01] [SCROLL_END_DECEL] messagesTable offsetY=3661, insetTop=0, pendingVelocityY=0.0
[10:12:02] [MENU] dismissAnyExistingMenu called
[10:12:02] [MENU] dismissAnyExistingMenu completed
[10:12:02] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3661, insetTop=0, topDistance=3661, rows=56, prefetchedCount=0
[10:12:02] [SCROLL] 💓 alive, visible=41...50, rows=56, estHeight=0.0, heightCalls=4
[10:12:03] [SCROLL_WILL_END] velocity=(0.000, 0.000), currentY=3632, targetY=3632, movingTowardTop=false, decelNow=false, dragging=false
[10:12:03] [SCROLL_WILL_END] cleared upward momentum capture
[10:12:03] [SCROLL_END_DRAG] messagesTable decelerate=false, offsetY=3632, topInset=0, pendingVelocityY=0.0, targetNearTop=3632
[10:12:03] [SERVER] Polling - attempting to reconnect...
[10:12:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:12:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:12:03] [MENU] dismissAnyExistingMenu called
[10:12:03] [MENU] dismissAnyExistingMenu completed
[10:12:03] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3632, insetTop=0, topDistance=3632, rows=56, prefetchedCount=0
[10:12:03] [SCROLL_WILL_END] velocity=(0.000, -1.414), currentY=3585, targetY=2884, movingTowardTop=true, decelNow=false, dragging=true
[10:12:03] [SCROLL_WILL_END] captured upward momentum velocityY=-1.4136897784319138
[10:12:03] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3585, topInset=0, pendingVelocityY=-1.4136897784319138, targetNearTop=3585
[10:12:03] [MENU] dismissAnyExistingMenu called
[10:12:03] [MENU] dismissAnyExistingMenu completed
[10:12:03] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3411, insetTop=0, topDistance=3411, rows=56, prefetchedCount=0
[10:12:03] [SCROLL] 💓 alive, visible=37...46, rows=56, estHeight=0.0, heightCalls=10
[10:12:03] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:12:03] [SCROLL_WILL_END] velocity=(0.000, 3.696), currentY=3534, targetY=4046, movingTowardTop=false, decelNow=true, dragging=true
[10:12:03] [SCROLL_WILL_END] cleared upward momentum capture
[10:12:03] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3534, topInset=0, pendingVelocityY=0.0, targetNearTop=3534
[10:12:04] [SCROLL_BTN] Showing button - 298pt from bottom > half 223pt
[10:12:04] [SCROLL_END_DECEL] messagesTable offsetY=4058, insetTop=0, pendingVelocityY=0.0
[10:12:04] [SCROLL] 💓 alive, visible=48...54, rows=56, estHeight=0.0, heightCalls=21
[10:12:04] [SCROLL_END_DECEL] messagesTable offsetY=4357, insetTop=0, pendingVelocityY=0.0
[10:12:05] [PUSH] Silent push received
[10:12:05] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:05 +0000, appState=0, message_id=nil, type=nil
[10:12:05] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:05 +0000
[10:12:05] [PUSH_EMBED] No embedded message_data in notification
[10:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:12:05] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807], handled=false
[10:12:05] [PUSH] No embedded data, pre-loading messages from server
[10:12:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:12:05] [CLIENT_SIG] Event received: type=3 messageId=28819
[10:12:05] [WS_EVENT] Received event: type=3, messageId=28819
[10:12:05] [WS_EVENT] Read receipt for message 28819 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:12:05] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:12:05] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:12:05] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:12:05] [PUSH] Silent push received
[10:12:05] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:05 +0000, appState=0, message_id=nil, type=nil
[10:12:05] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:05 +0000
[10:12:05] [PUSH_EMBED] No embedded message_data in notification
[10:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:12:05] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807], handled=false
[10:12:05] [PUSH] No embedded data, pre-loading messages from server
[10:12:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:12:05] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:12:05] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:12:05] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:12:05] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:05] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[10:12:05] [PRELOAD_CACHE] Preserving 4 push-inserted messages: [28728, 28727, 28726, 28725]
[10:12:05] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=4, IDs=[28728, 28727, 28726, 28725]
[10:12:05] [PUSH_TRACE] 🔀 mergeMessages: merged.count=54, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:05] [PUSH_PRELOAD] ⚡ Pre-cached 54 messages for instant display (preserved 4 from push)
[10:12:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:12:05] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:05] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=4 secsSinceLastPong=7 vccs=0
[10:12:05] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28819
[10:12:05] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28819, AnyHashable("session_id"): ILUIWU]
[10:12:05] [PUSH] Parsed message_id: 28819
[10:12:05] [PUSH] Parsed operation_type: 3
[10:12:05] [PUSH] Taking direct action: opType=3, messageId=28819
[10:12:05] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28819
[10:12:05] [PUSH] Silent push received
[10:12:05] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:05 +0000, appState=0, message_id=nil, type=nil
[10:12:05] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:05 +0000
[10:12:05] [PUSH_EMBED] No embedded message_data in notification
[10:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:12:05] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810], handled=false
[10:12:05] [PUSH] No embedded data, pre-loading messages from server
[10:12:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:12:05] [CLIENT_SIG] Event received: type=3 messageId=28817
[10:12:05] [WS_EVENT] Received event: type=3, messageId=28817
[10:12:05] [WS_EVENT] Read receipt for message 28817 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:12:05] [CLIENT_SIG] Event received: type=3 messageId=28818
[10:12:05] [WS_EVENT] Received event: type=3, messageId=28818
[10:12:05] [WS_EVENT] Read receipt for message 28818 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:12:06] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:12:06] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:12:06] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:12:06] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:12:06] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [PRELOAD_CACHE] Preserving 4 push-inserted messages: [28728, 28727, 28726, 28725]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=4, IDs=[28728, 28727, 28726, 28725]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: merged.count=54, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [PUSH_PRELOAD] ⚡ Pre-cached 54 messages for instant display (preserved 4 from push)
[10:12:06] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:12:06] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=4 secsSinceLastPong=7 vccs=0
[10:12:06] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28819
[10:12:06] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28817, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[10:12:06] [PUSH] Parsed message_id: 28817
[10:12:06] [PUSH] Parsed operation_type: 3
[10:12:06] [PUSH] Taking direct action: opType=3, messageId=28817
[10:12:06] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28817
[10:12:06] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:12:06] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:12:06] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:12:06] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:12:06] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [PRELOAD_CACHE] Preserving 4 push-inserted messages: [28728, 28727, 28726, 28725]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=4, IDs=[28728, 28727, 28726, 28725]
[10:12:06] [PUSH_TRACE] 🔀 mergeMessages: merged.count=54, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [PUSH_PRELOAD] ⚡ Pre-cached 54 messages for instant display (preserved 4 from push)
[10:12:06] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:12:06] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:06] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=4 secsSinceLastPong=8 vccs=0
[10:12:06] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28819
[10:12:06] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28818, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:12:06] [PUSH] Parsed message_id: 28818
[10:12:06] [PUSH] Parsed operation_type: 3
[10:12:06] [PUSH] Taking direct action: opType=3, messageId=28818
[10:12:06] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28818
[10:12:08] [SERVER] Polling - attempting to reconnect...
[10:12:08] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:12:08] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:12:11] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:12:11] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=54, isReloading=false
[10:12:11] [SEND_MESSAGE] ✅ Added optimistic message id=-5 to arrays, newMsgCount=55
[10:12:11] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[10:12:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[-5, 28819, 28818, 28817, 28816]
[10:12:11] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 55 messages
[10:12:11] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-5, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:11] [RELOAD_TAB] 📊 Building chatRows from 55 messages
[10:12:11] [SCROLL] wasNearBottom=true, threshold=447, offset=4357, contentH=4804, boundsH=447, forceScroll=false
[10:12:11] [RELOAD_TAB] 📊 Built 57 chatRows, estHeight=0.0
[10:12:11] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[10:12:11] [SCROLL] 💓 alive, visible=50...56, rows=57, estHeight=0.0, heightCalls=122
[10:12:11] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:12:11] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:12:11] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4409, currentOffset=4409
[10:12:11] [SCROLL] Scrolling to 4409, animated=true
[10:12:11] [CLIENT_SIG] Event received: type=0 messageId=28820
[10:12:11] [WS_EVENT] Received event: type=0, messageId=28820
[10:12:11] [WS_EVENT] 📨 New message notification (msgId=28820) - triggering incremental refresh, currentMsgCount=55
[10:12:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=55
[10:12:11] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28819, maxMemoryId=28819
[10:12:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28819
[10:12:11] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28820,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:12:11"}
[10:12:11] [CHAT] receive_message.php JSON: ["ok": 1, "session_id": ILUIWU, "file_name": , "datesent_utc": 2026-04-23 07:12:11, "message_type": 0, "message_id": 28820]
[10:12:11] [DB_UPGRADE] Upgrading message ID: -5 → 28820, preserveOriginalDate=false
[10:12:11] [DB_UPGRADE] ✅ Upgraded -5 → 28820 with send_status=0, 1 row(s) affected
[10:12:11] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -5 → 28820
[10:12:11] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -5 → 28820
[10:12:11] ReloadData 9
[10:12:11] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:12:11] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28820]
[10:12:11] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 55 msgs, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:11] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 55, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:11] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:12:11] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=55
[10:12:11] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=55
[10:12:12] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=64
[10:12:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[28820, 28819, 28818, 28817, 28816]
[10:12:12] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 55 messages
[10:12:12] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:12] [RELOAD_TAB] 📊 Building chatRows from 55 messages
[10:12:12] [SCROLL] wasNearBottom=true, threshold=447, offset=4409, contentH=4856, boundsH=447, forceScroll=true
[10:12:12] [RELOAD_TAB] 📊 Built 57 chatRows, estHeight=0.0
[10:12:12] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[10:12:12] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4409, currentOffset=4409
[10:12:12] [SCROLL] Scrolling to 4409, animated=false
[10:12:13] [SERVER] Polling - attempting to reconnect...
[10:12:13] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:12:13] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:12:13] [PUSH] Silent push received
[10:12:13] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:13 +0000, appState=0, message_id=nil, type=nil
[10:12:13] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:13] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:13 +0000
[10:12:13] [PUSH_EMBED] No embedded message_data in notification
[10:12:13] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:12:13] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810], handled=false
[10:12:13] [PUSH] No embedded data, pre-loading messages from server
[10:12:13] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:12:13] [CLIENT_SIG] Event received: type=3 messageId=28820
[10:12:13] [WS_EVENT] Received event: type=3, messageId=28820
[10:12:13] [WS_EVENT] Read receipt for message 28820 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:12:13] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:12:13] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:12:13] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:12:13] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:12:13] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:12:13] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:12:13] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:12:13] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:12:13] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:13] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=54, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[10:12:13] [PRELOAD_CACHE] Preserving 5 push-inserted messages: [28729, 28728, 28727, 28726, 28725]
[10:12:13] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=5, IDs=[28729, 28728, 28727, 28726, 28725]
[10:12:13] [PUSH_TRACE] 🔀 mergeMessages: merged.count=55, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:13] [PUSH_PRELOAD] ⚡ Pre-cached 55 messages for instant display (preserved 5 from push)
[10:12:13] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:12:13] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 55 msgs, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:13] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=4 secsSinceLastPong=15 vccs=0
[10:12:13] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28820
[10:12:13] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28820, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:12:13] [PUSH] Parsed message_id: 28820
[10:12:13] [PUSH] Parsed operation_type: 3
[10:12:13] [PUSH] Taking direct action: opType=3, messageId=28820
[10:12:13] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28820
[10:12:18] [LIFECYCLE] App resigning active - cleared crash flag
[10:12:18] [CAM_CONN] 💓 PING #5 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[10:12:18] [SERVER] Polling - attempting to reconnect...
[10:12:18] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:12:18] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:12:18] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:12:18] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:12:18] [SECURITY] Saved background timestamp
[10:12:18] [LIFECYCLE] App entering background - cleared crash flag
[10:12:18] [CLIENT_SIG] Disconnecting
[10:12:18] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:12:18] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:12:18] [PUSH_TRACE] 💤 BACKGROUND: memory has 55 messages, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:12:18] [LIFECYCLE] Background snapshot: count=55, maxId=28820
[10:12:18] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[10:12:18] [WS] Canceling WebSocket for query connection to iosILUIWU
[10:12:18] In cleanupPeer
[10:12:18] In cleanupPeer
[10:12:18] [LIFECYCLE] WebRTC audio disabled
[10:12:18] [LIFECYCLE] AVAudioSession deactivated
[10:12:18] [LIFECYCLE] All connections stopped
[10:12:18] [CLIENT_SIG] WebSocket closed with code 1001
[10:12:18] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:12:18] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[10:12:18] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:12:18] [SERVER] Stopped reconnect polling
[10:12:18] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[10:12:18] [WS] Query connection error - cleaning up all agent connections and views
[10:12:18] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:12:18] [WS] Query connection failed - cleaning up all agent connections and views
[10:12:18] Will request stop of video 0
[10:12:18] Will request stop of video 0
[10:12:18] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[10:12:18] [APP_TERMINATE] ✅ No pending uploads in DB queue
[10:12:18] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=false, returning=false, textView=<Eye.PastingTextView: 0x109bc8000; baseClass = UITextView; frame = (44 8; 320 36
[10:15:42] [CRASH] No crash detected
[10:15:42] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[10:15:42] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[10:15:42] [GIPHY] SDK not available - using REST API fallback
[10:15:42] [BACKGROUND] Background fetch enabled
[10:15:42] [SECURITY] Initial launch - timeout exceeded (203.27301216125488s > 0.0s)
[10:15:42] [AUTH] Starting PIN authentication
[10:15:42] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:15:42] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:15:42] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[10:15:42] [CLEANUP] No old timer messages to delete
[10:15:42] [CLIENT_SIG] WebSocket opened
[10:15:42] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:15:42] [CLIENT_SIG] Connected! clientId=CWGNX8sFGubcreGN
[10:15:42] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28820)...
[10:15:42] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:15:42] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:15:42] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[10:15:42] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:15:42] [USER] ✅ User registered successfully
[10:15:42] [PUSH] User registration after token update: success
[10:15:42] [PRELOAD] No messages or parse error
[10:15:43] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[10:15:43] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:15:44] [PIN_AUTH] Correct PIN
[10:15:44] [SECURITY] Restored real session: ILUIWU
[10:15:44] [SECURITY] Restored real session: ILUIWU
[10:15:44] [SECURITY] Saved real session: ILUIWU
[10:15:44] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[10:15:44] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:15:44] [UPLOAD_QUEUE] ✅ Database integrity check passed
[10:15:44] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[10:15:44] Documents Directory: /var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/Documents
[10:15:44] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[10:15:44] [CAPTURE_HOST] live-feed moved hosted view to plain container
[10:15:44] [THEME] Applying current theme
[10:15:44] [CHAT] Applied day theme (mode: day)
[10:15:44] [SECURITY] Saved real session: ILUIWU
[10:15:44] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[10:15:44] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:15:44] [NETWORK] Network monitor started
[10:15:44] [NETWORK] Status changed: connected
[10:15:44] Did transition
[10:15:44] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[10:15:44] [VIEWER] Screen lock enabled - normal idle behavior
[10:15:44] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[10:15:44] [VCC] ========== VideoConnectionClass INIT ==========
[10:15:44] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[10:15:44] [DATA AUDIO] ========== setupWebRTC() START ==========
[10:15:44] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[10:15:44] [DATA AUDIO] Creating encoder/decoder factories...
[10:15:44] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[10:15:44] [CODEC] Viewer selected encoder: AV1 (best quality)
[10:15:44] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[10:15:44] [DATA AUDIO] ✅ Factory created
[10:15:44] [DATA AUDIO] RTCAudioSession locked
[10:15:44] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[10:15:44] [DATA AUDIO] RTCAudioSession unlocked
[10:15:44] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[10:15:44] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[10:15:44] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[10:15:44] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:15:44] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[10:15:44] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[10:15:44] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:15:44] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[10:15:44] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[10:15:44] Did transition
[10:15:44] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[10:15:44] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:15:44] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:15:44] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:15:44] [READBY_OPT] Fetching readBy for 14 unsettled messages (targeted)
[10:15:44] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[10:15:44] [MIGRATION] No messages need sender_name backfill
[10:15:44] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:15:44] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[10:15:44] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[10:15:44] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28820
[10:15:44] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[10:15:44] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[10:15:44] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[10:15:44] [GALLERY_DB] Raw datesent for msg 28718: '2026-04-22 12:02:50'
[10:15:44] [USER] ✅ User registered successfully
[10:15:44] [USER] User registration successful
[10:15:44] [GALLERY_DB] ✅ Loaded 1255 media messages
[10:15:44] [INCREMENTAL_SYNC] ✅ No new messages
[10:15:45] [GALLERY] Filtered 1255 -> 1232 (only with local thumbnails)
[10:15:45] [GALLERY] First 5 after sort (newest first):
[10:15:45] [GALLERY]   0: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[10:15:45] [GALLERY]   1: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[10:15:45] [GALLERY]   2: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[10:15:45] [GALLERY]   3: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[10:15:45] [GALLERY]   4: id=28713, date=2026-04-22 10:12:56, file=55cec5a39e78220e.jpg
[10:15:45] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[10:15:45] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[10:15:45] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:15:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28820, 28819, 28818, 28817, 28816]
[10:15:45] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:15:45] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:15:45] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:15:45] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[10:15:45] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:15:45] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[10:15:45] [CELL_UPLOAD] configure: msgId=28734, file=653beabd4db198ba.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:15:45] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:15:45] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=653beabd4db198ba.jpg, overlayExists=true
[10:15:45] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[10:15:45] [SERVER] Starting reconnect polling (5s interval)
[10:15:45] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[10:15:45] [ICONS] Offset applied: -14.6
[10:15:45] [ICONS] New left margin: 11.2, New right margin: 11.3
[10:15:45] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:15:45] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:15:45] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:15:45] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[10:15:45] [ICONS] Chat center: (31.2, 87.0)
[10:15:45] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[10:15:45] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[10:15:45] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[10:15:45] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[10:15:45] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[10:15:45] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[10:15:45] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[10:15:45] [ICONS] Screen width: 440.0
[10:15:45] [COMBINED_FETCH] Loaded 14 read receipts, 3 messages with reactions
[10:15:45] [READBY_ENRICH] Enriched 14/14 unsettled messages with readBy data
[10:15:45] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3848, currentOffset=3848
[10:15:45] [SCROLL] Scrolling to 3848, animated=false
[10:15:45] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:15:45] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[10:15:45] [UNSENT_RETRY] Checking for unsent messages...
[10:15:45] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[10:15:45] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[10:15:45] [UPLOAD_RECOVERY] Session: ILUIWU
[10:15:45] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[10:15:45] [UPLOAD_RECOVERY] Checking recent media messages on server...
[10:15:45] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[10:15:45] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[10:15:45] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[10:15:45] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[10:15:45] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[10:15:45] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28362, file=99bb302f2e76748c.jpg, upload_status=complete
[10:15:45] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[10:15:45] [PENDING_UPLOAD] Total pending upload messages: 0
[10:15:45] [UNSENT_RETRY] No unsent messages found
[10:15:45] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=70
[10:15:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28820, 28819, 28818, 28817, 28816]
[10:15:45] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:15:45] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[10:15:45] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:15:45] [SCROLL] wasNearBottom=true, threshold=758, offset=3848, contentH=4606, boundsH=758, forceScroll=true
[10:15:45] new_session POST ok: token len=157
[10:15:45] HELLO → sent (fetched token, role=query)
[10:15:45] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:15:45] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[10:15:45] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3908, currentOffset=3908
[10:15:45] [SCROLL] Scrolling to 3908, animated=false
[10:15:45] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[10:15:45] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[10:15:45] [SIG] hello_ok received for query connection - ready to query agents
[10:15:45] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[10:15:45] [SIG] get_agents request sent for sessionId=ILUIWU
[10:15:45] [SIG] get_agents request sent for sessionId=iosILUIWU
[10:15:45] [SERVER] Stopped reconnect polling
[10:15:45] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:15:45] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[10:15:45] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[10:15:45] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:15:45] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[10:15:45] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[10:15:45] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[10:15:45] [SERVER] Starting reconnect polling (5s interval)
[10:15:45] [UPLOAD_RECOVERY] ✅ All media files verified on server
[10:15:46] [CAMERA] Device orientation changed: portrait → rotating icons by 0°
[10:15:46] [CAMERA] Switch-over factors: [2, 10]
[10:15:46] [CAMERA] updateVideoOrientation - no connection
[10:15:46] [CAMERA] Virtual device max zoom: 123.75
[10:15:46] [CAMERA] 0.5x: virtual device at zoom 1.0 (ultra-wide)
[10:15:46] [CAMERA] 1x: virtual device at zoom 2.0 (wide angle, macro enabled)
[10:15:46] [CAMERA] 2x: virtual device at zoom 4.0
[10:15:46] [CAMERA] 4x: virtual device at zoom 8.0 (telephoto)
[10:15:46] [CAMERA] 8x: virtual device at zoom 16.0
[10:15:46] [CAMERA] Discovered 5 lenses: ["0.5x=1.0", "1x=2.0", "2x=4.0", "4x=8.0", "8x=16.0"]
[10:15:46] [CAMERA] Using device: Front Camera (AVCaptureDeviceTypeBuiltInWideAngleCamera)
[10:15:46] [VOLUME] Starting volume button monitoring
[10:15:46] [VOLUME] Audio session activated for volume KVO, initial volume: 0.25
[10:15:46] [VOLUME] Volume observation started
[10:15:46] [CAMERA] updateVideoOrientation - no connection
[10:15:46] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[10:15:46] [CAMERA] updateVideoOrientation - no connection
[10:15:46] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[10:15:46] [CAMERA] setupPreviewLayer - previewView.bounds: (0.0, 0.0, 440.0, 796.0), previewLayer.frame: (0.0, 0.0, 440.0, 796.0)
[10:15:46] [VOLUME] Hidden MPVolumeView installed on window
[10:15:46] [CAMERA] Configuring focus for Front Camera
[10:15:46] [CAMERA] Focus configured: mode=1, subjectAreaMonitoring=true
[10:15:47] [CAMERA] Switched to continuous autofocus, lens position: 0.56078434
[10:15:50] [SERVER] Polling - attempting to reconnect...
[10:15:50] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:15:50] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:15:55] [HAPTIC] triggerHapticFeedback called - mode: photo, isRecording: false
[10:15:55] [HAPTIC] Triggering peek haptic for photo
[10:15:55] [CAMERA] capturePhoto - set rotation angle=90.0, camera=FRONT
[10:15:55] [SERVER] Polling - attempting to reconnect...
[10:15:55] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:15:55] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:15:55] [VOLUME] Stopping volume button monitoring
[10:15:55] [VOLUME] Audio session deactivated
[10:15:55] [CROP] setting imageBounds=(0.625, 0.0, 438.75, 780.0) (imageView.bounds=(440.0, 780.0), image.size=(1080.0, 1920.0))
[10:15:55] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:55] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; animations = { UIPacingAnimationForAnimatorsKey=<CABasicAnimation: 0x110f3dfa0>; position=<CASpringAnimation: 0x110f3e1a0>; }; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:55] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:55] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; animations = { UIPacingAnimationForAnimatorsKey=<CABasicAnimation: 0x110f3dfa0>; position=<CASpringAnimation: 0x110f3e1a0>; }; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:57] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:57] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:58] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:58] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:15:59] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:15:59] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:16:00] [SERVER] Polling - attempting to reconnect...
[10:16:00] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:16:00] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:16:00] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:16:00] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:16:01] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:16:01] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:16:01] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:16:01] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:16:02] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:16:02] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:16:02] Chosen timer = 0
[10:16:02] [CROP] viewDidLayoutSubviews: overlay.frame=(0.0, 62.0, 440.0, 780.0), overlay.bounds=(0.0, 0.0, 440.0, 780.0), imageView.frame=(0.0, 62.0, 440.0, 780.0), overlay.isUserInteractionEnabled=true, overlay.isHidden=false, overlay.alpha=1.0
[10:16:02] [CROP] overlay.superview=Optional(<UIView: 0x1257b1340; frame = (0 0; 440 956); autoresize = W+H; backgroundColor = UIExtendedGrayColorSpace 0 1; layer = <CALayer: 0x1256cfdb0>>), gestureRecognizers=Optional([<UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>; must-fail-for = {
        <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>>
    }>, <UITapGestureRecognizer: 0x123401e00; id = 603; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x123dab200>)>; must-fail = {
        <UIPanGestureRecognizer: 0x123f67a00; id = 602; state = Possible; view = <Eye.PhotoCropOverlayView: 0x123e74000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x123e74000>)>>
    }>])
[10:16:02] [VOLUME] Starting volume button monitoring
[10:16:02] [VOLUME] Audio session activated for volume KVO, initial volume: 0.25
[10:16:02] [VOLUME] Volume observation started
[10:16:02] [VOLUME] Stopping volume button monitoring
[10:16:02] [VOLUME] Audio session deactivated
[10:16:02] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[10:16:02] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:16:02] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[10:16:02] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[10:16:02] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[10:16:02] [GALLERY_DB] Raw datesent for msg 28718: '2026-04-22 12:02:50'
[10:16:02] [GALLERY_DB] ✅ Loaded 1255 media messages
[10:16:03] [GALLERY] Filtered 1255 -> 1232 (only with local thumbnails)
[10:16:03] [GALLERY] First 5 after sort (newest first):
[10:16:03] [GALLERY]   0: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[10:16:03] [GALLERY]   1: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[10:16:03] [GALLERY]   2: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[10:16:03] [GALLERY]   3: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[10:16:03] [GALLERY]   4: id=28713, date=2026-04-22 10:12:56, file=55cec5a39e78220e.jpg
[10:16:03] [VOLUME] Hidden MPVolumeView installed on window
[10:16:03] [MEDIA_SEND] ========== NEW UPLOAD ==========
[10:16:03] [MEDIA_SEND] onSend called
[10:16:03] [MEDIA_SEND] Source URL: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/E9C3A448-E3EB-4E98-B394-9C6930AE55C9.jpg
[10:16:03] [MEDIA_SEND] Source file exists: true
[10:16:03] [MEDIA_SEND] Original filename: E9C3A448-E3EB-4E98-B394-9C6930AE55C9.jpg
[10:16:03] [MEDIA_SEND] Random filename: 2c2436d604281163.jpg
[10:16:03] [MEDIA_SEND] File extension: jpg
[10:16:03] [MEDIA_SEND] Local media path: /var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/Documents/MediaCache/2c2436d604281163.jpg
[10:16:03] [MEDIA_SEND] Local thumbnail path: /var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/Documents/MediaCache/t_2c2436d604281163.jpg
[10:16:03] [MEDIA_SEND] Source file size: 625641 bytes (0.60 MB)
[10:16:03] [MEDIA_SEND] Copying file (<100MB)
[10:16:03] [MEDIA_SEND] File copied successfully
[10:16:03] [MEDIA_SEND] Destination file exists: true
[10:16:03] [MEDIA_SEND] Destination file size: 625641 bytes
[10:16:03] [MEDIA_SEND] Creating thumbnail...
[10:16:03] [MEDIA_SEND] Thumbnail created in 0.02s
[10:16:03] [MEDIA_SEND] Thumbnail dimensions: (225.0, 400.0)
[10:16:03] [MEDIA_SEND] Thumbnail exists: true
[10:16:03] [MEDIA_SEND] Thumbnail file size: 27853 bytes
[10:16:03] [MEDIA_SEND] Prepared encrypted media and thumbnail
[10:16:03] [MEDIA_SEND] Sending message to server...
[10:16:03] [MEDIA_SEND] Caption: ''
[10:16:03] [MEDIA_SEND] Timer: 0
[10:16:03] [MEDIA_SEND] Filename: 2c2436d604281163.jpg
[10:16:03] [MEDIA_FLOW] ⚠️ Message sent BEFORE upload starts - if app dies now, file won't be uploaded!
[10:16:03] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[10:16:03] [MEDIA_SEND] 📤 Creating media message: id=-1, file=2c2436d604281163.jpg, isGiphy=false, upload_status=1 (pending)
[10:16:03] [MEDIA_SEND] 💾 Inserted to DB with upload_status=1
[10:16:03] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[10:16:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[10:16:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28820, 28819, 28818, 28817]
[10:16:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:16:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:16:03] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:16:03] [SCROLL] wasNearBottom=true, threshold=758, offset=3908, contentH=4666, boundsH=758, forceScroll=false
[10:16:03] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:16:03] [CELL_UPLOAD] configure: msgId=-1, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=1
[10:16:03] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=1 → pending
[10:16:03] [CELL_UPLOAD] setUploadStatus(pending, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:03] [CELL_UPLOAD] → pending: overlay.isHidden=false, alpha=1.0
[10:16:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[10:16:03] [CELL_UPLOAD] configure: msgId=-1, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=1
[10:16:03] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=1 → pending
[10:16:03] [CELL_UPLOAD] setUploadStatus(pending, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:03] [CELL_UPLOAD] → pending: overlay.isHidden=false, alpha=1.0
[10:16:03] [SCROLL] 💓 alive, visible=41...52, rows=53, estHeight=0.0, heightCalls=119
[10:16:03] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:16:03] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:16:03] [MEDIA_SEND] sendMessage API call completed
[10:16:03] [MEDIA_SEND] Starting THUMBNAIL upload: t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_ENQUEUE] 📥 ========== ENQUEUE UPLOAD ==========
[10:16:03] [UPLOAD_ENQUEUE] 📥 File: t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_ENQUEUE] 📥 Local path: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/9F34EC8F-90F1-413A-94D2-73FC76879294-t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_ENQUEUE] 📥 Session: ILUIWU
[10:16:03] [UPLOAD_ENQUEUE] 📥 File exists: true, size: 0.0 MB
[10:16:03] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4218, currentOffset=4218
[10:16:03] [SCROLL] Scrolling to 4218, animated=true
[10:16:03] [UPLOAD_QUEUE] Enqueued upload id=1650 for t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_DEBUG] ========== START UPLOAD ==========
[10:16:03] [UPLOAD_DEBUG] Item ID: 1650
[10:16:03] [UPLOAD_DEBUG] Local URL: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/9F34EC8F-90F1-413A-94D2-73FC76879294-t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_DEBUG] Random filename: t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_DEBUG] Session ID: ILUIWU
[10:16:03] [UPLOAD_DEBUG] API Base: https://crivello.dyndns.org:443/WebRTC/chat/
[10:16:03] [UPLOAD_DEBUG] Retry count: 0
[10:16:03] [UPLOAD_NOTIFY] 📣 Posting notification: file=t_2c2436d604281163.jpg, status=uploading (2), progress=0.0%
[10:16:03] [UPLOAD_DEBUG] File exists: true
[10:16:03] [UPLOAD_DEBUG] File size: 27881 bytes (0.0 MB)
[10:16:03] [UPLOAD_DEBUG] Chunked threshold: 104857600 bytes (100 MB)
[10:16:03] [UPLOAD_DEBUG] → Using STANDARD upload (file <= threshold)
[10:16:03] [UPLOAD_DEBUG] --- startStandardUpload ---
[10:16:03] [UPLOAD_DEBUG] Upload URL: https://crivello.dyndns.org:443/WebRTC/chat/upload_media.php
[10:16:03] [UPLOAD_DEBUG] File extension: jpg, MIME type: image/jpeg
[10:16:03] [UPLOAD_DEBUG] Temp file URL: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/59D57E52-BB4C-480E-8AEB-88A9AA4C062A.upload
[10:16:03] [UPLOAD_DEBUG] File size: 27881 bytes, in-memory threshold: 10485760 bytes
[10:16:03] [UPLOAD_DEBUG] Creating multipart body (in-memory mode)...
[10:16:03] [UPLOAD_STATUS] 📬 Received notification: file=t_2c2436d604281163.jpg, status=2 (uploading)
[10:16:03] [UPLOAD_STATUS] ⚠️ File not found in memory arrays: t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_STATUS] 💾 Updating DB: file=t_2c2436d604281163.jpg, status=2 (uploading)
[10:16:03] [UPLOAD_DEBUG] ✓ In-memory body written to temp file (28400 bytes)
[10:16:03] [UPLOAD_DEBUG] Creating foreground upload task (default session)...
[10:16:03] [UPLOAD_DEBUG] Task created with identifier: 1
[10:16:03] [UPLOAD_DEBUG] Added to activeUploads dictionary
[10:16:03] [UPLOAD_DEBUG] Updated DB status to 'uploading'
[10:16:03] [UPLOAD_LIFECYCLE] 🚀 STARTED | task=1 | file=t_2c2436d604281163.jpg | size=0.0MB | retries=0
[10:16:03] [UPLOAD_DEBUG] ✓ Task resumed - upload should be in progress now
[10:16:03] [UPLOAD_DEBUG] ========== UPLOAD STARTED ==========
[10:16:03] [UPLOAD_STATUS] ⚠️ DB update: 0 rows affected - file=t_2c2436d604281163.jpg not found in local_messages
[10:16:03] [UPLOAD_PROGRESS] t_2c2436d604281163.jpg: 100% (0.0/0.0 MB) task=1
[10:16:03] [UPLOAD_TIMING] ⏱️ All bytes sent for t_2c2436d604281163.jpg at 2026-04-23 07:16:03 +0000
[10:16:03] [UPLOAD_NOTIFY] 📣 Posting notification: file=t_2c2436d604281163.jpg, status=uploading (2), progress=100.0%
[10:16:03] [UPLOAD_STATUS] 📬 Received notification: file=t_2c2436d604281163.jpg, status=2 (uploading)
[10:16:03] [UPLOAD_STATUS] ⚠️ File not found in memory arrays: t_2c2436d604281163.jpg
[10:16:03] [UPLOAD_STATUS] 💾 Updating DB: file=t_2c2436d604281163.jpg, status=2 (uploading)
[10:16:03] [UPLOAD_STATUS] ⚠️ DB update: 0 rows affected - file=t_2c2436d604281163.jpg not found in local_messages
[10:16:04] [UPLOAD_RESPONSE] Started receiving response for task 1
[10:16:04] [UPLOAD_METRICS] Task 1 metrics (session: foreground):
[10:16:04] [UPLOAD_METRICS]   Total time: 0.44s
[10:16:04] [UPLOAD_METRICS]   Upload time: 0.00s
[10:16:04] [UPLOAD_METRICS]   Response time: 0.00s
[10:16:04] [UPLOAD_METRICS]   Network protocol: http/1.1
[10:16:04] [UPLOAD_METRICS]   Proxy: no
[10:16:04] [UPLOAD_METRICS]   Reused connection: no
[10:16:04] [UPLOAD_TIMING] ⏱️ didCompleteWithError ENTERED at 2026-04-23 07:16:04 +0000
[10:16:04] [UPLOAD_COMPLETE] ========== Task Completed ==========
[10:16:04] [UPLOAD_COMPLETE] Task ID: 1
[10:16:04] [UPLOAD_COMPLETE] Task state: 3 (0=running, 1=suspended, 2=canceling, 3=completed)
[10:16:04] [UPLOAD_COMPLETE] Filename: t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_COMPLETE] Local path: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/9F34EC8F-90F1-413A-94D2-73FC76879294-t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_COMPLETE] Retry count: 0
[10:16:04] [UPLOAD_TIMING] ⏱️ Server response delay: 0.186s (time between 100% sent → HTTP response) for t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_COMPLETE] HTTP Status: 200
[10:16:04] [UPLOAD_COMPLETE] Response headers: [AnyHashable("Server"): Apache/2.4.66 (Debian), AnyHashable("Keep-Alive"): timeout=5, max=100, AnyHashable("Content-Type"): application/json, AnyHashable("Content-Length"): 255, AnyHashable("Connection"): Keep-Alive, AnyHashable("Date"): Thu, 23 Apr 2026 07:16:03 GMT]
[10:16:04] [UPLOAD_COMPLETE] Response body (255 bytes): {"ok":true,"file_name":"t_2c2436d604281163.jpg","orig_name":"9F34EC8F-90F1-413A-94D2-73FC76879294-t_2c2436d604281163.jpg","size":27881,"env":{"file_uploads":"1","upload_max_filesize":"5G","post_max_size":"200M","upload_tmp_dir":"","content_length":28400}}
[10:16:04] [UPLOAD_COMPLETE] ✅ Server confirmed upload OK
[10:16:04] [UPLOAD_COMPLETE] Server filename: t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_TIMING] ⏱️ didCompleteWithError processing took 0.002s before markUploadCompleted
[10:16:04] [UPLOAD_COMPLETE] File < 100MB, skipping verification
[10:16:04] [UPLOAD_TIMING] ⏱️ markUploadCompleted ENTERED at 2026-04-23 07:16:04 +0000 on thread: BG
[10:16:04] [UPLOAD_LIFECYCLE] ✅ COMPLETED | file=t_2c2436d604281163.jpg | id=1650 | retries=0
[10:16:04] [UPLOAD_COMPLETE] ✅ ========== UPLOAD COMPLETED ==========
[10:16:04] [UPLOAD_COMPLETE] ✅ File: t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_COMPLETE] ✅ Queue ID: 1650
[10:16:04] [UPLOAD_COMPLETE] ✅ Session: ILUIWU
[10:16:04] [UPLOAD_COMPLETE] ✅ Server filename: t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_COMPLETE] ✅ Posting .complete status notification
[10:16:04] [UPLOAD_NOTIFY] 📣 Posting notification: file=t_2c2436d604281163.jpg, status=complete (0), progress=0.0%
[10:16:04] [UPLOAD_TIMING] ⏱️ postStatusChange(.complete) dispatched in 0.001s
[10:16:04] [UPLOAD_TIMING] ⏱️ main.async delay: 0.000s for t_2c2436d604281163.jpg status=complete
[10:16:04] [UPLOAD_TIMING] ⏱️ markUploadCompleted returned at 2026-04-23 07:16:04 +0000
[10:16:04] [UPLOAD_STATUS] 📬 Received notification: file=t_2c2436d604281163.jpg, status=0 (complete)
[10:16:04] [UPLOAD_COMPLETE] ✅ Upload queue DB updated to 'completed' for id=1650
[10:16:04] [UPLOAD_STATUS] ⚠️ File not found in memory arrays: t_2c2436d604281163.jpg
[10:16:04] [UPLOAD_STATUS] 💾 Updating DB: file=t_2c2436d604281163.jpg, status=0 (complete)
[10:16:04] [UPLOAD_STATUS] ⚠️ DB update: 0 rows affected - file=t_2c2436d604281163.jpg not found in local_messages
[10:16:04] [CLIENT_SIG] Event received: type=0 messageId=28821
[10:16:04] [WS_EVENT] Received event: type=0, messageId=28821
[10:16:04] [WS_EVENT] 📨 New message notification (msgId=28821) - triggering incremental refresh, currentMsgCount=51
[10:16:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[10:16:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28820
[10:16:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[10:16:04] [MEDIA_SEND] Thumbnail uploaded successfully in 0.46s
[10:16:04] [MEDIA_SEND] Thumbnail server filename: t_2c2436d604281163.jpg
[10:16:04] [MEDIA_SEND] Starting MAIN FILE upload: 2c2436d604281163.jpg
[10:16:04] [UPLOAD_ENQUEUE] 📥 ========== ENQUEUE UPLOAD ==========
[10:16:04] [UPLOAD_ENQUEUE] 📥 File: 2c2436d604281163.jpg
[10:16:04] [UPLOAD_ENQUEUE] 📥 Local path: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/DB29A99D-E413-4BE4-8E9B-C9D535DB1496-2c2436d604281163.jpg
[10:16:04] [UPLOAD_ENQUEUE] 📥 Session: ILUIWU
[10:16:04] [UPLOAD_ENQUEUE] 📥 File exists: true, size: 0.6 MB
[10:16:04] [UPLOAD_QUEUE] Enqueued upload id=1651 for 2c2436d604281163.jpg
[10:16:04] [UPLOAD_DEBUG] ========== START UPLOAD ==========
[10:16:04] [UPLOAD_DEBUG] Item ID: 1651
[10:16:04] [UPLOAD_DEBUG] Local URL: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/DB29A99D-E413-4BE4-8E9B-C9D535DB1496-2c2436d604281163.jpg
[10:16:04] [UPLOAD_DEBUG] Random filename: 2c2436d604281163.jpg
[10:16:04] [UPLOAD_DEBUG] Session ID: ILUIWU
[10:16:04] [UPLOAD_DEBUG] API Base: https://crivello.dyndns.org:443/WebRTC/chat/
[10:16:04] [UPLOAD_DEBUG] Retry count: 0
[10:16:04] [UPLOAD_NOTIFY] 📣 Posting notification: file=2c2436d604281163.jpg, status=uploading (2), progress=0.0%
[10:16:04] [UPLOAD_DEBUG] File exists: true
[10:16:04] [UPLOAD_STATUS] 📬 Received notification: file=2c2436d604281163.jpg, status=2 (uploading)
[10:16:04] [UPLOAD_STATUS] 📝 Updated allMessagesWithReadBy[0]: 1 → 2
[10:16:04] [UPLOAD_STATUS] 📝 Updated chatMessages[0]: status=2
[10:16:04] [UPLOAD_STATUS] 📝 Updated chatRows[52]: status=2
[10:16:04] [UPLOAD_DEBUG] File size: 625669 bytes (0.6 MB)
[10:16:04] [UPLOAD_STATUS] 💾 Updating DB: file=2c2436d604281163.jpg, status=2 (uploading)
[10:16:04] [UPLOAD_DEBUG] Chunked threshold: 104857600 bytes (100 MB)
[10:16:04] [UPLOAD_DEBUG] → Using STANDARD upload (file <= threshold)
[10:16:04] [UPLOAD_DEBUG] --- startStandardUpload ---
[10:16:04] [UPLOAD_DEBUG] Upload URL: https://crivello.dyndns.org:443/WebRTC/chat/upload_media.php
[10:16:04] [UPLOAD_DEBUG] File extension: jpg, MIME type: image/jpeg
[10:16:04] [UPLOAD_DEBUG] Temp file URL: /private/var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/tmp/21CEB9B8-D282-4D3C-BAD9-0FD8E703788F.upload
[10:16:04] [UPLOAD_DEBUG] File size: 625669 bytes, in-memory threshold: 10485760 bytes
[10:16:04] [UPLOAD_DEBUG] Creating multipart body (in-memory mode)...
[10:16:04] [UPLOAD_STATUS] ✅ DB updated: 1 row(s) affected for file=2c2436d604281163.jpg
[10:16:04] [CELL_UPLOAD] setUploadStatus(uploading, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:04] [CELL_UPLOAD] → uploading: circularProgress visible, overlay.isHidden=false
[10:16:04] [CELL_UPLOAD] setUploadStatus(uploading, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:04] [CELL_UPLOAD] → uploading: circularProgress visible, overlay.isHidden=false
[10:16:04] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28821,"session_id":"ILUIWU","message_type":1,"file_name":"2c2436d604281163.jpg","datesent_utc":"2026-04-23 07:16:04"}
[10:16:04] [CHAT] receive_message.php JSON: ["message_id": 28821, "message_type": 1, "ok": 1, "datesent_utc": 2026-04-23 07:16:04, "file_name": 2c2436d604281163.jpg, "session_id": ILUIWU]
[10:16:04] [DB_UPGRADE] Upgrading message ID: -1 → 28821, preserveOriginalDate=false
[10:16:04] [UPLOAD_DEBUG] ✓ In-memory body written to temp file (626182 bytes)
[10:16:04] [DB_UPGRADE] ✅ Upgraded -1 → 28821 with send_status=0, 1 row(s) affected
[10:16:04] [UPLOAD_DEBUG] Creating foreground upload task (default session)...
[10:16:04] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28821
[10:16:04] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28821
[10:16:04] [UPLOAD_DEBUG] Task created with identifier: 2
[10:16:04] [UPLOAD_DEBUG] Added to activeUploads dictionary
[10:16:04] [UPLOAD_DEBUG] Updated DB status to 'uploading'
[10:16:04] [UPLOAD_LIFECYCLE] 🚀 STARTED | task=2 | file=2c2436d604281163.jpg | size=0.6MB | retries=0
[10:16:04] [UPLOAD_DEBUG] ✓ Task resumed - upload should be in progress now
[10:16:04] [UPLOAD_DEBUG] ========== UPLOAD STARTED ==========
[10:16:04] ReloadData 9
[10:16:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=2
[10:16:04] [CELL_UPLOAD] → has active progress=0.0, setting uploading
[10:16:04] [CELL_UPLOAD] setUploadStatus(uploading, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:04] [CELL_UPLOAD] → uploading: circularProgress visible, overlay.isHidden=false
[10:16:04] [UPLOAD_PROGRESS] 2c2436d604281163.jpg: 100% (0.6/0.6 MB) task=2
[10:16:04] [UPLOAD_TIMING] ⏱️ All bytes sent for 2c2436d604281163.jpg at 2026-04-23 07:16:04 +0000
[10:16:04] [UPLOAD_NOTIFY] 📣 Posting notification: file=2c2436d604281163.jpg, status=uploading (2), progress=100.0%
[10:16:04] [UPLOAD_STATUS] 📬 Received notification: file=2c2436d604281163.jpg, status=2 (uploading)
[10:16:04] [UPLOAD_STATUS] 📝 Updated allMessagesWithReadBy[0]: 2 → 2
[10:16:04] [UPLOAD_STATUS] 📝 Updated chatMessages[0]: status=2
[10:16:04] [UPLOAD_STATUS] 📝 Updated chatRows[52]: status=2
[10:16:04] [UPLOAD_STATUS] 💾 Updating DB: file=2c2436d604281163.jpg, status=2 (uploading)
[10:16:04] [UPLOAD_STATUS] ✅ DB updated: 1 row(s) affected for file=2c2436d604281163.jpg
[10:16:04] [MEDIA_SEND] Main upload progress: 100%
[10:16:04] [CELL_UPLOAD] setUploadStatus(uploading, progress=1.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:04] [CELL_UPLOAD] → uploading 100%: hiding overlay early (server response pending)
[10:16:04] [CELL_UPLOAD] setUploadStatus(uploading, progress=1.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:04] [CELL_UPLOAD] → uploading 100%: hiding overlay early (server response pending)
[10:16:04] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:16:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28821]
[10:16:04] [USTATUS] DB_INSERT msgId=28821 file=2c2436d604281163.jpg parsed=1 rawType=Optional<Any> raw=Optional(1)
[10:16:04] [USTATUS] PARSE msgId=28821 file=2c2436d604281163.jpg uploadStatus=1
[10:16:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:16:04] [USTATUS] UPDATED msgId=28821 2 → 1
[10:16:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:16:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:16:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[10:16:04] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[10:16:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:16:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28821, 28820, 28819, 28818, 28817]
[10:16:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:16:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:16:04] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:16:04] [SCROLL] wasNearBottom=true, threshold=758, offset=4218, contentH=4976, boundsH=758, forceScroll=true
[10:16:04] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:16:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=1
[10:16:04] [CELL_UPLOAD] → has active progress=1.0, setting uploading
[10:16:04] [CELL_UPLOAD] setUploadStatus(uploading, progress=1.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:16:04] [CELL_UPLOAD] → uploading 100%: hiding overlay early (server response pending)
[10:16:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:16:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4218, currentOffset=4218
[10:16:04] [SCROLL] Scrolling to 4218, animated=false
[10:16:05] [LIFECYCLE] App resigning active - cleared crash flag
[10:16:05] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[10:16:05] [SERVER] Polling - attempting to reconnect...
[10:16:05] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:16:05] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:16:05] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=96ms
[10:16:05] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:16:05] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:16:05] [SECURITY] Saved background timestamp
[10:16:05] [LIFECYCLE] App entering background - cleared crash flag
[10:16:05] [CLIENT_SIG] Disconnecting
[10:16:05] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:16:05] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:16:05] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:16:05] [LIFECYCLE] Background snapshot: count=51, maxId=28821
[10:16:05] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[10:23:04] [CRASH] No crash detected
[10:23:04] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[10:23:04] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[10:23:04] [GIPHY] SDK not available - using REST API fallback
[10:23:04] [BACKGROUND] Background fetch enabled
[10:23:04] [SECURITY] Initial launch - timeout exceeded (419.11488795280457s > 0.0s)
[10:23:04] [AUTH] Starting PIN authentication
[10:23:04] [PUSH] Silent push received
[10:23:04] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:23:04 +0000, appState=2, message_id=nil, type=nil
[10:23:04] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:23:04] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:23:04 +0000
[10:23:04] [PUSH_EMBED] No embedded message_data in notification
[10:23:04] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:23:04] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:23:04] [PUSH] No embedded data, pre-loading messages from server
[10:23:04] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:23:04] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[10:23:04] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[10:23:04] [CLEANUP] No old timer messages to delete
[10:23:05] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28821)...
[10:23:05] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[10:23:05] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:23:05] [PRELOAD] No messages or parse error
[10:23:05] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[10:23:05] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:23:05] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:23:05] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:23:05] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:23:05] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:23:05] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:23:05] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:23:05] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:23:05] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[10:23:05] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:23:05] [USER] ✅ User registered successfully
[10:23:05] [PUSH] User registration after token update: success
[10:23:05] [USER] ✅ User registered successfully
[10:23:05] [PUSH] User registration after token update: success
[10:23:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:38:55] [PUSH] Silent push received
[10:38:55] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:38:55 +0000, appState=2, message_id=28824, type=nil
[10:38:55] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:38:55] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:38:55 +0000
[10:38:55] [PUSH_TRACE] ⬇️ Processing embedded message_id=28824
[10:38:55] [PUSH_EMBED] 📩 Received embedded message: id=28824, type=0, sender=Laurent
[10:38:55] [PUSH_TRACE] ⬇️ Message details: text="The least body piece of you I see has a dramatic i...", datesent=2026-04-23 07:23:54
[10:38:55] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:38:55] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28824
[10:38:55] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28824
[10:38:55] [PUSH_EMBED] ✅ Saved message 28824 to local DB (sync)
[10:38:55] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28824
[10:38:55] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28824
[10:38:55] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28824
[10:38:55] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[10:38:55] [PUSH_EMBED] Inserted message 28824 into existing cache (now 51 messages)
[10:38:55] [PUSH_TRACE] 📦 ✅ Inserted message 28824, cache now has IDs: [28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[10:38:55] [PUSH_TRACE] 📦 EXITING cache update queue for message 28824
[10:38:55] [PUSH_EMBED] Fetching evolution data for message 28824 in background
[10:38:55] [PUSH_EMBED] ✅ Fully processed message 28824
[10:38:55] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28824
[10:38:55] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813], handled=true
[10:38:55] [PUSH] Embedded message handled instantly from silent push
[10:38:55] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:38:55] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28824
[10:38:55] [PUSH_EMBED] Got evolution data for message 28824, saving to local DB
[10:38:55] [PUSH_EMBED] Saved evolution data for message 28824
[10:53:17] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:53:17] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:53:17] [CLIENT_SIG] WebSocket opened
[10:53:17] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:53:17] [CLIENT_SIG] Connected! clientId=xKAHgKphd0opWeDm
[10:53:17] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:53:17] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:53:17] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[10:53:17] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow[10:53:20] [LOG] Pruned 39 entries older than 3 hours
[10:53:20] [SECURITY] Restored real session: ILUIWU
[10:53:20] [SECURITY] Restored real session: ILUIWU
[10:53:20] [SECURITY] Saved real session: ILUIWU
[10:53:20] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[10:53:20] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:53:20] [UPLOAD_QUEUE] ✅ Database integrity check passed
[10:53:20] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[10:53:20] Documents Directory: /var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/Documents
[10:53:20] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[10:53:20] [CAPTURE_HOST] live-feed moved hosted view to plain container
[10:53:20] [THEME] Applying current theme
[10:53:20] [CHAT] Applied day theme (mode: day)
[10:53:20] [SECURITY] Saved real session: ILUIWU
[10:53:20] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[10:53:20] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:53:20] [NETWORK] Network monitor started
[10:53:20] [NETWORK] Status changed: connected
[10:53:20] Did transition
[10:53:20] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[10:53:20] [VIEWER] Screen lock enabled - normal idle behavior
[10:53:20] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[10:53:20] [VCC] ========== VideoConnectionClass INIT ==========
[10:53:20] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[10:53:20] [DATA AUDIO] ========== setupWebRTC() START ==========
[10:53:20] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[10:53:20] [DATA AUDIO] Creating encoder/decoder factories...
[10:53:20] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[10:53:20] [CODEC] Viewer selected encoder: AV1 (best quality)
[10:53:20] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[10:53:20] [DATA AUDIO] ✅ Factory created
[10:53:20] [DATA AUDIO] RTCAudioSession locked
[10:53:20] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[10:53:20] [DATA AUDIO] RTCAudioSession unlocked
[10:53:20] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[10:53:20] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[10:53:20] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[10:53:20] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:53:20] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[10:53:20] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[10:53:20] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:53:20] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[10:53:20] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[10:53:20] Did transition
[10:53:20] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[10:53:20] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:53:20] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:53:20] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:53:20] [READBY_OPT] No message IDs to fetch - skipping server call
[10:53:20] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[10:53:20] [MIGRATION] No messages need sender_name backfill
[10:53:20] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:53:20] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[10:53:20] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[10:53:20] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28824, maxMemoryId=28824
[10:53:20] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28824
[10:53:20] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[10:53:20] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[10:53:20] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[10:53:20] [GALLERY_DB] ✅ Loaded 1256 media messages
[10:53:20] [INCREMENTAL_SYNC] ✅ No new messages
[10:53:21] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[10:53:21] [GALLERY] First 5 after sort (newest first):
[10:53:21] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[10:53:21] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[10:53:21] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[10:53:21] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[10:53:21] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[10:53:21] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[10:53:21] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[10:53:21] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:53:21] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28824, 28821, 28820, 28819, 28818]
[10:53:21] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:53:21] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[10:53:21] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:53:21] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[10:53:21] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:53:21] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[10:53:21] [CELL_UPLOAD] configure: msgId=28734, file=653beabd4db198ba.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:53:21] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:53:21] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=653beabd4db198ba.jpg, overlayExists=true
[10:53:21] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[10:53:21] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:53:21] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:53:21] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:53:21] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28821 → 28824
[10:53:21] [SERVER] Starting reconnect polling (5s interval)
[10:53:21] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[10:53:21] [ICONS] Offset applied: -14.6
[10:53:21] [ICONS] New left margin: 11.2, New right margin: 11.3
[10:53:21] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[10:53:21] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:53:21] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:53:21] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:53:21] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[10:53:21] [ICONS] Chat center: (31.2, 87.0)
[10:53:21] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[10:53:21] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[10:53:21] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[10:53:21] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[10:53:21] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[10:53:21] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[10:53:21] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[10:53:21] [ICONS] Screen width: 440.0
[10:53:21] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4042, currentOffset=4042
[10:53:21] [SCROLL] Scrolling to 4042, animated=false
[10:53:21] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:53:21] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[10:53:21] [UNSENT_RETRY] Checking for unsent messages...
[10:53:21] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[10:53:21] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[10:53:21] [UPLOAD_RECOVERY] Session: ILUIWU
[10:53:21] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[10:53:21] [UPLOAD_RECOVERY] Checking recent media messages on server...
[10:53:21] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[10:53:21] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[10:53:21] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[10:53:21] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[10:53:21] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[10:53:21] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[10:53:21] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[10:53:21] [PENDING_UPLOAD] Total pending upload messages: 0
[10:53:21] [UNSENT_RETRY] No unsent messages found
[10:53:21] new_session POST ok: token len=157
[10:53:21] HELLO → sent (fetched token, role=query)
[10:53:21] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[10:53:21] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[10:53:21] [SIG] hello_ok received for query connection - ready to query agents
[10:53:21] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[10:53:21] [SIG] get_agents request sent for sessionId=ILUIWU
[10:53:21] [SIG] get_agents request sent for sessionId=iosILUIWU
[10:53:21] [SERVER] Stopped reconnect polling
[10:53:21] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=66
[10:53:21] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28824, 28821, 28820, 28819, 28818]
[10:53:21] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:53:21] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[10:53:21] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:53:21] [SCROLL] wasNearBottom=true, threshold=758, offset=4042, contentH=4800, boundsH=758, forceScroll=true
[10:53:21] [USER] ✅ User registered successfully
[10:53:21] [USER] User registration successful
[10:53:21] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:53:21] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:53:21] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:53:21] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:53:21] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[10:53:21] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4042, currentOffset=4042
[10:53:21] [SCROLL] Scrolling to 4042, animated=false
[10:53:21] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:53:21] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[10:53:21] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[10:53:21] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:53:21] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[10:53:21] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[10:53:21] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[10:53:21] [SERVER] Starting reconnect polling (5s interval)
[10:53:21] [UPLOAD_RECOVERY] ✅ All media files verified on server
[10:53:24] [PUSH] Silent push received
[10:53:24] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:53:24 +0000, appState=0, message_id=nil, type=nil
[10:53:24] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:53:24] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:53:24 +0000
[10:53:24] [PUSH_EMBED] No embedded message_data in notification
[10:53:24] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:53:24] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:53:24] [PUSH] No embedded data, pre-loading messages from server
[10:53:24] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:53:24] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:53:24] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:53:24] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:53:24] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:53:24] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:53:24] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:53:24] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:53:24] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[10:53:24] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:53:24] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:53:24] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[10:53:24] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:53:24] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28824
[10:53:24] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28824]
[10:53:24] [PUSH] Parsed message_id: 28824
[10:53:24] [PUSH] Parsed operation_type: 3
[10:53:24] [PUSH] Taking direct action: opType=3, messageId=28824
[10:53:24] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28824
[10:53:24] [CLIENT_SIG] Event received: type=3 messageId=28824
[10:53:24] [WS_EVENT] Received event: type=3, messageId=28824
[10:53:24] [WS_EVENT] Read receipt for message 28824 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:53:26] [SERVER] Polling - attempting to reconnect...
[10:53:26] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:26] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:53:29] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=59
[10:53:30] [SCROLL_END_DECEL] messagesTable offsetY=4407, insetTop=0, pendingVelocityY=0.0
[10:53:31] [SERVER] Polling - attempting to reconnect...
[10:53:31] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:31] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:53:31] [SCROLL] 💓 alive, visible=49...51, rows=52, estHeight=0.0, heightCalls=0
[10:53:32] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:53:32] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[10:53:32] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[10:53:32] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[10:53:32] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28824, 28821, 28820, 28819]
[10:53:32] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:53:32] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[10:53:32] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:53:32] [SCROLL] wasNearBottom=true, threshold=447, offset=4353, contentH=4800, boundsH=447, forceScroll=false
[10:53:32] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:53:32] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:53:32] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:53:32] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:53:32] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=57
[10:53:32] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:53:32] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:53:32] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4430, currentOffset=4430
[10:53:32] [SCROLL] Scrolling to 4430, animated=true
[10:53:32] [CLIENT_SIG] Event received: type=0 messageId=28825
[10:53:32] [WS_EVENT] Received event: type=0, messageId=28825
[10:53:32] [WS_EVENT] 📨 New message notification (msgId=28825) - triggering incremental refresh, currentMsgCount=51
[10:53:32] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[10:53:32] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28824, maxMemoryId=28824
[10:53:32] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28824
[10:53:32] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28825,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:53:32"}
[10:53:32] [CHAT] receive_message.php JSON: ["file_name": , "ok": 1, "session_id": ILUIWU, "datesent_utc": 2026-04-23 07:53:32, "message_id": 28825, "message_type": 0]
[10:53:32] [DB_UPGRADE] Upgrading message ID: -1 → 28825, preserveOriginalDate=false
[10:53:32] [DB_UPGRADE] ✅ Upgraded -1 → 28825 with send_status=0, 1 row(s) affected
[10:53:32] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28825
[10:53:32] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28825
[10:53:32] ReloadData 9
[10:53:32] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:53:32] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:53:32] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:53:32] [MENU] dismissAnyExistingMenu called
[10:53:32] [MENU] dismissAnyExistingMenu completed
[10:53:32] [SCROLL_BEGIN_DRAG] messagesTable offsetY=4430, insetTop=0, topDistance=4430, rows=53, prefetchedCount=0
[10:53:32] [SCROLL] 💓 alive, visible=47...51, rows=53, estHeight=0.0, heightCalls=172
[10:53:32] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:53:32] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28825]
[10:53:32] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[10:53:32] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[10:53:32] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:53:32] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[10:53:32] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[10:53:32] [SCROLL_WILL_END] velocity=(0.000, -1.303), currentY=4119, targetY=3473, movingTowardTop=true, decelNow=false, dragging=true
[10:53:32] [SCROLL_WILL_END] captured upward momentum velocityY=-1.3029451947733877
[10:53:32] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=4119, topInset=0, pendingVelocityY=-1.3029451947733877, targetNearTop=4119
[10:53:32] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x12cf78000; baseClass = UITextView; frame = (44 8; 320 36
[10:53:33] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[10:53:33] [MENU] dismissAnyExistingMenu called
[10:53:33] [MENU] dismissAnyExistingMenu completed
[10:53:33] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3904, insetTop=0, topDistance=3904, rows=53, prefetchedCount=0
[10:53:33] [SCROLL_WILL_END] velocity=(0.000, 1.694), currentY=4048, targetY=4119, movingTowardTop=false, decelNow=true, dragging=true
[10:53:33] [SCROLL_WILL_END] cleared upward momentum capture
[10:53:33] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=4048, topInset=0, pendingVelocityY=0.0, targetNearTop=4048
[10:53:33] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=14
[10:53:34] [SCROLL_END_DECEL] messagesTable offsetY=4119, insetTop=0, pendingVelocityY=0.0
[10:53:34] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:53:34] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28825, 28824, 28821, 28820, 28819]
[10:53:34] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:53:34] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[10:53:34] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:53:34] [SCROLL] wasNearBottom=true, threshold=758, offset=4119, contentH=4877, boundsH=758, forceScroll=false
[10:53:34] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:53:34] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:53:34] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:53:34] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:53:34] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:53:34] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4119, currentOffset=4119
[10:53:34] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[10:53:34] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[10:53:34] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[10:53:34] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[10:53:34] [GALLERY_DB] ✅ Loaded 1256 media messages
[10:53:34] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[10:53:34] [GALLERY] First 5 after sort (newest first):
[10:53:34] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[10:53:34] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[10:53:34] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[10:53:34] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[10:53:34] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[10:53:34] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[10:53:34] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:53:34] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28825, 28824, 28821, 28820, 28819]
[10:53:34] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:53:34] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[10:53:34] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:53:34] [SCROLL] wasNearBottom=true, threshold=758, offset=4119, contentH=4877, boundsH=758, forceScroll=false
[10:53:35] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:53:35] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:53:35] [MUTE] Status sent to server: muted=0, response code=200
[10:53:35] [MUTE] Status sent to server: muted=0, response code=200
[10:53:36] [SERVER] Polling - attempting to reconnect...
[10:53:36] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:36] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:53:37] [MUTE] Status sent to server: muted=1, response code=200
[10:53:37] [MUTE] Status sent to server: muted=1, response code=200
[10:53:37] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:53:39] [MENU] dismissAnyExistingMenu called
[10:53:39] [MENU] dismissAnyExistingMenu completed
[10:53:39] [SCROLL_BEGIN_DRAG] messagesTable offsetY=4119, insetTop=40, topDistance=4159, rows=53, prefetchedCount=0
[10:53:39] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=1
[10:53:39] [SCROLL_WILL_END] velocity=(0.000, 2.521), currentY=4140, targetY=4119, movingTowardTop=true, decelNow=false, dragging=false
[10:53:39] [SCROLL_WILL_END] captured upward momentum velocityY=2.521132572846927
[10:53:39] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=4140, topInset=40, pendingVelocityY=2.521132572846927, targetNearTop=4180
[10:53:39] [SCROLL_END_DECEL] messagesTable offsetY=4151, insetTop=40, pendingVelocityY=2.521132572846927
[10:53:39] [SCROLL_BTN] Showing button - 278pt from bottom > half 223pt
[10:53:39] [SCROLL_END_DECEL] messagesTable offsetY=4430, insetTop=40, pendingVelocityY=2.521132572846927
[10:53:41] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[10:53:41] [SERVER] Polling - attempting to reconnect...
[10:53:41] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:41] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:53:41] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=126ms
[10:53:43] [PUSH] Silent push received
[10:53:43] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:53:43 +0000, appState=0, message_id=nil, type=nil
[10:53:43] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:53:43] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:53:43 +0000
[10:53:43] [PUSH_EMBED] No embedded message_data in notification
[10:53:43] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:53:43] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815], handled=false
[10:53:43] [PUSH] No embedded data, pre-loading messages from server
[10:53:43] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:53:43] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:53:43] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:53:43] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:53:43] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:53:43] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:53:43] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:53:43] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[10:53:43] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:53:43] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28734]
[10:53:43] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28734]
[10:53:43] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[10:53:43] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[10:53:43] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:53:43] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[10:53:43] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=2 vccs=0
[10:53:43] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28825
[10:53:43] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28825, AnyHashable("operation_type"): 3]
[10:53:43] [PUSH] Parsed message_id: 28825
[10:53:43] [PUSH] Parsed operation_type: 3
[10:53:43] [PUSH] Taking direct action: opType=3, messageId=28825
[10:53:43] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28825
[10:53:43] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:53:43] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:53:44] [CLIENT_SIG] Event received: type=3 messageId=28825
[10:53:44] [WS_EVENT] Received event: type=3, messageId=28825
[10:53:44] [WS_EVENT] Read receipt for message 28825 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:53:46] [SERVER] Polling - attempting to reconnect...
[10:53:46] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:46] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:53:51] [SERVER] Polling - attempting to reconnect...
[10:53:51] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:51] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:53:56] [SERVER] Polling - attempting to reconnect...
[10:53:56] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:53:56] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:54:01] [CAM_CONN] 💓 PING #2 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[10:54:01] [SERVER] Polling - attempting to reconnect...
[10:54:01] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:54:01] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:54:03] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:54:03] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[10:54:03] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=52
[10:54:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=5
[10:54:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-2, 28825, 28824, 28821, 28820]
[10:54:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:54:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-2, 28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:54:03] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:54:03] [SCROLL] wasNearBottom=true, threshold=429, offset=4430, contentH=4877, boundsH=429, forceScroll=false
[10:54:03] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:54:03] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:54:03] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:54:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:54:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=57
[10:54:03] [SCROLL] 💓 alive, visible=50...53, rows=54, estHeight=0.0, heightCalls=111
[10:54:03] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:54:03] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:54:03] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4503, currentOffset=4503
[10:54:03] [SCROLL] Scrolling to 4503, animated=true
[10:54:03] [CLIENT_SIG] Event received: type=0 messageId=28826
[10:54:03] [WS_EVENT] Received event: type=0, messageId=28826
[10:54:03] [WS_EVENT] 📨 New message notification (msgId=28826) - triggering incremental refresh, currentMsgCount=52
[10:54:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:54:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28825, maxMemoryId=28825
[10:54:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28825
[10:54:03] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28826,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:54:03"}
[10:54:03] [CHAT] receive_message.php JSON: ["file_name": , "ok": 1, "message_id": 28826, "datesent_utc": 2026-04-23 07:54:03, "session_id": ILUIWU, "message_type": 0]
[10:54:03] [DB_UPGRADE] Upgrading message ID: -2 → 28826, preserveOriginalDate=false
[10:54:03] [DB_UPGRADE] ✅ Upgraded -2 → 28826 with send_status=0, 1 row(s) affected
[10:54:03] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 28826
[10:54:03] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 28826
[10:54:03] ReloadData 9
[10:54:03] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:54:03] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:54:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:54:03] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:54:03] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28826]
[10:54:03] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28826, 28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:54:03] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28826, 28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:54:03] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:54:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:54:03] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[10:54:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[10:54:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28826, 28825, 28824, 28821, 28820]
[10:54:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:54:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28826, 28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:54:04] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:54:04] [SCROLL] wasNearBottom=true, threshold=447, offset=4503, contentH=4950, boundsH=447, forceScroll=true
[10:54:04] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:54:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:54:04] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:54:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:54:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[10:54:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4503, currentOffset=4503
[10:54:04] [SCROLL] Scrolling to 4503, animated=false
[10:54:04] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:54:06] [LIFECYCLE] App resigning active - cleared crash flag
[10:54:06] [SERVER] Polling - attempting to reconnect...
[10:54:06] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:54:06] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:54:06] [PUSH] Silent push received
[10:54:06] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:06 +0000, appState=1, message_id=nil, type=nil
[10:54:06] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[10:54:06] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:06 +0000
[10:54:06] [PUSH_EMBED] No embedded message_data in notification
[10:54:06] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:54:06] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816], handled=false
[10:54:06] [PUSH] No embedded data, pre-loading messages from server
[10:54:06] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:54:06] [CLIENT_SIG] Event received: type=3 messageId=28826
[10:54:06] [WS_EVENT] Received event: type=3, messageId=28826
[10:54:06] [WS_EVENT] Read receipt for message 28826 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:54:06] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:54:06] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:54:06] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:54:06] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:54:06] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:54:06] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:54:06] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[10:54:06] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[10:54:06] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28735, 28734]
[10:54:06] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28735, 28734]
[10:54:06] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[10:54:06] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[10:54:06] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:54:06] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28826, 28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:54:06] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=5 vccs=0
[10:54:06] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28826
[10:54:06] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28826, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:54:06] [PUSH] Parsed message_id: 28826
[10:54:06] [PUSH] Parsed operation_type: 3
[10:54:06] [PUSH] Taking direct action: opType=3, messageId=28826
[10:54:06] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28826
[10:54:06] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:54:06] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:54:06] [SECURITY] Saved background timestamp
[10:54:06] [LIFECYCLE] App entering background - cleared crash flag
[10:54:06] [CLIENT_SIG] Disconnecting
[10:54:06] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:54:06] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:54:06] [PUSH_TRACE] 💤 BACKGROUND: memory has 52 messages, first 10 IDs=[28826, 28825, 28824, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[10:54:06] [LIFECYCLE] Background snapshot: count=52, maxId=28826
[10:54:06] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[10:54:06] [WS] Canceling WebSocket for query connection to iosILUIWU
[10:54:06] In cleanupPeer
[10:54:06] In cleanupPeer
[10:54:06] [LIFECYCLE] WebRTC audio disabled
[10:54:06] [LIFECYCLE] AVAudioSession deactivated
[10:54:06] [LIFECYCLE] All connections stopped
[10:54:06] [CLIENT_SIG] WebSocket closed with code 1001
[10:54:06] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:54:06] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[10:54:06] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:54:06] [SERVER] Stopped reconnect polling
[10:54:06] Will request stop of video 0
[10:54:06] Will request stop of video 0
[10:54:06] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[10:54:06] [WS] Query connection error - cleaning up all agent connections and views
[10:54:06] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:54:06] [WS] Query connection failed - cleaning up all agent connections and views
[10:54:06] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[10:54:06] [APP_TERMINATE] ✅ No pending uploads in DB queue
[10:54:28] [CRASH] No crash detected
[10:54:28] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[10:54:28] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[10:54:28] [GIPHY] SDK not available - using REST API fallback
[10:54:28] [BACKGROUND] Background fetch enabled
[10:54:28] [SECURITY] Initial launch - timeout exceeded (21.321380853652954s > 0.0s)
[10:54:28] [AUTH] Starting PIN authentication
[10:54:28] [PUSH] Silent push received
[10:54:28] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:28 +0000, appState=2, message_id=28827, type=nil
[10:54:28] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:54:28] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:28 +0000
[10:54:28] [PUSH_TRACE] ⬇️ Processing embedded message_id=28827
[10:54:28] [PUSH_EMBED] 📩 Received embedded message: id=28827, type=0, sender=Laurent
[10:54:28] [PUSH_TRACE] ⬇️ Message details: text="Oh. Then I need to push you latest version. Hold o...", datesent=2026-04-23 07:54:27
[10:54:28] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:54:28] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28827
[10:54:28] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28827
[10:54:28] [CLEANUP] No old timer messages to delete
[10:54:28] [PUSH_EMBED] ✅ Saved message 28827 to local DB (sync)
[10:54:28] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28827
[10:54:28] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28827
[10:54:28] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28827
[10:54:28] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[10:54:28] [PUSH_EMBED] Created new cache with embedded message 28827
[10:54:28] [PUSH_TRACE] 📦 ✅ Created new cache with message 28827
[10:54:28] [PUSH_TRACE] 📦 EXITING cache update queue for message 28827
[10:54:28] [PUSH_EMBED] Fetching evolution data for message 28827 in background
[10:54:28] [PUSH_EMBED] ✅ Fully processed message 28827
[10:54:28] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28827
[10:54:28] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28827], handled=true
[10:54:28] [PUSH] Embedded message handled instantly from silent push
[10:54:28] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:54:28] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28827
[10:54:28] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[10:54:28] [PUSH_EMBED] Got evolution data for message 28827, saving to local DB
[10:54:28] [PUSH_EMBED] Saved evolution data for message 28827
[10:54:28] [PRELOAD] Cache already valid (1 messages), skipping pre-load
[10:54:28] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[10:54:28] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:54:28] [USER] ✅ User registered successfully
[10:54:28] [PUSH] User registration after token update: success
[10:54:30] [PUSH] Notification tapped - session_id: ILUIWU
[10:54:30] [PUSH] Max message_id before tap: 28827
[10:54:30] [PUSH] Stored pending session: ILUIWU
[10:54:30] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:30 +0000
[10:54:30] [PUSH_TRACE] ⬇️ Processing embedded message_id=28827
[10:54:30] [PUSH_EMBED] 📩 Received embedded message: id=28827, type=0, sender=Laurent
[10:54:30] [PUSH_TRACE] ⬇️ Message details: text="Oh. Then I need to push you latest version. Hold o...", datesent=2026-04-23 07:54:27
[10:54:30] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:54:30] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28827
[10:54:30] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28827
[10:54:30] [PUSH_EMBED] ✅ Saved message 28827 to local DB (sync)
[10:54:30] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28827
[10:54:30] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28827
[10:54:30] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28827
[10:54:30] [PUSH_TRACE] 📦 Cache state: valid=true, count=1, IDs=[28827]
[10:54:30] [PUSH_TRACE] 📦 ⚠️ Message 28827 already in cache, skipping insert
[10:54:30] [PUSH_TRACE] 📦 EXITING cache update queue for message 28827
[10:54:30] [PUSH_EMBED] Fetching evolution data for message 28827 in background
[10:54:30] [PUSH_EMBED] ✅ Fully processed message 28827
[10:54:30] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28827
[10:54:30] [PUSH] Embedded message handled instantly on tap
[10:54:30] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:54:30] [PUSH] Fetching server messages since_id=28827 to catch coalesced notifications on tap
[10:54:30] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:54:30] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28827 to catch coalesced notifications
[10:54:30] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:54:30] [CLIENT_SIG] WebSocket opened
[10:54:30] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:54:30] [CLIENT_SIG] Connected! clientId=F0unkbdIFps324qg
[10:54:30] [PUSH_EMBED] Got evolution data for message 28827, saving to local DB
[10:54:30] [PUSH_EMBED] Saved evolution data for message 28827
[10:54:31] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:54:31] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:54:31] [PUSH_PRELOAD] No messages or parse error
[10:54:31] [PUSH] Server fetch on tap completed (success=false)
[10:54:32] [PIN_AUTH] Correct PIN
[10:54:32] [SECURITY] Restored real session: ILUIWU
[10:54:32] [SECURITY] Restored real session: ILUIWU
[10:54:32] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[10:54:32] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:54:32] [SECURITY] Saved real session: ILUIWU
[10:54:32] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[10:54:32] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:54:32] [UPLOAD_QUEUE] ✅ Database integrity check passed
[10:54:32] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[10:54:32] Documents Directory: /var/mobile/Containers/Data/Application/89FDA6A4-DFCE-4A23-BA93-E691E6ED8359/Documents
[10:54:32] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[10:54:32] [CAPTURE_HOST] live-feed moved hosted view to plain container
[10:54:32] [THEME] Applying current theme
[10:54:32] [CHAT] Applied day theme (mode: day)
[10:54:32] [SECURITY] Saved real session: ILUIWU
[10:54:32] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[10:54:32] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:54:32] [NETWORK] Network monitor started
[10:54:32] [NETWORK] Status changed: connected
[10:54:32] Did transition
[10:54:32] [CHUNK] Pre-cache has only 1 messages - supplementing from local DB
[10:54:32] [CHUNK] After merge: 50 messages (added 49 from local DB)
[10:54:32] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[10:54:32] [VIEWER] Screen lock enabled - normal idle behavior
[10:54:32] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[10:54:32] [VCC] ========== VideoConnectionClass INIT ==========
[10:54:32] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[10:54:32] [DATA AUDIO] ========== setupWebRTC() START ==========
[10:54:32] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[10:54:32] [DATA AUDIO] Creating encoder/decoder factories...
[10:54:32] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[10:54:32] [CODEC] Viewer selected encoder: AV1 (best quality)
[10:54:32] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[10:54:32] [DATA AUDIO] ✅ Factory created
[10:54:32] [DATA AUDIO] RTCAudioSession locked
[10:54:32] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[10:54:32] [DATA AUDIO] RTCAudioSession unlocked
[10:54:32] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[10:54:32] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[10:54:32] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[10:54:32] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:54:32] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[10:54:32] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[10:54:32] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:54:32] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[10:54:32] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[10:54:32] Did transition
[10:54:32] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[10:54:32] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[10:54:32] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:54:32] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:54:32] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[10:54:32] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:54:32] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[10:54:32] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[10:54:32] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[10:54:32] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[10:54:32] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[10:54:33] [USER] ✅ User registered successfully
[10:54:33] [USER] User registration successful
[10:54:33] [GALLERY_DB] ✅ Loaded 1256 media messages
[10:54:33] [MIGRATION] No messages need sender_name backfill
[10:54:33] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[10:54:33] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[10:54:33] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[10:54:33] [INCREMENTAL_SYNC] ✅ No new messages
[10:54:33] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[10:54:33] [GALLERY] First 5 after sort (newest first):
[10:54:33] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[10:54:33] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[10:54:33] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[10:54:33] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[10:54:33] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[10:54:33] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[10:54:33] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[10:54:33] [SERVER] Starting reconnect polling (5s interval)
[10:54:33] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[10:54:33] [ICONS] Offset applied: -14.6
[10:54:33] [ICONS] New left margin: 11.2, New right margin: 11.3
[10:54:33] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:54:33] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:54:33] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[10:54:33] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[10:54:33] [ICONS] Chat center: (31.2, 87.0)
[10:54:33] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[10:54:33] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[10:54:33] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[10:54:33] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[10:54:33] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[10:54:33] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[10:54:33] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[10:54:33] [ICONS] Screen width: 440.0
[10:54:33] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[10:54:33] [READBY_ENRICH] Enriched 3/3 unsettled messages with readBy data
[10:54:33] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:54:33] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28827, 28826, 28825, 28824, 28823]
[10:54:33] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:54:33] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:33] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:54:33] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[10:54:33] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:54:33] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[10:54:33] [CELL_UPLOAD] configure: msgId=28740, file=adbb72082c79fd33.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:54:33] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:54:33] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=adbb72082c79fd33.jpg, overlayExists=true
[10:54:33] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[10:54:33] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:54:33] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:54:33] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:54:33] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28826 → 28827
[10:54:33] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:54:33] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[10:54:33] [UNSENT_RETRY] Checking for unsent messages...
[10:54:33] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[10:54:33] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[10:54:33] [UPLOAD_RECOVERY] Session: ILUIWU
[10:54:33] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[10:54:33] [UPLOAD_RECOVERY] Checking recent media messages on server...
[10:54:33] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[10:54:33] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[10:54:33] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[10:54:33] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[10:54:33] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[10:54:33] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[10:54:33] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[10:54:33] [PENDING_UPLOAD] Total pending upload messages: 0
[10:54:33] [UNSENT_RETRY] No unsent messages found
[10:54:33] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3816, currentOffset=3816
[10:54:33] [SCROLL] Scrolling to 3816, animated=false
[10:54:33] new_session POST ok: token len=157
[10:54:33] HELLO → sent (fetched token, role=query)
[10:54:33] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[10:54:33] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[10:54:33] [SIG] hello_ok received for query connection - ready to query agents
[10:54:33] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[10:54:33] [SIG] get_agents request sent for sessionId=ILUIWU
[10:54:33] [SIG] get_agents request sent for sessionId=iosILUIWU
[10:54:33] [SERVER] Stopped reconnect polling
[10:54:33] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=65
[10:54:33] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28827, 28826, 28825, 28824, 28823]
[10:54:33] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:54:33] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:33] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:54:33] [SCROLL] wasNearBottom=true, threshold=758, offset=3816, contentH=4574, boundsH=758, forceScroll=true
[10:54:33] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:54:33] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[10:54:33] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[10:54:33] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:54:33] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[10:54:33] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3816, currentOffset=3816
[10:54:33] [SCROLL] Scrolling to 3816, animated=false
[10:54:33] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:54:33] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[10:54:33] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[10:54:33] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:54:33] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[10:54:33] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[10:54:33] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[10:54:33] [SERVER] Starting reconnect polling (5s interval)
[10:54:33] [UPLOAD_RECOVERY] ✅ All media files verified on server
[10:54:34] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:54:34] [PUSH] Silent push received
[10:54:34] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:34 +0000, appState=0, message_id=nil, type=nil
[10:54:34] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:34 +0000
[10:54:34] [PUSH_EMBED] No embedded message_data in notification
[10:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:54:34] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:54:34] [PUSH] No embedded data, pre-loading messages from server
[10:54:34] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:54:34] [PUSH] Silent push received
[10:54:34] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:34 +0000, appState=0, message_id=nil, type=nil
[10:54:34] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:34 +0000
[10:54:34] [PUSH_EMBED] No embedded message_data in notification
[10:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:54:34] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:54:34] [PUSH] No embedded data, pre-loading messages from server
[10:54:34] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:54:35] [CLIENT_SIG] Event received: type=3 messageId=28822
[10:54:35] [WS_EVENT] Received event: type=3, messageId=28822
[10:54:35] [WS_EVENT] Read receipt for message 28822 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:54:35] [CLIENT_SIG] Event received: type=3 messageId=28823
[10:54:35] [WS_EVENT] Received event: type=3, messageId=28823
[10:54:35] [WS_EVENT] Read receipt for message 28823 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:54:35] [PUSH] Silent push received
[10:54:35] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:35 +0000, appState=0, message_id=nil, type=nil
[10:54:35] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:54:35] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:35 +0000
[10:54:35] [PUSH_EMBED] No embedded message_data in notification
[10:54:35] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:54:35] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:54:35] [PUSH] No embedded data, pre-loading messages from server
[10:54:35] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:54:35] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:54:35] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:54:35] [CLIENT_SIG] Event received: type=3 messageId=28827
[10:54:35] [WS_EVENT] Received event: type=3, messageId=28827
[10:54:35] [WS_EVENT] Read receipt for message 28827 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[10:54:35] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:54:35] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:54:35] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:54:35] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28827
[10:54:35] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28822, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
[10:54:35] [PUSH] Parsed message_id: 28822
[10:54:35] [PUSH] Parsed operation_type: 3
[10:54:35] [PUSH] Taking direct action: opType=3, messageId=28822
[10:54:35] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28822
[10:54:35] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:54:35] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:54:35] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:54:35] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=59
[10:54:35] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:54:35] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28827
[10:54:35] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28823]
[10:54:35] [PUSH] Parsed message_id: 28823
[10:54:35] [PUSH] Parsed operation_type: 3
[10:54:35] [PUSH] Taking direct action: opType=3, messageId=28823
[10:54:35] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28823
[10:54:35] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:54:35] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:54:35] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[10:54:35] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:54:35] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:54:35] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:35] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[10:54:35] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28827
[10:54:35] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28827]
[10:54:35] [PUSH] Parsed message_id: 28827
[10:54:35] [PUSH] Parsed operation_type: 3
[10:54:35] [PUSH] Taking direct action: opType=3, messageId=28827
[10:54:35] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28827
[10:54:35] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:54:35] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[10:54:38] [SERVER] Polling - attempting to reconnect...
[10:54:38] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:54:38] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:54:42] [MENU] dismissAnyExistingMenu called
[10:54:42] [MENU] dismissAnyExistingMenu completed
[10:54:43] [EMOJI_PICKER] Starting emoji picker for message 28827
[10:54:43] [MENU] Created button 'Reply' at index 0
[10:54:43] [MENU] Created button 'Copy' at index 1
[10:54:43] [MENU] Created button 'Delete' at index 2
[10:54:43] [MENU] Menu added at y=517.0
[10:54:43] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x10b390000; baseClass = UITextView; frame = (44 8; 320 36
[10:54:43] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=0
[10:54:43] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[10:54:43] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[10:54:43] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[10:54:43] [EMOJI_PICKER] ✅ Picker shown at y=359.0
[10:54:43] [SERVER] Polling - attempting to reconnect...
[10:54:43] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:54:43] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:54:44] [REACTION] add ❤️ to message 28827 (alreadyReacted: false)
[10:54:44] [MENU] dismissAnyExistingMenu called
[10:54:44] [MENU] Found menu with tag 9999, removing
[10:54:44] [MENU] Removing blur effect
[10:54:44] [MENU] Removing floating message snapshot
[10:54:44] [MENU] Dismissing emoji picker
[10:54:44] [MENU] Recorded dismissal time for debounce
[10:54:44] [MENU] dismissAnyExistingMenu completed
[10:54:44] [REACTION] Added ❤️ reaction to message 28827
[10:54:44] [REACTION_SCROLL] =====ENTER path=picker action=add msgId=28827 emoji=❤️
[10:54:44] [REACTION_SCROLL] state offsetY=3816 bounds=758 adjTop=0 adjBot=0 contentH=4574 estH=0
[10:54:44] [REACTION_SCROLL] rows oldCount=52 newCount=52 reactedRow=51 reactedVisible=true
[10:54:44] [REACTION_SCROLL] reacted rectMinY=4464 rectH=98 cellFrameMinY=4464 cellFrameH=98
[10:54:44] [REACTION_SCROLL] anchor row=45 minY=3781 VPY=-35 visibleCount=7 visibleRows=[45, 46, 47, 48, 49, 50, 51]
[10:54:44] [REACTION_SCROLL] scrollState dragging=false decel=false tracking=false
[10:54:44] [REACTION_SCROLL] after reloadRows offsetΔ=0 contentHΔ=20
[10:54:44] [REACTION_SCROLL] after layoutIfNeeded offsetΔFromSave=0 contentHDelta=20
[10:54:44] [REACTION_SCROLL] reactedAfter rectMinY=4464 rectH=118 rectMinYΔ=0 rectHΔ=20
[10:54:44] [REACTION_SCROLL] reactedCellFrameAfter minY=4464 h=118
[10:54:44] [REACTION_SCROLL] anchor rectMinYAfter=3781 drift=0
[10:54:44] [REACTION_SCROLL] math rawTarget=3816 maxOffsetY=3836 clamped=3816 clampedAgainstRaw=0
[10:54:44] [REACTION_SCROLL] no offset change (within 0.5pt, current=3816)
[10:54:44] [REACTION_SCROLL] finalOffset=3816 totalΔFromSave=0
[10:54:44] [REACTION_SCROLL] =====EXIT
[10:54:45] [MENU] dismissAnyExistingMenu called
[10:54:45] [MENU] dismissAnyExistingMenu completed
[10:54:45] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3816, insetTop=0, topDistance=3816, rows=52, prefetchedCount=0
[10:54:45] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=54
[10:54:45] [SCROLL_WILL_END] velocity=(0.000, 1.345), currentY=3845, targetY=3836, movingTowardTop=true, decelNow=false, dragging=false
[10:54:45] [SCROLL_WILL_END] captured upward momentum velocityY=1.344816418221915
[10:54:45] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3845, topInset=0, pendingVelocityY=1.344816418221915, targetNearTop=3845
[10:54:46] [SCROLL_END_DECEL] messagesTable offsetY=3836, insetTop=0, pendingVelocityY=1.344816418221915
[10:54:48] [MENU] dismissAnyExistingMenu called
[10:54:48] [MENU] dismissAnyExistingMenu completed
[10:54:48] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3836, insetTop=0, topDistance=3836, rows=52, prefetchedCount=0
[10:54:48] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=0
[10:54:48] [SCROLL_WILL_END] velocity=(0.000, 2.129), currentY=3886, targetY=3836, movingTowardTop=true, decelNow=false, dragging=false
[10:54:48] [SCROLL_WILL_END] captured upward momentum velocityY=2.1289665408421135
[10:54:48] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3886, topInset=0, pendingVelocityY=2.1289665408421135, targetNearTop=3886
[10:54:48] [BOTTOM_PULL] Refreshing (not in windowed mode)
[10:54:48] [REFRESH_ALL] 🔄 refreshAllFromServer called from: editMessage, currentMsgCount=50
[10:54:48] [REFRESH_ALL] 📸 Captured 50 message IDs before request
[10:54:48] [REFRESH_ALL] 📡 Fetching URL: https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE
[10:54:48] [LIFECYCLE] App resigning active - cleared crash flag
[10:54:49] [SCROLL_END_DECEL] messagesTable offsetY=3836, insetTop=0, pendingVelocityY=2.1289665408421135
[10:54:49] [SERVER] Polling - attempting to reconnect...
[10:54:49] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[10:54:49] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:54:50] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:54:50] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:54:50] [SECURITY] Saved background timestamp
[10:54:50] [LIFECYCLE] App entering background - cleared crash flag
[10:54:50] [CLIENT_SIG] Disconnecting
[10:54:50] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:54:50] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:54:50] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:54:50] [LIFECYCLE] Background snapshot: count=50, maxId=28827
[10:54:50] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[10:54:50] [WS] Canceling WebSocket for query connection to iosILUIWU
[10:54:50] In cleanupPeer
[10:54:50] In cleanupPeer
[10:54:50] [LIFECYCLE] WebRTC audio disabled
[10:54:50] [LIFECYCLE] AVAudioSession deactivated
[10:54:50] [LIFECYCLE] All connections stopped
[10:54:50] [CLIENT_SIG] WebSocket closed with code 1001
[10:54:50] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:54:50] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[10:54:50] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:54:50] [SERVER] Stopped reconnect polling
[10:54:50] Will request stop of video 0
[10:54:50] Will request stop of video 0
[10:54:50] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[10:54:50] [WS] Query connection error - cleaning up all agent connections and views
[10:54:50] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:54:50] [WS] Query connection failed - cleaning up all agent connections and views
[10:54:50] [PIP] Removing 0 tracks from PiP for connection 0
[10:54:50] [PIP] ✅ All tracks removed for connection 0
[10:54:50] [PIP] Removing 0 tracks from PiP for connection 0
[10:54:50] [PIP] ✅ All tracks removed for connection 0
[10:54:50] [CLEANUP] ========================================
[10:54:50] [CLEANUP] Cleaning up all agent connections and views
[10:54:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:54:50] [CLEANUP] Stopped and removed 0 video connections
[10:54:50] [CLEANUP] Removed 0 video views
[10:54:50] [CLEANUP] Removed 0 feed scroll views
[10:54:50] [CLEANUP] Removed 0 status labels
[10:54:50] [CLEANUP] Reset agent query state
[10:54:50] [CLEANUP] Updated page indicator
[10:54:50] [CLEANUP] Rebuilt video layout
[10:54:50] [CLEANUP] ✅ All agent connections and views cleaned up
[10:54:50] [CLEANUP] ========================================
[10:54:50] [SERVER] Skipping reconnect polling - app is in background
[10:54:50] [WS] URLSession invalidated successfully
[10:54:50] [CLEANUP] ========================================
[10:54:50] [CLEANUP] Cleaning up all agent connections and views
[10:54:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:54:50] [CLEANUP] Stopped and removed 0 video connections
[10:54:50] [CLEANUP] Removed 0 video views
[10:54:50] [CLEANUP] Removed 0 feed scroll views
[10:54:50] [CLEANUP] Removed 0 status labels
[10:54:50] [CLEANUP] Reset agent query state
[10:54:50] [CLEANUP] Updated page indicator
[10:54:50] [CLEANUP] Rebuilt video layout
[10:54:50] [CLEANUP] ✅ All agent connections and views cleaned up
[10:54:50] [CLEANUP] ========================================
[10:54:50] [SERVER] Skipping reconnect polling - app is in background
[11:03:02] [NETWORK] Status changed: connected
[11:03:02] [CHAT] ❌ full refresh error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x1230c9260 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <5F3D28DC-1B54-48E4-B97C-43D44F026759>.<30>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <5F3D28DC-1B54-48E4-B97C-43D44F026759>.<30>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE, NSErrorFailingURLKey=https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=EDAD55A1-003F-415D-AA60-672B34B504FE, _kCFStreamErrorDomainKey=4} - keeping existing messages
[11:03:02] [BACKGROUND] Background fetch triggered
[11:03:02] [BACKGROUND] Fetching recent messages for pre-cache
[11:03:02] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:03:02] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:03:02] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:03:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:03:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:03:03] [CLIENT_SIG] WebSocket opened
[11:03:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:03:03] HELLO → sent (cached token, role=query)
[11:03:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:03:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28827, 28826, 28825, 28824, 28823]
[11:03:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:03:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:03:03] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:03:03] [SCROLL] wasNearBottom=true, threshold=758, offset=3836, contentH=4594, boundsH=758, forceScroll=false
[11:03:03] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:03:03] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:03:03] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:03:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:03:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[11:03:03] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[11:03:03] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[11:03:03] [SIG] hello_ok received for query connection - ready to query agents
[11:03:03] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[11:03:03] [SIG] get_agents request sent for sessionId=ILUIWU
[11:03:03] [SIG] get_agents request sent for sessionId=iosILUIWU
[11:03:03] [CLIENT_SIG] Connected! clientId=gbOE3Yf08WROezwY
[11:03:03] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=3836, currentOffset=3836
[11:03:03] [SERVER] Stopped reconnect polling
[11:03:03] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:03:03] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[11:03:03] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:03:03] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:03:03] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[11:03:03] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:03:03] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[11:03:03] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[11:03:03] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[11:03:03] [SERVER] Skipping reconnect polling - app is in background
[11:03:03] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[11:03:03] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:03:03] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:03:03] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:03:03] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:03:03] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:03:03] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:03:03] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:03:03] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:03:03] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:03:03] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[11:03:03] [BACKGROUND] Pre-downloaded 0 thumbnails
[11:03:03] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[11:11:54] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[11:11:54] [BACKGROUND] Background fetch triggered
[11:11:54] [BACKGROUND] Fetching recent messages for pre-cache
[11:11:54] [NETWORK] Status changed: connected
[11:11:54] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[11:11:54] [WS] Query connection failed - cleaning up all agent connections and views
[11:11:54] [WS] WebSocket task completed with error - isQueryOnly=true: The operation couldn’t be completed. Software caused connection abort
[11:11:54] [WS] Query connection error - cleaning up all agent connections and views
[11:11:54] [CLEANUP] ========================================
[11:11:54] [CLEANUP] Cleaning up all agent connections and views
[11:11:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:11:54] [CLEANUP] Stopped and removed 0 video connections
[11:11:54] [CLEANUP] Removed 0 video views
[11:11:54] [CLEANUP] Removed 0 feed scroll views
[11:11:54] [CLEANUP] Removed 0 status labels
[11:11:54] [CLEANUP] Reset agent query state
[11:11:54] [CLEANUP] Updated page indicator
[11:11:54] [CLEANUP] Rebuilt video layout
[11:11:54] [CLEANUP] ✅ All agent connections and views cleaned up
[11:11:54] [CLEANUP] ========================================
[11:11:54] [SERVER] Skipping reconnect polling - app is in background
[11:11:54] [CLEANUP] ========================================
[11:11:54] [CLEANUP] Cleaning up all agent connections and views
[11:11:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:11:54] [CLEANUP] Stopped and removed 0 video connections
[11:11:54] [CLEANUP] Removed 0 video views
[11:11:54] [CLEANUP] Removed 0 feed scroll views
[11:11:54] [CLEANUP] Removed 0 status labels
[11:11:54] [CLEANUP] Reset agent query state
[11:11:54] [CLEANUP] Updated page indicator
[11:11:54] [CLEANUP] Rebuilt video layout
[11:11:54] [CLEANUP] ✅ All agent connections and views cleaned up
[11:11:54] [CLEANUP] ========================================
[11:11:54] [SERVER] Skipping reconnect polling - app is in background
[11:11:54] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[11:11:54] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:11:54] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <5E19CD21-85A7-48B4-89FF-8B73F7A8EAB4>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <5E19CD21-85A7-48B4-89FF-8B73F7A8EAB4>.<1>}
[11:11:54] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:11:54] [CLIENT_SIG] Send error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[11:11:55] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[11:11:55] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:11:55] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:11:55] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:11:55] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:11:55] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:11:55] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:11:55] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:11:55] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:11:55] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:11:55] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[11:11:55] [BACKGROUND] Pre-downloaded 0 thumbnails
[11:11:55] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[11:11:56] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:11:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:11:56] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:11:56] HELLO → sent (cached token, role=query)
[11:11:56] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:11:56] [WS] Query connection failed - cleaning up all agent connections and views
[11:11:56] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:11:56] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:11:56] [CLEANUP] ========================================
[11:11:56] [CLEANUP] Cleaning up all agent connections and views
[11:11:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:11:56] [CLEANUP] Stopped and removed 0 video connections
[11:11:56] [CLEANUP] Removed 0 video views
[11:11:56] [CLEANUP] Removed 0 feed scroll views
[11:11:56] [CLEANUP] Removed 0 status labels
[11:11:56] [CLEANUP] Reset agent query state
[11:11:56] [CLEANUP] Updated page indicator
[11:11:56] [CLEANUP] Rebuilt video layout
[11:11:56] [CLEANUP] ✅ All agent connections and views cleaned up
[11:11:56] [CLEANUP] ========================================
[11:11:56] [SERVER] Skipping reconnect polling - app is in background
[11:11:56] [CLEANUP] ========================================
[11:11:56] [CLEANUP] Cleaning up all agent connections and views
[11:11:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:11:56] [CLEANUP] Stopped and removed 0 video connections
[11:11:56] [CLEANUP] Removed 0 video views
[11:11:56] [CLEANUP] Removed 0 feed scroll views
[11:11:56] [CLEANUP] Removed 0 status labels
[11:11:56] [CLEANUP] Reset agent query state
[11:11:56] [CLEANUP] Updated page indicator
[11:11:56] [CLEANUP] Rebuilt video layout
[11:11:56] [CLEANUP] ✅ All agent connections and views cleaned up
[11:11:56] [CLEANUP] ========================================
[11:11:56] [SERVER] Skipping reconnect polling - app is in background
[11:20:29] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[11:20:29] [BACKGROUND] Background fetch triggered
[11:20:29] [BACKGROUND] Fetching recent messages for pre-cache
[11:20:29] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:20:29] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:20:29] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:20:29] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:20:29] HELLO → sent (cached token, role=query)
[11:20:29] [CLIENT_SIG] WebSocket opened
[11:20:29] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:20:29] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:20:29] [WS] Query connection failed - cleaning up all agent connections and views
[11:20:29] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:20:29] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:20:29] [CLEANUP] ========================================
[11:20:29] [CLEANUP] Cleaning up all agent connections and views
[11:20:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:20:29] [CLEANUP] Stopped and removed 0 video connections
[11:20:29] [CLEANUP] Removed 0 video views
[11:20:29] [CLEANUP] Removed 0 feed scroll views
[11:20:29] [CLEANUP] Removed 0 status labels
[11:20:29] [CLEANUP] Reset agent query state
[11:20:29] [CLEANUP] Updated page indicator
[11:20:29] [CLEANUP] Rebuilt video layout
[11:20:29] [CLEANUP] ✅ All agent connections and views cleaned up
[11:20:29] [CLEANUP] ========================================
[11:20:29] [SERVER] Skipping reconnect polling - app is in background
[11:20:29] [CLEANUP] ========================================
[11:20:29] [CLEANUP] Cleaning up all agent connections and views
[11:20:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:20:29] [CLEANUP] Stopped and removed 0 video connections
[11:20:29] [CLEANUP] Removed 0 video views
[11:20:29] [CLEANUP] Removed 0 feed scroll views
[11:20:29] [CLEANUP] Removed 0 status labels
[11:20:29] [CLEANUP] Reset agent query state
[11:20:29] [CLEANUP] Updated page indicator
[11:20:29] [CLEANUP] Rebuilt video layout
[11:20:29] [CLEANUP] ✅ All agent connections and views cleaned up
[11:20:29] [CLEANUP] ========================================
[11:20:29] [SERVER] Skipping reconnect polling - app is in background
[11:20:29] [CLIENT_SIG] Connected! clientId=-WDh5nE5gNcDFLhq
[11:20:29] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:20:29] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:20:30] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[11:20:30] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:20:30] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:20:30] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:20:30] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:20:30] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:20:30] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:20:30] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:20:30] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:20:30] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:20:30] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[11:20:30] [BACKGROUND] Pre-downloaded 0 thumbnails
[11:20:30] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[11:28:02] [NETWORK] Status changed: connected
[11:28:02] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[11:28:02] [SECURITY] sceneWillEnterForeground - timeout exceeded, showing lock screen immediately
[11:28:02] [AUTH] ✅ All guards passed, showing privacy cover
[11:28:02] [LIFECYCLE] App entering foreground - restoring connections
[11:28:02] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[11:28:02] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[11:28:02] [PUSH_TRACE] 🔄 FOREGROUND: memory has 50 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:02] [PUSH_TRACE] 🔄 FOREGROUND: cache has 50 msgs, valid=true, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:02] [LIFECYCLE] Away > 2 minutes (1991s) - will scroll to bottom
[11:28:02] [UPLOAD_RETRY] No pending uploads to retry
[11:28:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:28:02] [READBY_OPT] No message IDs to fetch - skipping server call
[11:28:02] [LIFECYCLE] WebRTC audio re-enabled
[11:28:02] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[11:28:02] [CLIENT_SIG] Skipping connect - app in background (state=2)
[11:28:02] [VIEWER] Reconnecting after background - querying agents
[11:28:02] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[11:28:02] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:28:02] [UNSENT_RETRY] Checking for unsent messages...
[11:28:02] [PENDING_UPLOAD] Total pending upload messages: 0
[11:28:02] [UNSENT_RETRY] No unsent messages found
[11:28:02] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:02] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:02] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[11:28:02] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:28:02] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <F2BC2A41-2FCB-4F1D-8AA6-C0C4D68AA477>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <F2BC2A41-2FCB-4F1D-8AA6-C0C4D68AA477>.<1>}
[11:28:02] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:28:02] [CLIENT_SIG] Send error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[11:28:02] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[11:28:02] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=50>50=false, maxId=28827>28827=false, shouldScroll=true
[11:28:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:28:02] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:28:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[11:28:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28827, 28826, 28825, 28824, 28823]
[11:28:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:28:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:02] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:28:02] [SCROLL] wasNearBottom=true, threshold=758, offset=3836, contentH=4594, boundsH=758, forceScroll=true
[11:28:02] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:28:02] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:02] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:02] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[11:28:02] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:02] HELLO → sent (cached token, role=query)
[11:28:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3836, currentOffset=3836
[11:28:02] [SCROLL] Scrolling to 3836, animated=false
[11:28:02] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:02] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:02] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:02] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:02] [CLEANUP] ========================================
[11:28:02] [CLEANUP] Cleaning up all agent connections and views
[11:28:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:02] [CLEANUP] Stopped and removed 0 video connections
[11:28:02] [CLEANUP] Removed 0 video views
[11:28:02] [CLEANUP] Removed 0 feed scroll views
[11:28:02] [CLEANUP] Removed 0 status labels
[11:28:02] [CLEANUP] Reset agent query state
[11:28:02] [CLEANUP] Updated page indicator
[11:28:02] [CLEANUP] Rebuilt video layout
[11:28:02] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:02] [CLEANUP] ========================================
[11:28:02] [SERVER] Starting reconnect polling (5s interval)
[11:28:02] [CLEANUP] ========================================
[11:28:02] [CLEANUP] Cleaning up all agent connections and views
[11:28:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:02] [CLEANUP] Stopped and removed 0 video connections
[11:28:02] [CLEANUP] Removed 0 video views
[11:28:02] [CLEANUP] Removed 0 feed scroll views
[11:28:02] [CLEANUP] Removed 0 status labels
[11:28:02] [CLEANUP] Reset agent query state
[11:28:02] [CLEANUP] Updated page indicator
[11:28:02] [CLEANUP] Rebuilt video layout
[11:28:02] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:02] [CLEANUP] ========================================
[11:28:02] [SERVER] Starting reconnect polling (5s interval)
[11:28:02] [NETWORK] Status changed: connected
[11:28:03] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[11:28:03] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:28:03] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[11:28:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=-1 vccs=0
[11:28:03] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28827
[11:28:03] [PUSH] handlePollEventsNotification userInfo: [:]
[11:28:03] [PUSH] No message_id in userInfo
[11:28:03] [PUSH] No operation_type in userInfo
[11:28:03] [FAST_REFRESH] Evolution disabled - performing incremental sync
[11:28:03] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:03] [PUSH_TRACE] 📬 POLL: memory state: count=50, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:03] [FAST_REFRESH] Already have 50 messages in memory
[11:28:03] [FAST_REFRESH] maxMemoryId=28827, maxLocalId=28827
[11:28:03] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[11:28:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:28:03] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[11:28:03] [READBY_OPT] No message IDs to fetch - skipping server call
[11:28:03] [GAP_FIX] Incremental sync will use since_id=28827 (background max=28827, current DB max=28827)
[11:28:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:28:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[11:28:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[11:28:03] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[11:28:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:28:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:28:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[11:28:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28827, 28826, 28825, 28824, 28823]
[11:28:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:28:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:04] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:28:04] [SCROLL] wasNearBottom=true, threshold=758, offset=3836, contentH=4594, boundsH=758, forceScroll=true
[11:28:04] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:28:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:04] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[11:28:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3836, currentOffset=3836
[11:28:04] [SCROLL] Scrolling to 3836, animated=false
[11:28:04] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:04] HELLO → sent (cached token, role=query)
[11:28:04] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:04] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:04] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:04] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:04] [CLEANUP] ========================================
[11:28:04] [CLEANUP] Cleaning up all agent connections and views
[11:28:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:04] [CLEANUP] Stopped and removed 0 video connections
[11:28:04] [CLEANUP] Removed 0 video views
[11:28:04] [CLEANUP] Removed 0 feed scroll views
[11:28:04] [CLEANUP] Removed 0 status labels
[11:28:04] [CLEANUP] Reset agent query state
[11:28:04] [CLEANUP] Updated page indicator
[11:28:04] [CLEANUP] Rebuilt video layout
[11:28:04] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:04] [CLEANUP] ========================================
[11:28:04] [SERVER] Starting reconnect polling (5s interval)
[11:28:04] [CLEANUP] ========================================
[11:28:04] [CLEANUP] Cleaning up all agent connections and views
[11:28:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:04] [CLEANUP] Stopped and removed 0 video connections
[11:28:04] [CLEANUP] Removed 0 video views
[11:28:04] [CLEANUP] Removed 0 feed scroll views
[11:28:04] [CLEANUP] Removed 0 status labels
[11:28:04] [CLEANUP] Reset agent query state
[11:28:04] [CLEANUP] Updated page indicator
[11:28:04] [CLEANUP] Rebuilt video layout
[11:28:04] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:04] [CLEANUP] ========================================
[11:28:04] [SERVER] Starting reconnect polling (5s interval)
[11:28:04] [INCREMENTAL_SYNC] ✅ No new messages
[11:28:04] [FAST_REFRESH] Incremental sync complete - 50 messages
[11:28:05] [PIN_AUTH] Incorrect PIN
[11:28:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:05] HELLO → sent (cached token, role=query)
[11:28:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:05] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:05] [CLEANUP] ========================================
[11:28:05] [CLEANUP] Cleaning up all agent connections and views
[11:28:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:05] [CLEANUP] Stopped and removed 0 video connections
[11:28:05] [CLEANUP] Removed 0 video views
[11:28:05] [CLEANUP] Removed 0 feed scroll views
[11:28:05] [CLEANUP] Removed 0 status labels
[11:28:05] [CLEANUP] Reset agent query state
[11:28:05] [CLEANUP] Updated page indicator
[11:28:05] [CLEANUP] Rebuilt video layout
[11:28:05] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:05] [CLEANUP] ========================================
[11:28:05] [SERVER] Starting reconnect polling (5s interval)
[11:28:05] [CLEANUP] ========================================
[11:28:05] [CLEANUP] Cleaning up all agent connections and views
[11:28:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:05] [CLEANUP] Stopped and removed 0 video connections
[11:28:05] [CLEANUP] Removed 0 video views
[11:28:05] [CLEANUP] Removed 0 feed scroll views
[11:28:05] [CLEANUP] Removed 0 status labels
[11:28:05] [CLEANUP] Reset agent query state
[11:28:05] [CLEANUP] Updated page indicator
[11:28:05] [CLEANUP] Rebuilt video layout
[11:28:05] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:05] [CLEANUP] ========================================
[11:28:05] [SERVER] Starting reconnect polling (5s interval)
[11:28:06] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:28:06] [CLIENT_SIG] WebSocket opened
[11:28:06] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:28:06] [CLIENT_SIG] Connected! clientId=78baOiX3SXT3Bg2D
[11:28:06] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:28:06] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:28:06] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:28:07] [CLIENT_SIG] Typing stop from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:28:07] [CLIENT_SIG] Event received: type=0 messageId=28828
[11:28:07] [WS_EVENT] Received event: type=0, messageId=28828
[11:28:07] [WS_EVENT] 📨 New message notification (msgId=28828) - triggering incremental refresh, currentMsgCount=50
[11:28:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:28:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[11:28:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[11:28:07] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:28:07] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28828]
[11:28:07] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 50 msgs, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:07] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28828
[11:28:07] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:28:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:28:07] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[11:28:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:07] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[11:28:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28828, 28827, 28826, 28825, 28824]
[11:28:07] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:28:07] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:28:07] [SCROLL] wasNearBottom=true, threshold=758, offset=3836, contentH=4594, boundsH=758, forceScroll=false
[11:28:07] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:28:07] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:07] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:07] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28827 → 28828
[11:28:07] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[11:28:07] [SCROLL] 💓 alive, visible=45...52, rows=53, estHeight=0.0, heightCalls=115
[11:28:07] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3909, currentOffset=3909
[11:28:07] [SCROLL] Scrolling to 3909, animated=true
[11:28:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:07] HELLO → sent (cached token, role=query)
[11:28:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:07] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:07] [CLEANUP] ========================================
[11:28:07] [CLEANUP] Cleaning up all agent connections and views
[11:28:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:07] [CLEANUP] Stopped and removed 0 video connections
[11:28:07] [CLEANUP] Removed 0 video views
[11:28:07] [CLEANUP] Removed 0 feed scroll views
[11:28:07] [CLEANUP] Removed 0 status labels
[11:28:07] [CLEANUP] Reset agent query state
[11:28:07] [CLEANUP] Updated page indicator
[11:28:07] [CLEANUP] Rebuilt video layout
[11:28:07] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:07] [CLEANUP] ========================================
[11:28:07] [SERVER] Starting reconnect polling (5s interval)
[11:28:07] [CLEANUP] ========================================
[11:28:07] [CLEANUP] Cleaning up all agent connections and views
[11:28:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:07] [CLEANUP] Stopped and removed 0 video connections
[11:28:07] [CLEANUP] Removed 0 video views
[11:28:07] [CLEANUP] Removed 0 feed scroll views
[11:28:07] [CLEANUP] Removed 0 status labels
[11:28:07] [CLEANUP] Reset agent query state
[11:28:07] [CLEANUP] Updated page indicator
[11:28:07] [CLEANUP] Rebuilt video layout
[11:28:07] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:07] [CLEANUP] ========================================
[11:28:07] [SERVER] Starting reconnect polling (5s interval)
[11:28:07] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:28:07 +0000 - type: unknown, operation_type: 0, message_id: 28828, session_id: ILUIWU, state: 0
[11:28:07] [PUSH_DEBUG] Full userInfo: [AnyHashable("sender_name"): Laurent, AnyHashable("file_name"): , AnyHashable("message"): Install latest version. It's available. Not 100% perfect but almost there., AnyHashable("datesent"): 2026-04-23 08:28:07, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:28:07";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Install latest version. It's available. Not 100% perfect but almost there.";
    "message_id" = 28828;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28827;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_type"): 0, AnyHashable("message_id"): 28828, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): ]
[11:28:07] [PUSH] App active - suppressing notification UI, posting internal event
[11:28:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:28:07 +0000
[11:28:07] [PUSH_TRACE] ⬇️ Processing embedded message_id=28828
[11:28:07] [PUSH_EMBED] 📩 Received embedded message: id=28828, type=0, sender=Laurent
[11:28:07] [PUSH_TRACE] ⬇️ Message details: text="Install latest version. It's available. Not 100% p...", datesent=2026-04-23 08:28:07
[11:28:07] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:28:07] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28828
[11:28:07] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28828
[11:28:07] [PUSH_EMBED] ✅ Saved message 28828 to local DB (sync)
[11:28:07] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28828
[11:28:07] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28828
[11:28:07] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28828
[11:28:07] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[11:28:07] [PUSH_EMBED] Inserted message 28828 into existing cache (now 51 messages)
[11:28:07] [PUSH_TRACE] 📦 ✅ Inserted message 28828, cache now has IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [PUSH_TRACE] 📦 EXITING cache update queue for message 28828
[11:28:07] [PUSH_EMBED] Fetching evolution data for message 28828 in background
[11:28:07] [PUSH_EMBED] ✅ Fully processed message 28828
[11:28:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28828
[11:28:07] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=-1 vccs=0
[11:28:07] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28828
[11:28:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("sender_name"): Laurent, AnyHashable("file_name"): , AnyHashable("message"): Install latest version. It's available. Not 100% perfect but almost there., AnyHashable("datesent"): 2026-04-23 08:28:07, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:28:07";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Install latest version. It's available. Not 100% perfect but almost there.";
    "message_id" = 28828;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28827;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_type"): 0, AnyHashable("message_id"): 28828, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): ]
[11:28:07] [PUSH_EMBED_VC] Message 28828 already in memory - skipping
[11:28:07] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:28:07] [PUSH] Parsed message_id: 28828
[11:28:07] [PUSH] Parsed operation_type: 0
[11:28:07] [PUSH] Taking direct action: opType=0, messageId=28828
[11:28:07] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28828
[11:28:07] [PUSH] ⚡ Message 28828 already in memory - skipping duplicate notification entirely
[11:28:07] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[11:28:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:28:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28828
[11:28:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[11:28:07] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:28:07] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:28:07] [PUSH_TRACE] 👁️ Received message id=28828, text="Install latest version. It's a..."
[11:28:07] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:28:07] [PUSH_UI] Message 28828 already in memory - skipping insert
[11:28:07] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:28:07] [PUSH] Silent push received
[11:28:07] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:28:07 +0000, appState=0, message_id=28828, type=nil
[11:28:07] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:28:07 +0000
[11:28:07] [PUSH_TRACE] ⬇️ Processing embedded message_id=28828
[11:28:07] [PUSH_EMBED] 📩 Received embedded message: id=28828, type=0, sender=Laurent
[11:28:07] [PUSH_TRACE] ⬇️ Message details: text="Install latest version. It's available. Not 100% p...", datesent=2026-04-23 08:28:07
[11:28:07] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:28:07] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28828
[11:28:07] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28828
[11:28:07] [PUSH_EMBED] ✅ Saved message 28828 to local DB (sync)
[11:28:07] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28828
[11:28:07] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28828
[11:28:07] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28828
[11:28:07] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [PUSH_TRACE] 📦 ⚠️ Message 28828 already in cache, skipping insert
[11:28:07] [PUSH_TRACE] 📦 EXITING cache update queue for message 28828
[11:28:07] [PUSH_EMBED] Fetching evolution data for message 28828 in background
[11:28:07] [PUSH_EMBED] ✅ Fully processed message 28828
[11:28:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28828
[11:28:07] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819], handled=true
[11:28:07] [PUSH] Embedded message handled instantly from silent push
[11:28:07] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:28:07] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28828
[11:28:07] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:28:07] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:28:07] [PUSH_TRACE] 👁️ Received message id=28828, text="Install latest version. It's a..."
[11:28:07] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:28:07] [PUSH_UI] Message 28828 already in memory - skipping insert
[11:28:07] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:28:07] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:07] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=-1 vccs=0
[11:28:07] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28828
[11:28:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("sender_name"): Laurent, AnyHashable("file_name"): , AnyHashable("message"): Install latest version. It's available. Not 100% perfect but almost there., AnyHashable("datesent"): 2026-04-23 08:28:07, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:28:07";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Install latest version. It's available. Not 100% perfect but almost there.";
    "message_id" = 28828;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28827;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_type"): 0, AnyHashable("message_id"): 28828, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): ]
[11:28:07] [PUSH_EMBED_VC] Message 28828 already in memory - skipping
[11:28:07] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:28:07] [PUSH] Parsed message_id: 28828
[11:28:07] [PUSH] Parsed operation_type: 0
[11:28:07] [PUSH] Taking direct action: opType=0, messageId=28828
[11:28:07] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28828
[11:28:07] [PUSH] ⚡ Message 28828 already in memory - skipping duplicate notification entirely
[11:28:07] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[11:28:07] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[11:28:08] [NETWORK] Status changed: connected
[11:28:08] [PUSH_EMBED] Got evolution data for message 28828, saving to local DB
[11:28:08] [PUSH_EMBED] Saved evolution data for message 28828
[11:28:08] [PUSH_EMBED] Got evolution data for message 28828, saving to local DB
[11:28:08] [PUSH_EMBED] Saved evolution data for message 28828
[11:28:08] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:28:08] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28828]
[11:28:08] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:08] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:08] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:28:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:28:08] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[11:28:08] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:28:08] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28828
[11:28:08] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[11:28:08] [INCREMENTAL_SYNC] ✅ No new messages
[11:28:08] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:28:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28828, 28827, 28826, 28825, 28824]
[11:28:08] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:28:08] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:08] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:28:08] [SCROLL] wasNearBottom=true, threshold=758, offset=3909, contentH=4667, boundsH=758, forceScroll=true
[11:28:08] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:28:08] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:08] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:08] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[11:28:08] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3909, currentOffset=3909
[11:28:08] [SCROLL] Scrolling to 3909, animated=false
[11:28:09] [PUSH] Silent push received
[11:28:09] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:28:09 +0000, appState=0, message_id=nil, type=nil
[11:28:09] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:28:09 +0000
[11:28:09] [PUSH_EMBED] No embedded message_data in notification
[11:28:09] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:28:09] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819], handled=false
[11:28:09] [PUSH] No embedded data, pre-loading messages from server
[11:28:09] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:28:09] [NETWORK] Status changed: connected
[11:28:09] [CLIENT_SIG] Event received: type=3 messageId=28828
[11:28:09] [WS_EVENT] Received event: type=3, messageId=28828
[11:28:09] [WS_EVENT] Read receipt for message 28828 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:28:09] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:09] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:09] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:28:09] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:28:09] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:28:09] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:28:09] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:28:09] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:28:09] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28737]
[11:28:09] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28737]
[11:28:09] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[11:28:09] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:28:09] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=-1 vccs=0
[11:28:09] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28828
[11:28:09] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28828, AnyHashable("session_id"): ILUIWU]
[11:28:09] [PUSH] Parsed message_id: 28828
[11:28:09] [PUSH] Parsed operation_type: 3
[11:28:09] [PUSH] Taking direct action: opType=3, messageId=28828
[11:28:09] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28828
[11:28:09] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[11:28:09] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:28:09] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28828
[11:28:09] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[11:28:09] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:09] HELLO → sent (cached token, role=query)
[11:28:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:09] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:09] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:09] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:09] [CLEANUP] ========================================
[11:28:09] [CLEANUP] Cleaning up all agent connections and views
[11:28:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:09] [CLEANUP] Stopped and removed 0 video connections
[11:28:09] [CLEANUP] Removed 0 video views
[11:28:09] [CLEANUP] Removed 0 feed scroll views
[11:28:09] [CLEANUP] Removed 0 status labels
[11:28:09] [CLEANUP] Reset agent query state
[11:28:09] [CLEANUP] Updated page indicator
[11:28:09] [CLEANUP] Rebuilt video layout
[11:28:09] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:09] [CLEANUP] ========================================
[11:28:09] [SERVER] Starting reconnect polling (5s interval)
[11:28:09] [CLEANUP] ========================================
[11:28:09] [CLEANUP] Cleaning up all agent connections and views
[11:28:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:09] [CLEANUP] Stopped and removed 0 video connections
[11:28:09] [CLEANUP] Removed 0 video views
[11:28:09] [CLEANUP] Removed 0 feed scroll views
[11:28:09] [CLEANUP] Removed 0 status labels
[11:28:09] [CLEANUP] Reset agent query state
[11:28:09] [CLEANUP] Updated page indicator
[11:28:09] [CLEANUP] Rebuilt video layout
[11:28:09] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:09] [CLEANUP] ========================================
[11:28:09] [SERVER] Starting reconnect polling (5s interval)
[11:28:09] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:28:09] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28828]
[11:28:09] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:28:09] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:28:09] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[11:28:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28828, 28827, 28826, 28825, 28824]
[11:28:09] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:28:09] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:09] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:28:09] [SCROLL] wasNearBottom=true, threshold=758, offset=3909, contentH=4667, boundsH=758, forceScroll=false
[11:28:09] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:28:09] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:09] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:09] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:09] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[11:28:09] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=3909, currentOffset=3909[11:28:10] [LOG] Pruned 651 entries older than 3 hours
[11:28:10] [SECURITY] Restored real session: ILUIWU
[11:28:10] [SECURITY] Restored real session: ILUIWU
[11:28:10] [FAKE_AI] cancel() called, wasRunning=false
[11:28:10] [FAKE MODE] Exiting fake mode, restoring real session
[11:28:10] [SECURITY] Restored real session: ILUIWU
[11:28:10] [SECURITY] Saved real session: ILUIWU
[11:28:10] [FAKE MODE] ✅ Restored real session: ILUIWU
[11:28:10] [FAKE MODE] Loaded 50 messages (limited to page size)
[11:28:10] [READBY_OPT] No message IDs to fetch - skipping server call
[11:28:10] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[11:28:10] [AUTH] Cache had 51 messages, maxExistingId=28828, inserted 0 truly new
[11:28:10] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>50=false, maxId=28828>28827=true, shouldScroll=true
[11:28:10] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:28:10] [AUTH] UI update complete
[11:28:10] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:28:10] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:28:10] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[11:28:10] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:28:10] [FAKE MODE] Enriched 0/0 unsettled messages with readBy data
[11:28:10] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:28:10] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:28:10] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:10] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:10] [SCROLL] 💓 alive, visible=44...51, rows=52, estHeight=0.0, heightCalls=121
[11:28:10] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:28:10] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:28:10] [USER] ✅ User registered successfully
[11:28:10] [PUSH] User registration after token update: success
[11:28:10] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:28:10] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28828, 28827, 28826, 28825, 28824]
[11:28:10] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:28:10] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:10] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:28:10] [SCROLL] wasNearBottom=true, threshold=758, offset=3811, contentH=4569, boundsH=758, forceScroll=true
[11:28:10] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:28:10] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:28:10] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:28:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:28:10] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[11:28:10] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3811, currentOffset=3811
[11:28:10] [SCROLL] Scrolling to 3811, animated=false
[11:28:11] [NETWORK] Status changed: connected
[11:28:11] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:11] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:11] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:11] HELLO → sent (cached token, role=query)
[11:28:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:11] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:11] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:11] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:11] [CLEANUP] ========================================
[11:28:11] [CLEANUP] Cleaning up all agent connections and views
[11:28:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:11] [CLEANUP] Stopped and removed 0 video connections
[11:28:11] [CLEANUP] Removed 0 video views
[11:28:11] [CLEANUP] Removed 0 feed scroll views
[11:28:11] [CLEANUP] Removed 0 status labels
[11:28:11] [CLEANUP] Reset agent query state
[11:28:11] [CLEANUP] Updated page indicator
[11:28:11] [CLEANUP] Rebuilt video layout
[11:28:11] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:11] [CLEANUP] ========================================
[11:28:11] [SERVER] Starting reconnect polling (5s interval)
[11:28:11] [CLEANUP] ========================================
[11:28:11] [CLEANUP] Cleaning up all agent connections and views
[11:28:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:11] [CLEANUP] Stopped and removed 0 video connections
[11:28:11] [CLEANUP] Removed 0 video views
[11:28:11] [CLEANUP] Removed 0 feed scroll views
[11:28:11] [CLEANUP] Removed 0 status labels
[11:28:11] [CLEANUP] Reset agent query state
[11:28:11] [CLEANUP] Updated page indicator
[11:28:11] [CLEANUP] Rebuilt video layout
[11:28:11] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:11] [CLEANUP] ========================================
[11:28:11] [SERVER] Starting reconnect polling (5s interval)
[11:28:13] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:13] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:13] HELLO → sent (cached token, role=query)
[11:28:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:13] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:13] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:13] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:13] [CLEANUP] ========================================
[11:28:13] [CLEANUP] Cleaning up all agent connections and views
[11:28:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:13] [CLEANUP] Stopped and removed 0 video connections
[11:28:13] [CLEANUP] Removed 0 video views
[11:28:13] [CLEANUP] Removed 0 feed scroll views
[11:28:13] [CLEANUP] Removed 0 status labels
[11:28:13] [CLEANUP] Reset agent query state
[11:28:13] [CLEANUP] Updated page indicator
[11:28:13] [CLEANUP] Rebuilt video layout
[11:28:13] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:13] [CLEANUP] ========================================
[11:28:13] [SERVER] Starting reconnect polling (5s interval)
[11:28:13] [CLEANUP] ========================================
[11:28:13] [CLEANUP] Cleaning up all agent connections and views
[11:28:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:13] [CLEANUP] Stopped and removed 0 video connections
[11:28:13] [CLEANUP] Removed 0 video views
[11:28:13] [CLEANUP] Removed 0 feed scroll views
[11:28:13] [CLEANUP] Removed 0 status labels
[11:28:13] [CLEANUP] Reset agent query state
[11:28:13] [CLEANUP] Updated page indicator
[11:28:13] [CLEANUP] Rebuilt video layout
[11:28:13] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:13] [CLEANUP] ========================================
[11:28:13] [SERVER] Starting reconnect polling (5s interval)
[11:28:14] [MENU] dismissAnyExistingMenu called
[11:28:14] [MENU] dismissAnyExistingMenu completed
[11:28:14] [EMOJI_PICKER] Starting emoji picker for message 28828
[11:28:14] [MENU] Created button 'Reply' at index 0
[11:28:14] [MENU] Created button 'Copy' at index 1
[11:28:14] [MENU] Created button 'Delete' at index 2
[11:28:14] [MENU] Menu added at y=504.5
[11:28:15] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[11:28:15] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[11:28:15] [EMOJI_PICKER] ✅ Picker shown at y=371.5
[11:28:15] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:15] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:15] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:15] HELLO → sent (cached token, role=query)
[11:28:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:15] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:15] [CLEANUP] ========================================
[11:28:15] [CLEANUP] Cleaning up all agent connections and views
[11:28:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:15] [CLEANUP] Stopped and removed 0 video connections
[11:28:15] [CLEANUP] Removed 0 video views
[11:28:15] [CLEANUP] Removed 0 feed scroll views
[11:28:15] [CLEANUP] Removed 0 status labels
[11:28:15] [CLEANUP] Reset agent query state
[11:28:15] [CLEANUP] Updated page indicator
[11:28:15] [CLEANUP] Rebuilt video layout
[11:28:15] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:15] [CLEANUP] ========================================
[11:28:15] [SERVER] Starting reconnect polling (5s interval)
[11:28:15] [CLEANUP] ========================================
[11:28:15] [CLEANUP] Cleaning up all agent connections and views
[11:28:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:15] [CLEANUP] Stopped and removed 0 video connections
[11:28:15] [CLEANUP] Removed 0 video views
[11:28:15] [CLEANUP] Removed 0 feed scroll views
[11:28:15] [CLEANUP] Removed 0 status labels
[11:28:15] [CLEANUP] Reset agent query state
[11:28:15] [CLEANUP] Updated page indicator
[11:28:15] [CLEANUP] Rebuilt video layout
[11:28:15] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:15] [CLEANUP] ========================================
[11:28:15] [SERVER] Starting reconnect polling (5s interval)
[11:28:15] [REACTION] add ❤️ to message 28828 (alreadyReacted: false)
[11:28:15] [MENU] dismissAnyExistingMenu called
[11:28:15] [MENU] Found menu with tag 9999, removing
[11:28:15] [MENU] Removing blur effect
[11:28:15] [MENU] Removing floating message snapshot
[11:28:15] [MENU] Dismissing emoji picker
[11:28:15] [MENU] Recorded dismissal time for debounce
[11:28:15] [MENU] dismissAnyExistingMenu completed
[11:28:16] [REACTION] Added ❤️ reaction to message 28828
[11:28:16] [REACTION_SCROLL] =====ENTER path=picker action=add msgId=28828 emoji=❤️
[11:28:16] [REACTION_SCROLL] state offsetY=3811 bounds=758 adjTop=0 adjBot=0 contentH=4569 estH=0
[11:28:16] [REACTION_SCROLL] rows oldCount=52 newCount=52 reactedRow=51 reactedVisible=true
[11:28:16] [REACTION_SCROLL] reacted rectMinY=4484 rectH=73 cellFrameMinY=4484 cellFrameH=73
[11:28:16] [REACTION_SCROLL] anchor row=44 minY=3683 VPY=-128 visibleCount=8 visibleRows=[44, 45, 46, 47, 48, 49, 50, 51]
[11:28:16] [REACTION_SCROLL] scrollState dragging=false decel=false tracking=false
[11:28:16] [REACTION_SCROLL] after reloadRows offsetΔ=0 contentHΔ=20
[11:28:16] [REACTION_SCROLL] after layoutIfNeeded offsetΔFromSave=0 contentHDelta=20
[11:28:16] [REACTION_SCROLL] reactedAfter rectMinY=4484 rectH=93 rectMinYΔ=0 rectHΔ=20
[11:28:16] [REACTION_SCROLL] reactedCellFrameAfter minY=4484 h=93
[11:28:16] [REACTION_SCROLL] anchor rectMinYAfter=3683 drift=0
[11:28:16] [REACTION_SCROLL] math rawTarget=3811 maxOffsetY=3831 clamped=3811 clampedAgainstRaw=0
[11:28:16] [REACTION_SCROLL] no offset change (within 0.5pt, current=3811)
[11:28:16] [REACTION_SCROLL] finalOffset=3811 totalΔFromSave=0
[11:28:16] [REACTION_SCROLL] =====EXIT
[11:28:17] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:17] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:28:17] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:28:17] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:28:17] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:28:17] HELLO → sent (cached token, role=query)
[11:28:17] [LIFECYCLE] App resigning active - cleared crash flag
[11:28:17] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:28:17] [WS] Query connection failed - cleaning up all agent connections and views
[11:28:17] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[11:28:17] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:28:17] [CLEANUP] ========================================
[11:28:17] [CLEANUP] Cleaning up all agent connections and views
[11:28:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:17] [CLEANUP] Stopped and removed 0 video connections
[11:28:17] [CLEANUP] Removed 0 video views
[11:28:17] [CLEANUP] Removed 0 feed scroll views
[11:28:17] [CLEANUP] Removed 0 status labels
[11:28:17] [CLEANUP] Reset agent query state
[11:28:17] [CLEANUP] Updated page indicator
[11:28:17] [CLEANUP] Rebuilt video layout
[11:28:17] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:17] [CLEANUP] ========================================
[11:28:17] [SERVER] Starting reconnect polling (5s interval)
[11:28:17] [CLEANUP] ========================================
[11:28:17] [CLEANUP] Cleaning up all agent connections and views
[11:28:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[11:28:17] [CLEANUP] Stopped and removed 0 video connections
[11:28:17] [CLEANUP] Removed 0 video views
[11:28:17] [CLEANUP] Removed 0 feed scroll views
[11:28:17] [CLEANUP] Removed 0 status labels
[11:28:17] [CLEANUP] Reset agent query state
[11:28:17] [CLEANUP] Updated page indicator
[11:28:17] [CLEANUP] Rebuilt video layout
[11:28:17] [CLEANUP] ✅ All agent connections and views cleaned up
[11:28:17] [CLEANUP] ========================================
[11:28:17] [SERVER] Starting reconnect polling (5s interval)
[11:28:18] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[11:28:18] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[11:28:18] [SECURITY] Saved background timestamp
[11:28:18] [LIFECYCLE] App entering background - cleared crash flag
[11:28:18] [CLIENT_SIG] Disconnecting
[11:28:18] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[11:28:18] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[11:28:18] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:28:18] [LIFECYCLE] Background snapshot: count=50, maxId=28828
[11:28:18] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[11:28:18] [WS] Canceling WebSocket for query connection to iosILUIWU
[11:28:18] In cleanupPeer
[11:28:18] In cleanupPeer
[11:28:18] [LIFECYCLE] WebRTC audio disabled
[11:28:18] [LIFECYCLE] AVAudioSession deactivated
[11:28:18] [LIFECYCLE] All connections stopped
[11:28:18] [CLIENT_SIG] WebSocket closed with code 1001
[11:28:18] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:28:18] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:28:18] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:28:18] [SERVER] Stopped reconnect polling
[11:28:18] [WS] URLSession invalidated successfully
[11:28:18] Will request stop of video 0
[11:28:18] Will request stop of video 0
[11:28:18] [PIP] Removing 0 tracks from PiP for connection 0
[11:28:18] [PIP] ✅ All tracks removed for connection 0
[11:28:18] [PIP] Removing 0 tracks from PiP for connection 0
[11:28:18] [PIP] ✅ All tracks removed for connection 0
[11:29:38] [MIGRATION] Copied DB to shared container[11:29:39] [MIGRATION] Copied 2701 media files to shared cache
[11:29:39] [MIGRATION] ✅ App Group migration complete — NSE unblocked
[11:29:39] [CRASH] No crash detected
[11:29:39] [LOG] Pruned 64 entries older than 3 hours
[11:29:39] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[11:29:39] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[11:29:39] [GIPHY] SDK not available - using REST API fallback
[11:29:39] [BACKGROUND] Background fetch enabled
[11:29:39] [SECURITY] Initial launch - timeout exceeded (81.30250072479248s > 0.0s)
[11:29:39] [AUTH] Starting PIN authentication
[11:29:39] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:29:39] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:29:39] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:29:39] [CLEANUP] No old timer messages to delete
[11:29:39] [CLIENT_SIG] WebSocket opened
[11:29:39] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:29:39] [CLIENT_SIG] Connected! clientId=lhrKTovF5654qkbT
[11:29:39] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:29:39] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[11:29:39] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28828)...
[11:29:39] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:29:39] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:29:39] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:29:39] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:29:39] [USER] ✅ User registered successfully
[11:29:39] [PUSH] User registration after token update: success
[11:29:39] [PRELOAD] No messages or parse error
[11:29:40] [PIN_AUTH] Correct PIN
[11:29:40] [SECURITY] Restored real session: ILUIWU
[11:29:40] [SECURITY] Restored real session: ILUIWU
[11:29:41] [SECURITY] Saved real session: ILUIWU
[11:29:41] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[11:29:41] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[11:29:41] [UPLOAD_QUEUE] ✅ Database integrity check passed
[11:29:41] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[11:29:41] Documents Directory: /var/mobile/Containers/Data/Application/C54170A7-4208-45E1-972B-D75BEF83B039/Documents
[11:29:41] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[11:29:41] [CAPTURE_HOST] live-feed moved hosted view to plain container
[11:29:41] [THEME] Applying current theme
[11:29:41] [CHAT] Applied day theme (mode: day)
[11:29:41] [SECURITY] Saved real session: ILUIWU
[11:29:41] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[11:29:41] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:29:41] [NETWORK] Network monitor started
[11:29:41] [NETWORK] Status changed: connected
[11:29:41] Did transition
[11:29:41] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[11:29:41] [VIEWER] Screen lock enabled - normal idle behavior
[11:29:41] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[11:29:41] [VCC] ========== VideoConnectionClass INIT ==========
[11:29:41] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[11:29:41] [DATA AUDIO] ========== setupWebRTC() START ==========
[11:29:41] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[11:29:41] [DATA AUDIO] Creating encoder/decoder factories...
[11:29:41] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[11:29:41] [CODEC] Viewer selected encoder: AV1 (best quality)
[11:29:41] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[11:29:41] [DATA AUDIO] ✅ Factory created
[11:29:41] [DATA AUDIO] RTCAudioSession locked
[11:29:41] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[11:29:41] [DATA AUDIO] RTCAudioSession unlocked
[11:29:41] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[11:29:41] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[11:29:41] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[11:29:41] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:29:41] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[11:29:41] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[11:29:41] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:29:41] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[11:29:41] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[11:29:41] Did transition
[11:29:41] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[11:29:41] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:29:41] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:29:41] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:29:41] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[11:29:41] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[11:29:41] [READBY_OPT] No message IDs to fetch - skipping server call
[11:29:41] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[11:29:41] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[11:29:41] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[11:29:41] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[11:29:41] [USER] ✅ User registered successfully
[11:29:41] [USER] User registration successful
[11:29:41] [GALLERY_DB] ✅ Loaded 1256 media messages
[11:29:41] [MIGRATION] No messages need sender_name backfill
[11:29:41] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:29:41] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28828
[11:29:41] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[11:29:42] [INCREMENTAL_SYNC] ✅ No new messages
[11:29:42] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[11:29:42] [GALLERY] First 5 after sort (newest first):
[11:29:42] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[11:29:42] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[11:29:42] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[11:29:42] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[11:29:42] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[11:29:42] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[11:29:42] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[11:29:42] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:29:42] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28828, 28827, 28826, 28825, 28824]
[11:29:42] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:29:42] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:29:42] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:29:42] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[11:29:42] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:29:42] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[11:29:42] [CELL_UPLOAD] configure: msgId=28740, file=adbb72082c79fd33.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:29:42] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:29:42] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=adbb72082c79fd33.jpg, overlayExists=true
[11:29:42] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[11:29:42] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:29:42] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:29:42] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:29:42] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:29:42] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:29:42] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:29:42] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[11:29:42] [SERVER] Starting reconnect polling (5s interval)
[11:29:42] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[11:29:42] [ICONS] Offset applied: -14.6
[11:29:42] [ICONS] New left margin: 11.2, New right margin: 11.3
[11:29:42] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[11:29:42] [ICONS] Chat center: (31.2, 87.0)
[11:29:42] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[11:29:42] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[11:29:42] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[11:29:42] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[11:29:42] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[11:29:42] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[11:29:42] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[11:29:42] [ICONS] Screen width: 440.0
[11:29:42] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3831, currentOffset=3831
[11:29:42] [SCROLL] Scrolling to 3831, animated=false
[11:29:42] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:29:42] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[11:29:42] [UNSENT_RETRY] Checking for unsent messages...
[11:29:42] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[11:29:42] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[11:29:42] [UPLOAD_RECOVERY] Session: ILUIWU
[11:29:42] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[11:29:42] [UPLOAD_RECOVERY] Checking recent media messages on server...
[11:29:42] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[11:29:42] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[11:29:42] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[11:29:42] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[11:29:42] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[11:29:42] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[11:29:42] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[11:29:42] [PENDING_UPLOAD] Total pending upload messages: 0
[11:29:42] [UNSENT_RETRY] No unsent messages found
[11:29:42] new_session POST ok: token len=157
[11:29:42] HELLO → sent (fetched token, role=query)
[11:29:42] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[11:29:42] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[11:29:42] [SIG] hello_ok received for query connection - ready to query agents
[11:29:42] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[11:29:42] [SIG] get_agents request sent for sessionId=ILUIWU
[11:29:42] [SIG] get_agents request sent for sessionId=iosILUIWU
[11:29:42] [SERVER] Stopped reconnect polling
[11:29:42] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=67
[11:29:42] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28828, 28827, 28826, 28825, 28824]
[11:29:42] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:29:42] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[11:29:42] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:29:42] [SCROLL] wasNearBottom=true, threshold=758, offset=3831, contentH=4589, boundsH=758, forceScroll=true
[11:29:42] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:29:42] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:29:42] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:29:42] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:29:42] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[11:29:42] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3831, currentOffset=3831
[11:29:42] [SCROLL] Scrolling to 3831, animated=false
[11:29:42] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:29:42] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[11:29:42] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[11:29:42] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:29:42] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[11:29:42] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[11:29:42] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[11:29:42] [SERVER] Starting reconnect polling (5s interval)
[11:29:42] [UPLOAD_RECOVERY] ✅ All media files verified on server
[11:29:43] [SCROLL] 💓 alive, visible=44...51, rows=52, estHeight=0.0, heightCalls=60
[11:29:47] [SERVER] Polling - attempting to reconnect...
[11:29:47] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:29:47] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:29:52] [SERVER] Polling - attempting to reconnect...
[11:29:52] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:29:52] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:29:55] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[11:29:55] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[11:29:55] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[11:29:55] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:29:55] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28828, 28827, 28826, 28825]
[11:29:55] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:29:55] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:29:55] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:29:55] [SCROLL] wasNearBottom=true, threshold=447, offset=4142, contentH=4589, boundsH=447, forceScroll=false
[11:29:55] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:29:55] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[11:29:55] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=114
[11:29:55] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[11:29:55] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[11:29:55] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4219, currentOffset=4219
[11:29:55] [SCROLL] Scrolling to 4219, animated=true
[11:29:56] [CLIENT_SIG] Event received: type=0 messageId=28829
[11:29:56] [WS_EVENT] Received event: type=0, messageId=28829
[11:29:56] [WS_EVENT] 📨 New message notification (msgId=28829) - triggering incremental refresh, currentMsgCount=51
[11:29:56] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:29:56] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28828
[11:29:56] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[11:29:56] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28829,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:29:56"}
[11:29:56] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 08:29:56, "session_id": ILUIWU, "message_id": 28829, "file_name": , "message_type": 0, "ok": 1]
[11:29:56] [DB_UPGRADE] Upgrading message ID: -1 → 28829, preserveOriginalDate=false
[11:29:56] [DB_UPGRADE] ✅ Upgraded -1 → 28829 with send_status=0, 1 row(s) affected
[11:29:56] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28829
[11:29:56] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28829
[11:29:56] ReloadData 9
[11:29:56] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:29:56] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28829]
[11:29:56] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:29:56] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:29:56] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:29:56] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:29:56] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[11:29:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=58
[11:29:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28829, 28828, 28827, 28826, 28825]
[11:29:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:29:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:29:57] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:29:57] [SCROLL] wasNearBottom=true, threshold=447, offset=4219, contentH=4666, boundsH=447, forceScroll=false
[11:29:57] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:29:57] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[11:29:57] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4219, currentOffset=4219
[11:29:57] [SERVER] Polling - attempting to reconnect...
[11:29:57] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:29:57] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:00] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:02] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[11:30:02] [SERVER] Polling - attempting to reconnect...
[11:30:02] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:02] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:02] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:02] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=71ms
[11:30:02] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:03] [PUSH] Silent push received
[11:30:03] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:30:03 +0000, appState=0, message_id=nil, type=nil
[11:30:03] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:30:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:03 +0000
[11:30:03] [PUSH_EMBED] No embedded message_data in notification
[11:30:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:30:03] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:30:03] [PUSH] No embedded data, pre-loading messages from server
[11:30:03] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:30:03] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:30:03] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:30:03] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:30:03] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:30:03] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:30:03] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:30:03] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:30:03] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[11:30:03] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:30:03] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:30:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:30:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=1 vccs=0
[11:30:03] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28829
[11:30:03] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28829, AnyHashable("session_id"): ILUIWU]
[11:30:03] [PUSH] Parsed message_id: 28829
[11:30:03] [PUSH] Parsed operation_type: 3
[11:30:03] [PUSH] Taking direct action: opType=3, messageId=28829
[11:30:03] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28829
[11:30:03] [CLIENT_SIG] Event received: type=3 messageId=28829
[11:30:03] [WS_EVENT] Received event: type=3, messageId=28829
[11:30:03] [WS_EVENT] Read receipt for message 28829 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:30:03] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:06] [CLIENT_SIG] Typing start from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:30:07] [MENU] dismissAnyExistingMenu called
[11:30:07] [MENU] dismissAnyExistingMenu completed
[11:30:07] [SCROLL_BEGIN_DRAG] messagesTable offsetY=4219, insetTop=0, topDistance=4219, rows=53, prefetchedCount=0
[11:30:07] [SCROLL] 💓 alive, visible=48...52, rows=53, estHeight=0.0, heightCalls=59
[11:30:07] [SCROLL_WILL_END] velocity=(0.000, 0.789), currentY=4237, targetY=4219, movingTowardTop=true, decelNow=false, dragging=false
[11:30:07] [SCROLL_WILL_END] captured upward momentum velocityY=0.7892459697185715
[11:30:07] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=4237, topInset=0, pendingVelocityY=0.7892459697185715, targetNearTop=4237
[11:30:08] [SCROLL_END_DECEL] messagesTable offsetY=4219, insetTop=0, pendingVelocityY=0.7892459697185715
[11:30:08] [SERVER] Polling - attempting to reconnect...
[11:30:08] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:08] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:08] [LIFECYCLE] App resigning active - cleared crash flag
[11:30:10] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[11:30:10] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[11:30:10] [SECURITY] Saved background timestamp
[11:30:10] [LIFECYCLE] App entering background - cleared crash flag
[11:30:10] [CLIENT_SIG] Disconnecting
[11:30:10] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[11:30:10] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[11:30:10] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[11:30:10] [LIFECYCLE] Background snapshot: count=51, maxId=28829
[11:30:10] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[11:30:10] [WS] Canceling WebSocket for query connection to iosILUIWU
[11:30:10] In cleanupPeer
[11:30:10] In cleanupPeer
[11:30:10] [LIFECYCLE] WebRTC audio disabled
[11:30:10] [LIFECYCLE] AVAudioSession deactivated
[11:30:10] [LIFECYCLE] All connections stopped
[11:30:10] [CLIENT_SIG] WebSocket closed with code 1001
[11:30:10] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:30:10] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:30:10] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:30:10] [SERVER] Stopped reconnect polling
[11:30:10] Will request stop of video 0
[11:30:10] Will request stop of video 0
[11:30:10] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[11:30:10] [WS] Query connection error - cleaning up all agent connections and views
[11:30:10] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:30:10] [WS] Query connection failed - cleaning up all agent connections and views
[11:30:10] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[11:30:15] [CRASH] No crash detected
[11:30:15] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[11:30:15] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[11:30:15] [GIPHY] SDK not available - using REST API fallback
[11:30:15] [BACKGROUND] Background fetch enabled
[11:30:15] [SECURITY] Initial launch - timeout exceeded (4.767084121704102s > 0.0s)
[11:30:15] [AUTH] Starting PIN authentication
[11:30:15] [PUSH] Silent push received
[11:30:15] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:30:15 +0000, appState=2, message_id=28830, type=nil
[11:30:15] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:30:15] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:15 +0000
[11:30:15] [PUSH_TRACE] ⬇️ Processing embedded message_id=28830
[11:30:15] [PUSH_EMBED] 📩 Received embedded message: id=28830, type=0, sender=Laurent
[11:30:15] [PUSH_TRACE] ⬇️ Message details: text="Let me know if it works indeed better....", datesent=2026-04-23 08:30:13
[11:30:15] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:30:15] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28830
[11:30:15] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28830
[11:30:15] [CLEANUP] No old timer messages to delete
[11:30:15] [PUSH_EMBED] ✅ Saved message 28830 to local DB (sync)
[11:30:15] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28830
[11:30:15] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28830
[11:30:15] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28830
[11:30:15] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[11:30:15] [PUSH_EMBED] Created new cache with embedded message 28830
[11:30:15] [PUSH_TRACE] 📦 ✅ Created new cache with message 28830
[11:30:15] [PUSH_TRACE] 📦 EXITING cache update queue for message 28830
[11:30:15] [PUSH_EMBED] Fetching evolution data for message 28830 in background
[11:30:15] [PUSH_EMBED] ✅ Fully processed message 28830
[11:30:15] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28830
[11:30:15] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28830], handled=true
[11:30:15] [PUSH] Embedded message handled instantly from silent push
[11:30:15] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:30:15] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28830
[11:30:15] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:30:15] [PRELOAD] Cache already valid (1 messages), skipping pre-load
[11:30:15] [PUSH_EMBED] Got evolution data for message 28830, saving to local DB
[11:30:15] [PUSH_EMBED] Saved evolution data for message 28830
[11:30:15] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:30:15] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:30:15] [USER] ✅ User registered successfully
[11:30:15] [PUSH] User registration after token update: success
[11:30:21] [PUSH] Notification tapped - session_id: ILUIWU
[11:30:21] [PUSH] Max message_id before tap: 28830
[11:30:21] [PUSH] Stored pending session: ILUIWU
[11:30:21] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:21 +0000
[11:30:21] [PUSH_TRACE] ⬇️ Processing embedded message_id=28830
[11:30:21] [PUSH_EMBED] 📩 Received embedded message: id=28830, type=0, sender=Laurent
[11:30:21] [PUSH_TRACE] ⬇️ Message details: text="Let me know if it works indeed better....", datesent=2026-04-23 08:30:13
[11:30:21] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:30:21] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28830
[11:30:21] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28830
[11:30:21] [PUSH_EMBED] ✅ Saved message 28830 to local DB (sync)
[11:30:21] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28830
[11:30:21] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28830
[11:30:21] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28830
[11:30:21] [PUSH_TRACE] 📦 Cache state: valid=true, count=1, IDs=[28830]
[11:30:21] [PUSH_TRACE] 📦 ⚠️ Message 28830 already in cache, skipping insert
[11:30:21] [PUSH_TRACE] 📦 EXITING cache update queue for message 28830
[11:30:21] [PUSH_EMBED] Fetching evolution data for message 28830 in background
[11:30:21] [PUSH_EMBED] ✅ Fully processed message 28830
[11:30:21] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28830
[11:30:21] [PUSH] Embedded message handled instantly on tap
[11:30:21] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:30:21] [PUSH] Fetching server messages since_id=28830 to catch coalesced notifications on tap
[11:30:21] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28830 to catch coalesced notifications
[11:30:21] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:30:21] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:30:22] [CLIENT_SIG] WebSocket opened
[11:30:22] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:30:22] [CLIENT_SIG] Connected! clientId=ZZ_SZOVmZ_zxYpk2
[11:30:22] [PUSH_EMBED] Got evolution data for message 28830, saving to local DB
[11:30:22] [PUSH_EMBED] Saved evolution data for message 28830
[11:30:22] [PUSH_PRELOAD] No messages or parse error
[11:30:22] [PUSH] Server fetch on tap completed (success=false)
[11:30:22] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:30:22] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:30:26] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:30:26] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow[11:30:27] [LOG] Pruned 74 entries older than 3 hours
[11:30:27] [SECURITY] Restored real session: ILUIWU
[11:30:27] [SECURITY] Restored real session: ILUIWU
[11:30:27] [SECURITY] Saved real session: ILUIWU
[11:30:27] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[11:30:27] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[11:30:27] [UPLOAD_QUEUE] ✅ Database integrity check passed
[11:30:27] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[11:30:27] Documents Directory: /var/mobile/Containers/Data/Application/C54170A7-4208-45E1-972B-D75BEF83B039/Documents
[11:30:27] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[11:30:27] [CAPTURE_HOST] live-feed moved hosted view to plain container
[11:30:27] [THEME] Applying current theme
[11:30:27] [CHAT] Applied day theme (mode: day)
[11:30:27] [SECURITY] Saved real session: ILUIWU
[11:30:27] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[11:30:27] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:30:27] [NETWORK] Network monitor started
[11:30:27] [NETWORK] Status changed: connected
[11:30:27] Did transition
[11:30:27] [CHUNK] Pre-cache has only 1 messages - supplementing from local DB
[11:30:27] [CHUNK] After merge: 50 messages (added 49 from local DB)
[11:30:27] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[11:30:27] [VIEWER] Screen lock enabled - normal idle behavior
[11:30:27] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[11:30:27] [VCC] ========== VideoConnectionClass INIT ==========
[11:30:27] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[11:30:27] [DATA AUDIO] ========== setupWebRTC() START ==========
[11:30:27] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[11:30:27] [DATA AUDIO] Creating encoder/decoder factories...
[11:30:27] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[11:30:27] [CODEC] Viewer selected encoder: AV1 (best quality)
[11:30:27] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[11:30:27] [DATA AUDIO] ✅ Factory created
[11:30:27] [DATA AUDIO] RTCAudioSession locked
[11:30:27] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[11:30:27] [DATA AUDIO] RTCAudioSession unlocked
[11:30:27] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[11:30:27] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[11:30:27] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[11:30:27] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:30:27] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[11:30:27] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[11:30:27] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:30:27] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[11:30:27] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[11:30:27] Did transition
[11:30:27] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[11:30:27] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:30:27] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:30:27] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:30:27] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[11:30:27] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[11:30:27] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[11:30:27] [READBY_OPT] Fetching readBy for 1 unsettled messages (targeted)
[11:30:27] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[11:30:27] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[11:30:27] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[11:30:27] [USER] ✅ User registered successfully
[11:30:27] [USER] User registration successful
[11:30:27] [GALLERY_DB] ✅ Loaded 1256 media messages
[11:30:27] [MIGRATION] No messages need sender_name backfill
[11:30:27] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:30:27] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28830
[11:30:27] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[11:30:27] [INCREMENTAL_SYNC] ✅ No new messages
[11:30:27] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[11:30:27] [GALLERY] First 5 after sort (newest first):
[11:30:27] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[11:30:27] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[11:30:27] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[11:30:27] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[11:30:27] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[11:30:27] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[11:30:27] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[11:30:28] [SERVER] Starting reconnect polling (5s interval)
[11:30:28] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[11:30:28] [ICONS] Offset applied: -14.6
[11:30:28] [ICONS] New left margin: 11.2, New right margin: 11.3
[11:30:28] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:30:28] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:30:28] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:30:28] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[11:30:28] [ICONS] Chat center: (31.2, 87.0)
[11:30:28] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[11:30:28] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[11:30:28] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[11:30:28] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[11:30:28] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[11:30:28] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[11:30:28] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[11:30:28] [ICONS] Screen width: 440.0
[11:30:28] [COMBINED_FETCH] Loaded 1 read receipts, 0 messages with reactions
[11:30:28] [READBY_ENRICH] Enriched 1/1 unsettled messages with readBy data
[11:30:28] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:30:28] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28830, 28829, 28828, 28827, 28826]
[11:30:28] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:30:28] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[11:30:28] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:30:28] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[11:30:28] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:30:28] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[11:30:28] [CELL_UPLOAD] configure: msgId=28740, file=adbb72082c79fd33.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:30:28] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:30:28] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=adbb72082c79fd33.jpg, overlayExists=true
[11:30:28] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[11:30:28] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:30:28] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[11:30:28] [UNSENT_RETRY] Checking for unsent messages...
[11:30:28] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[11:30:28] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[11:30:28] [UPLOAD_RECOVERY] Session: ILUIWU
[11:30:28] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[11:30:28] [UPLOAD_RECOVERY] Checking recent media messages on server...
[11:30:28] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[11:30:28] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[11:30:28] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[11:30:28] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[11:30:28] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[11:30:28] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[11:30:28] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[11:30:28] [PENDING_UPLOAD] Total pending upload messages: 0
[11:30:28] [UNSENT_RETRY] No unsent messages found
[11:30:28] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:30:28] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:30:28] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:30:28] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28829 → 28830
[11:30:28] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3856, currentOffset=3856
[11:30:28] [SCROLL] Scrolling to 3856, animated=false
[11:30:28] new_session POST ok: token len=157
[11:30:28] HELLO → sent (fetched token, role=query)
[11:30:28] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[11:30:28] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[11:30:28] [SIG] hello_ok received for query connection - ready to query agents
[11:30:28] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[11:30:28] [SIG] get_agents request sent for sessionId=ILUIWU
[11:30:28] [SIG] get_agents request sent for sessionId=iosILUIWU
[11:30:28] [SERVER] Stopped reconnect polling
[11:30:28] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=68
[11:30:28] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28830, 28829, 28828, 28827, 28826]
[11:30:28] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:30:28] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[11:30:28] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:30:28] [SCROLL] wasNearBottom=true, threshold=758, offset=3856, contentH=4614, boundsH=758, forceScroll=true
[11:30:28] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:30:28] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[11:30:28] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[11:30:28] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[11:30:28] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[11:30:28] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3856, currentOffset=3856
[11:30:28] [SCROLL] Scrolling to 3856, animated=false
[11:30:28] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:30:28] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[11:30:28] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[11:30:28] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:30:28] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[11:30:28] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[11:30:28] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[11:30:28] [SERVER] Starting reconnect polling (5s interval)
[11:30:28] [UPLOAD_RECOVERY] ✅ All media files verified on server
[11:30:31] [PUSH] Silent push received
[11:30:31] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:30:31 +0000, appState=0, message_id=nil, type=nil
[11:30:31] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:30:31] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:31 +0000
[11:30:31] [PUSH_EMBED] No embedded message_data in notification
[11:30:31] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:30:31] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:30:31] [PUSH] No embedded data, pre-loading messages from server
[11:30:31] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:30:31] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:31] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:30:31] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:30:31] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:30:31] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:30:31] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:30:31] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:30:31] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[11:30:31] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[11:30:31] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:30:31] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:30:31] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[11:30:31] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:30:31] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28830
[11:30:31] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28830, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
[11:30:31] [PUSH] Parsed message_id: 28830
[11:30:31] [PUSH] Parsed operation_type: 3
[11:30:31] [PUSH] Taking direct action: opType=3, messageId=28830
[11:30:31] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28830
[11:30:31] [CLIENT_SIG] Event received: type=3 messageId=28830
[11:30:31] [WS_EVENT] Received event: type=3, messageId=28830
[11:30:31] [WS_EVENT] Read receipt for message 28830 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:30:32] [MUTE] Status sent to server: muted=0, response code=200
[11:30:32] [MUTE] Status sent to server: muted=0, response code=200
[11:30:33] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:33] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:30:33] [SERVER] Polling - attempting to reconnect...
[11:30:33] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:33] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:33] [NETWORK] Status changed: connected
[11:30:33] [MUTE] Status sent to server: muted=1, response code=200
[11:30:33] [MUTE] Status sent to server: muted=1, response code=200
[11:30:34] [NETWORK] Status changed: connected
[11:30:35] [SCROLL] 💓 alive, visible=42...48, rows=52, estHeight=0.0, heightCalls=63
[11:30:35] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[11:30:35] [SCROLL_END_DECEL] messagesTable offsetY=4167, insetTop=0, pendingVelocityY=0.0
[11:30:38] [SERVER] Polling - attempting to reconnect...
[11:30:38] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:38] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:43] [SERVER] Polling - attempting to reconnect...
[11:30:43] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:43] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:48] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[11:30:48] [SERVER] Polling - attempting to reconnect...
[11:30:48] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:48] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:48] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=114ms
[11:30:53] [SERVER] Polling - attempting to reconnect...
[11:30:53] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:53] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:30:58] [SERVER] Polling - attempting to reconnect...
[11:30:58] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:30:58] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:31:03] [SERVER] Polling - attempting to reconnect...
[11:31:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:31:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:31:08] [CAM_CONN] 💓 PING #2 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[11:31:08] [SERVER] Polling - attempting to reconnect...
[11:31:08] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:31:08] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:31:10] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[11:31:10] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[11:31:10] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[11:31:10] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=5
[11:31:10] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28830, 28829, 28828, 28827]
[11:31:10] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:31:10] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:10] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:31:10] [SCROLL] wasNearBottom=true, threshold=429, offset=4167, contentH=4614, boundsH=429, forceScroll=false
[11:31:10] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:31:10] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[11:31:10] [SCROLL] 💓 alive, visible=47...52, rows=53, estHeight=0.0, heightCalls=111
[11:31:10] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[11:31:10] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[11:31:10] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4265, currentOffset=4265
[11:31:10] [SCROLL] Scrolling to 4265, animated=true
[11:31:11] [CLIENT_SIG] Event received: type=0 messageId=28831
[11:31:11] [WS_EVENT] Received event: type=0, messageId=28831
[11:31:11] [WS_EVENT] 📨 New message notification (msgId=28831) - triggering incremental refresh, currentMsgCount=51
[11:31:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:31:11] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28830
[11:31:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[11:31:11] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28831,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:31:11"}
[11:31:11] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 08:31:11, "message_id": 28831, "file_name": , "message_type": 0, "session_id": ILUIWU, "ok": 1]
[11:31:11] [DB_UPGRADE] Upgrading message ID: -1 → 28831, preserveOriginalDate=false
[11:31:11] [DB_UPGRADE] ✅ Upgraded -1 → 28831 with send_status=0, 1 row(s) affected
[11:31:11] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28831
[11:31:11] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28831
[11:31:11] ReloadData 9
[11:31:11] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:31:11] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28831]
[11:31:11] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:11] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:11] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:31:11] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:31:11] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[11:31:11] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[11:31:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28831, 28830, 28829, 28828, 28827]
[11:31:11] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:31:11] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:11] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:31:11] [SCROLL] wasNearBottom=true, threshold=447, offset=4265, contentH=4712, boundsH=447, forceScroll=true
[11:31:11] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:31:11] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[11:31:11] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4265, currentOffset=4265
[11:31:11] [SCROLL] Scrolling to 4265, animated=false
[11:31:12] [LIFECYCLE] App resigning active - cleared crash flag
[11:31:13] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[11:31:13] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[11:31:13] [SECURITY] Saved background timestamp
[11:31:13] [LIFECYCLE] App entering background - cleared crash flag
[11:31:13] [CLIENT_SIG] Disconnecting
[11:31:13] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[11:31:13] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[11:31:13] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:13] [LIFECYCLE] Background snapshot: count=51, maxId=28831
[11:31:13] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[11:31:13] [WS] Canceling WebSocket for query connection to iosILUIWU
[11:31:13] In cleanupPeer
[11:31:13] In cleanupPeer
[11:31:13] [LIFECYCLE] WebRTC audio disabled
[11:31:13] [LIFECYCLE] AVAudioSession deactivated
[11:31:13] [LIFECYCLE] All connections stopped
[11:31:13] [CLIENT_SIG] WebSocket closed with code 1001
[11:31:13] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:31:13] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:31:13] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:31:13] [SERVER] Stopped reconnect polling
[11:31:13] Will request stop of video 0
[11:31:13] Will request stop of video 0
[11:31:13] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[11:31:13] [WS] Query connection error - cleaning up all agent connections and views
[11:31:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:31:13] [WS] Query connection failed - cleaning up all agent connections and views
[11:31:13] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...[11:31:16] [LOG] Pruned 324 entries older than 3 hours
[11:31:16] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[11:31:16] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[11:31:16] [GIPHY] SDK not available - using REST API fallback
[11:31:16] [BACKGROUND] Background fetch enabled
[11:31:16] [SECURITY] Initial launch - timeout exceeded (3.172506093978882s > 0.0s)
[11:31:16] [AUTH] Starting PIN authentication
[11:31:16] [PUSH] Silent push received
[11:31:16] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:16 +0000, appState=2, message_id=nil, type=nil
[11:31:16] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:31:16] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:16 +0000
[11:31:16] [PUSH_EMBED] No embedded message_data in notification
[11:31:16] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:31:16] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:31:16] [PUSH] No embedded data, pre-loading messages from server
[11:31:16] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:31:16] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:31:16] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:31:16] [CLEANUP] No old timer messages to delete
[11:31:16] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28828)...
[11:31:16] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:31:16] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:31:16] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:31:16] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:31:16] [PRELOAD] Fetched 3 messages
[11:31:16] [PRELOAD] ✅ Saved 3 messages to local DB
[11:31:16] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=3, sessionId=ILUIWU
[11:31:16] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28831, 28830, 28829]
[11:31:16] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[11:31:16] [PRELOAD] ⚡ Cached 3 messages for instant display (preserved 0 from push)
[11:31:17] [USER] ✅ User registered successfully
[11:31:17] [PUSH] User registration after token update: success
[11:31:17] [USER] ✅ User registered successfully
[11:31:17] [PUSH] User registration after token update: success
[11:31:17] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:31:17] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:31:17] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:31:17] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:31:17] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:31:17] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:31:17] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:17] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=3, IDs=[28831, 28830, 28829]
[11:31:17] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:31:17] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:17] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:31:17] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:31:33] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:31:33] [PUSH] Silent push received
[11:31:33] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:33 +0000, appState=2, message_id=28832, type=nil
[11:31:33] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:33 +0000
[11:31:33] [PUSH_TRACE] ⬇️ Processing embedded message_id=28832
[11:31:33] [PUSH_EMBED] 📩 Received embedded message: id=28832, type=0, sender=Laurent
[11:31:33] [PUSH_TRACE] ⬇️ Message details: text="Helloooooooo...", datesent=2026-04-23 08:31:31
[11:31:33] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:31:33] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28832
[11:31:33] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28832
[11:31:33] [PUSH_EMBED] ✅ Saved message 28832 to local DB (sync)
[11:31:33] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28832
[11:31:33] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28832
[11:31:33] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28832
[11:31:33] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[11:31:33] [PUSH_EMBED] Inserted message 28832 into existing cache (now 51 messages)
[11:31:33] [PUSH_TRACE] 📦 ✅ Inserted message 28832, cache now has IDs: [28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[11:31:33] [PUSH_TRACE] 📦 EXITING cache update queue for message 28832
[11:31:33] [PUSH_EMBED] Fetching evolution data for message 28832 in background
[11:31:33] [PUSH_EMBED] ✅ Fully processed message 28832
[11:31:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28832
[11:31:33] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823], handled=true
[11:31:33] [PUSH] Embedded message handled instantly from silent push
[11:31:33] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:31:33] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28832
[11:31:33] [PUSH_EMBED] Got evolution data for message 28832, saving to local DB
[11:31:33] [PUSH_EMBED] Saved evolution data for message 28832
[11:31:41] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:31:41] [PUSH] Silent push received
[11:31:41] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:41 +0000, appState=2, message_id=28833, type=nil
[11:31:41] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[11:31:41] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:41 +0000
[11:31:41] [PUSH_TRACE] ⬇️ Processing embedded message_id=28833
[11:31:41] [PUSH_EMBED] 📩 Received embedded message: id=28833, type=0, sender=Laurent
[11:31:41] [PUSH_TRACE] ⬇️ Message details: text="Notified or not ?...", datesent=2026-04-23 08:31:39
[11:31:41] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:31:41] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28833
[11:31:41] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28833
[11:31:41] [PUSH_EMBED] ✅ Saved message 28833 to local DB (sync)
[11:31:41] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28833
[11:31:41] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28833
[11:31:41] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28833
[11:31:41] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[11:31:41] [PUSH_EMBED] Inserted message 28833 into existing cache (now 52 messages)
[11:31:41] [PUSH_TRACE] 📦 ✅ Inserted message 28833, cache now has IDs: [28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[11:31:41] [PUSH_TRACE] 📦 EXITING cache update queue for message 28833
[11:31:41] [PUSH_EMBED] Fetching evolution data for message 28833 in background
[11:31:41] [PUSH_EMBED] ✅ Fully processed message 28833
[11:31:41] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28833
[11:31:41] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=52, IDs=[28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824], handled=true
[11:31:41] [PUSH] Embedded message handled instantly from silent push
[11:31:41] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:31:41] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28833
[11:31:41] [PUSH_EMBED] Got evolution data for message 28833, saving to local DB
[11:31:41] [PUSH_EMBED] Saved evolution data for message 28833
[11:31:43] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:31:43] [PUSH] Silent push received
[11:31:43] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:43 +0000, appState=2, message_id=28834, type=nil
[11:31:43] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=52, IDs=[28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[11:31:43] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:43 +0000
[11:31:43] [PUSH_TRACE] ⬇️ Processing embedded message_id=28834
[11:31:43] [PUSH_EMBED] 📩 Received embedded message: id=28834, type=0, sender=Laurent
[11:31:43] [PUSH_TRACE] ⬇️ Message details: text="I hope not !...", datesent=2026-04-23 08:31:42
[11:31:43] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:31:43] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28834
[11:31:43] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28834
[11:31:43] [PUSH_EMBED] ✅ Saved message 28834 to local DB (sync)
[11:31:43] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28834
[11:31:43] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28834
[11:31:43] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28834
[11:31:43] [PUSH_TRACE] 📦 Cache state: valid=true, count=52, IDs=[28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[11:31:43] [PUSH_EMBED] Inserted message 28834 into existing cache (now 53 messages)
[11:31:43] [PUSH_TRACE] 📦 ✅ Inserted message 28834, cache now has IDs: [28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[11:31:43] [PUSH_TRACE] 📦 EXITING cache update queue for message 28834
[11:31:43] [PUSH_EMBED] Fetching evolution data for message 28834 in background
[11:31:43] [PUSH_EMBED] ✅ Fully processed message 28834
[11:31:43] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28834
[11:31:43] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825], handled=true
[11:31:43] [PUSH] Embedded message handled instantly from silent push
[11:31:43] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:31:43] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28834
[11:31:43] [PUSH_EMBED] Got evolution data for message 28834, saving to local DB
[11:31:43] [PUSH_EMBED] Saved evolution data for message 28834
[11:31:49] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:31:49] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:49] [CLIENT_SIG] Receive error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSLocalizedDescription=The network connection was lost., NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:31:49] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:31:49] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <B93D83D5-8104-4E66-ADD8-115079AD19A8>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <B93D83D5-8104-4E66-ADD8-115079AD19A8>.<1>, NSLocalizedDescription=The network connection was lost.}
[11:31:49] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:31:49] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:31:49] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow[11:31:50] [LOG] Pruned 28 entries older than 3 hours
[11:31:50] [SECURITY] Restored real session: ILUIWU
[11:31:50] [SECURITY] Restored real session: ILUIWU
[11:31:50] [SECURITY] Saved real session: ILUIWU
[11:31:50] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[11:31:50] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[11:31:50] [UPLOAD_QUEUE] ✅ Database integrity check passed
[11:31:50] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[11:31:50] Documents Directory: /var/mobile/Containers/Data/Application/C54170A7-4208-45E1-972B-D75BEF83B039/Documents
[11:31:50] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[11:31:50] [CAPTURE_HOST] live-feed moved hosted view to plain container
[11:31:50] [THEME] Applying current theme
[11:31:50] [CHAT] Applied day theme (mode: day)
[11:31:50] [SECURITY] Saved real session: ILUIWU
[11:31:50] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[11:31:50] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:50] [NETWORK] Network monitor started
[11:31:50] [NETWORK] Status changed: connected
[11:31:50] Did transition
[11:31:50] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[11:31:50] [VIEWER] Screen lock enabled - normal idle behavior
[11:31:50] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[11:31:50] [VCC] ========== VideoConnectionClass INIT ==========
[11:31:50] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[11:31:50] [DATA AUDIO] ========== setupWebRTC() START ==========
[11:31:50] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[11:31:50] [DATA AUDIO] Creating encoder/decoder factories...
[11:31:50] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[11:31:50] [CODEC] Viewer selected encoder: AV1 (best quality)
[11:31:50] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[11:31:50] [DATA AUDIO] ✅ Factory created
[11:31:50] [DATA AUDIO] RTCAudioSession locked
[11:31:50] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[11:31:50] [DATA AUDIO] RTCAudioSession unlocked
[11:31:50] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[11:31:50] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[11:31:50] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[11:31:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:31:50] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[11:31:50] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[11:31:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:31:50] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[11:31:50] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[11:31:50] Did transition
[11:31:50] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[11:31:50] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:31:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:31:50] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:31:50] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[11:31:50] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[11:31:50] [READBY_OPT] No message IDs to fetch - skipping server call
[11:31:50] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[11:31:50] [MIGRATION] No messages need sender_name backfill
[11:31:50] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:31:50] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[11:31:50] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[11:31:50] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[11:31:51] [GALLERY_DB] ✅ Loaded 1256 media messages
[11:31:51] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28834, maxMemoryId=28834
[11:31:51] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28834
[11:31:51] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[11:31:51] [GALLERY] First 5 after sort (newest first):
[11:31:51] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[11:31:51] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[11:31:51] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[11:31:51] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[11:31:51] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[11:31:51] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[11:31:51] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[11:31:51] [SERVER] Starting reconnect polling (5s interval)
[11:31:51] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[11:31:51] [ICONS] Offset applied: -14.6
[11:31:51] [ICONS] New left margin: 11.2, New right margin: 11.3
[11:31:51] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[11:31:51] [ICONS] Chat center: (31.2, 87.0)
[11:31:51] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[11:31:51] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[11:31:51] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[11:31:51] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[11:31:51] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[11:31:51] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[11:31:51] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[11:31:51] [ICONS] Screen width: 440.0
[11:31:51] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:31:51] [CLIENT_SIG] WebSocket opened
[11:31:51] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:31:51] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:31:51] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[11:31:51] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:31:51] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:31:51] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28834, 28833, 28832, 28831, 28830]
[11:31:51] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:31:51] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[11:31:51] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:31:51] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[11:31:51] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:31:51] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[11:31:51] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[11:31:51] [INCREMENTAL_SYNC] ✅ No new messages
[11:31:51] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28831 → 28832
[11:31:51] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28832 → 28833
[11:31:51] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28833 → 28834
[11:31:51] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:31:51] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3386, currentOffset=3386
[11:31:51] [SCROLL] Scrolling to 3386, animated=false
[11:31:51] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[11:31:51] [UNSENT_RETRY] Checking for unsent messages...
[11:31:51] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[11:31:51] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[11:31:51] [UPLOAD_RECOVERY] Session: ILUIWU
[11:31:51] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[11:31:51] [UPLOAD_RECOVERY] Checking recent media messages on server...
[11:31:51] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[11:31:51] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[11:31:51] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[11:31:51] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[11:31:51] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[11:31:51] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[11:31:51] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[11:31:51] [PENDING_UPLOAD] Total pending upload messages: 0
[11:31:51] [UNSENT_RETRY] No unsent messages found
[11:31:51] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=73
[11:31:51] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28834, 28833, 28832, 28831, 28830]
[11:31:51] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:31:51] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[11:31:51] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:31:51] [SCROLL] wasNearBottom=true, threshold=758, offset=3386, contentH=4144, boundsH=758, forceScroll=true
[11:31:51] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:31:51] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[11:31:51] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3386, currentOffset=3386
[11:31:51] [SCROLL] Scrolling to 3386, animated=false
[11:31:51] [CLIENT_SIG] Connected! clientId=zz_xVAWqRQ1a9AUX
[11:31:51] [USER] ✅ User registered successfully
[11:31:51] [USER] User registration successful
[11:31:51] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:31:51] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:31:51] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:51] new_session POST ok: token len=157
[11:31:51] HELLO → sent (fetched token, role=query)
[11:31:51] [UPLOAD_RECOVERY] ✅ All media files verified on server
[11:31:51] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[11:31:51] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[11:31:51] [SIG] hello_ok received for query connection - ready to query agents
[11:31:51] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[11:31:51] [SIG] get_agents request sent for sessionId=ILUIWU
[11:31:51] [SIG] get_agents request sent for sessionId=iosILUIWU
[11:31:52] [SERVER] Stopped reconnect polling
[11:31:52] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:31:52] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[11:31:52] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[11:31:52] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:31:52] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[11:31:52] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[11:31:52] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[11:31:52] [SERVER] Starting reconnect polling (5s interval)
[11:31:52] [CLIENT_SIG] Typing stop from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:31:52] [CLIENT_SIG] Event received: type=0 messageId=28835
[11:31:52] [WS_EVENT] Received event: type=0, messageId=28835
[11:31:52] [WS_EVENT] 📨 New message notification (msgId=28835) - triggering incremental refresh, currentMsgCount=50
[11:31:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:31:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28834, maxMemoryId=28834
[11:31:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28834
[11:31:52] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:31:52] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28835]
[11:31:52] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 50 msgs, first 10 IDs=[28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[11:31:52] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28835
[11:31:52] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 51, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:52] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:31:52] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:31:52] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[11:31:52] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[11:31:52] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28835, 28834, 28833, 28832, 28831]
[11:31:52] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:31:52] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:52] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:31:52] [SCROLL] wasNearBottom=true, threshold=447, offset=3697, contentH=4144, boundsH=447, forceScroll=true
[11:31:52] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:31:52] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28834 → 28835
[11:31:52] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[11:31:52] [SCROLL] 💓 alive, visible=45...52, rows=53, estHeight=0.0, heightCalls=115
[11:31:52] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=true, nearBottom=true), maxY=3770, currentOffset=3770
[11:31:52] [SCROLL] Scrolling to 3770, animated=false
[11:31:52] [PUSH] Silent push received
[11:31:52] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:52 +0000, appState=0, message_id=nil, type=nil
[11:31:52] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:52 +0000
[11:31:52] [PUSH_EMBED] No embedded message_data in notification
[11:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:31:52] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:31:52] [PUSH] No embedded data, pre-loading messages from server
[11:31:52] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:31:52] [CLIENT_SIG] Event received: type=3 messageId=28832
[11:31:52] [WS_EVENT] Received event: type=3, messageId=28832
[11:31:52] [WS_EVENT] Read receipt for message 28832 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:52] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:31:52] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:52] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:52] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:52] [PUSH] handlePollEventsNotification userInfo: [:]
[11:31:52] [PUSH] No message_id in userInfo
[11:31:52] [PUSH] No operation_type in userInfo
[11:31:52] [FAST_REFRESH] Evolution disabled - performing incremental sync
[11:31:52] [PUSH_TRACE] 📬 POLL: cache state: valid=false, count=0, IDs=[]
[11:31:52] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:52] [FAST_REFRESH] Already have 51 messages in memory
[11:31:52] [FAST_REFRESH] maxMemoryId=28835, maxLocalId=28835
[11:31:52] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[11:31:52] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:31:52] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[11:31:52] [READBY_OPT] No message IDs to fetch - skipping server call
[11:31:52] [GAP_FIX] Incremental sync will use since_id=28835 (background max=0, current DB max=28835)
[11:31:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:31:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28835
[11:31:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[11:31:52] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[11:31:52] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:31:52] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:31:53] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:31:53 +0000 - type: unknown, operation_type: 0, message_id: 28835, session_id: ILUIWU, state: 0
[11:31:53] [PUSH_DEBUG] Full userInfo: [AnyHashable("message_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:31:52, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:31:52";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "As you are not coming back to app, seems it works !";
    "message_id" = 28835;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28834;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("message_id"): 28835, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): As you are not coming back to app, seems it works !, AnyHashable("sender_name"): Laurent]
[11:31:53] [PUSH] App active - suppressing notification UI, posting internal event
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:53 +0000
[11:31:53] [PUSH_TRACE] ⬇️ Processing embedded message_id=28835
[11:31:53] [PUSH_EMBED] 📩 Received embedded message: id=28835, type=0, sender=Laurent
[11:31:53] [PUSH_TRACE] ⬇️ Message details: text="As you are not coming back to app, seems it works ...", datesent=2026-04-23 08:31:52
[11:31:53] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:31:53] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28835
[11:31:53] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28835
[11:31:53] [PUSH_EMBED] ✅ Saved message 28835 to local DB (sync)
[11:31:53] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28835
[11:31:53] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28835
[11:31:53] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28835
[11:31:53] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[11:31:53] [PUSH_EMBED] Created new cache with embedded message 28835
[11:31:53] [PUSH_TRACE] 📦 ✅ Created new cache with message 28835
[11:31:53] [PUSH_TRACE] 📦 EXITING cache update queue for message 28835
[11:31:53] [PUSH_EMBED] Fetching evolution data for message 28835 in background
[11:31:53] [PUSH_EMBED] ✅ Fully processed message 28835
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28835
[11:31:53] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:53] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:53] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:31:52, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:31:52";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "As you are not coming back to app, seems it works !";
    "message_id" = 28835;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28834;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("message_id"): 28835, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): As you are not coming back to app, seems it works !, AnyHashable("sender_name"): Laurent]
[11:31:53] [PUSH_EMBED_VC] Message 28835 already in memory - skipping
[11:31:53] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:31:53] [PUSH] Parsed message_id: 28835
[11:31:53] [PUSH] Parsed operation_type: 0
[11:31:53] [PUSH] Taking direct action: opType=0, messageId=28835
[11:31:53] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28835
[11:31:53] [PUSH] ⚡ Message 28835 already in memory - skipping duplicate notification entirely
[11:31:53] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:31:53] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:31:53] [PUSH_TRACE] 👁️ Received message id=28835, text="As you are not coming back to ..."
[11:31:53] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:31:53] [PUSH_UI] Message 28835 already in memory - skipping insert
[11:31:53] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:31:53] [PUSH] Silent push received
[11:31:53] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:53 +0000, appState=0, message_id=28835, type=nil
[11:31:53] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=1, IDs=[28835]
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:53 +0000
[11:31:53] [PUSH_TRACE] ⬇️ Processing embedded message_id=28835
[11:31:53] [PUSH_EMBED] 📩 Received embedded message: id=28835, type=0, sender=Laurent
[11:31:53] [PUSH_TRACE] ⬇️ Message details: text="As you are not coming back to app, seems it works ...", datesent=2026-04-23 08:31:52
[11:31:53] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:31:53] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28835
[11:31:53] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28835
[11:31:53] [PUSH_EMBED] ✅ Saved message 28835 to local DB (sync)
[11:31:53] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28835
[11:31:53] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28835
[11:31:53] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28835
[11:31:53] [PUSH_TRACE] 📦 Cache state: valid=true, count=1, IDs=[28835]
[11:31:53] [PUSH_TRACE] 📦 ⚠️ Message 28835 already in cache, skipping insert
[11:31:53] [PUSH_TRACE] 📦 EXITING cache update queue for message 28835
[11:31:53] [PUSH_EMBED] Fetching evolution data for message 28835 in background
[11:31:53] [PUSH_EMBED] ✅ Fully processed message 28835
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28835
[11:31:53] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28835], handled=true
[11:31:53] [PUSH] Embedded message handled instantly from silent push
[11:31:53] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:31:53] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28835
[11:31:53] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:31:53] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:31:53] [PUSH_TRACE] 👁️ Received message id=28835, text="As you are not coming back to ..."
[11:31:53] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:31:53] [PUSH_UI] Message 28835 already in memory - skipping insert
[11:31:53] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:31:53] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:53] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:53] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:31:52";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "As you are not coming back to app, seems it works !";
    "message_id" = 28835;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28834;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-23 08:31:52, AnyHashable("message_id"): 28835, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): As you are not coming back to app, seems it works !, AnyHashable("sender_name"): Laurent]
[11:31:53] [PUSH_EMBED_VC] Message 28835 already in memory - skipping
[11:31:53] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:31:53] [PUSH] Parsed message_id: 28835
[11:31:53] [PUSH] Parsed operation_type: 0
[11:31:53] [PUSH] Taking direct action: opType=0, messageId=28835
[11:31:53] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28835
[11:31:53] [PUSH] ⚡ Message 28835 already in memory - skipping duplicate notification entirely
[11:31:53] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:31:53] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=1, IDs=[28835]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:31:53] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:31:53] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:53] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:53] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28832, AnyHashable("aps"): {
    "content-available" = 1;
}]
[11:31:53] [PUSH] Parsed message_id: 28832
[11:31:53] [PUSH] Parsed operation_type: 3
[11:31:53] [PUSH] Taking direct action: opType=3, messageId=28832
[11:31:53] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28832
[11:31:53] [INCREMENTAL_SYNC] ✅ No new messages
[11:31:53] [FAST_REFRESH] Incremental sync complete - 51 messages
[11:31:53] [PUSH_EMBED] Got evolution data for message 28835, saving to local DB
[11:31:53] [PUSH_EMBED] Saved evolution data for message 28835
[11:31:53] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:31:53] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28835, 28834, 28833, 28832, 28831]
[11:31:53] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:31:53] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:31:53] [SCROLL] wasNearBottom=true, threshold=447, offset=3770, contentH=4217, boundsH=447, forceScroll=true
[11:31:53] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:31:53] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[11:31:53] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3770, currentOffset=3770
[11:31:53] [SCROLL] Scrolling to 3770, animated=false
[11:31:53] [PUSH] Silent push received
[11:31:53] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:53 +0000, appState=0, message_id=nil, type=nil
[11:31:53] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:53 +0000
[11:31:53] [PUSH_EMBED] No embedded message_data in notification
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:31:53] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826], handled=false
[11:31:53] [PUSH] No embedded data, pre-loading messages from server
[11:31:53] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:31:53] [PUSH_EMBED] Got evolution data for message 28835, saving to local DB
[11:31:53] [PUSH_EMBED] Saved evolution data for message 28835
[11:31:53] [CLIENT_SIG] Event received: type=3 messageId=28833
[11:31:53] [WS_EVENT] Received event: type=3, messageId=28833
[11:31:53] [WS_EVENT] Read receipt for message 28833 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:53] [CLIENT_SIG] Event received: type=3 messageId=28834
[11:31:53] [WS_EVENT] Received event: type=3, messageId=28834
[11:31:53] [WS_EVENT] Read receipt for message 28834 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:53] [PUSH] Silent push received
[11:31:53] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:53 +0000, appState=0, message_id=nil, type=nil
[11:31:53] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:53 +0000
[11:31:53] [PUSH_EMBED] No embedded message_data in notification
[11:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:31:53] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826], handled=false
[11:31:53] [PUSH] No embedded data, pre-loading messages from server
[11:31:53] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:31:53] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:31:53] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:31:53] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:31:53] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:53] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:53] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28833, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[11:31:53] [PUSH] Parsed message_id: 28833
[11:31:53] [PUSH] Parsed operation_type: 3
[11:31:53] [PUSH] Taking direct action: opType=3, messageId=28833
[11:31:53] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28833
[11:31:53] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:31:53] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:31:53] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:31:53] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:31:53] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:31:53] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:31:53] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:53] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:53] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:53] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28834, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
[11:31:53] [PUSH] Parsed message_id: 28834
[11:31:53] [PUSH] Parsed operation_type: 3
[11:31:53] [PUSH] Taking direct action: opType=3, messageId=28834
[11:31:53] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28834
[11:31:54] [PUSH] Silent push received
[11:31:54] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:54 +0000, appState=0, message_id=nil, type=nil
[11:31:54] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:54] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:54 +0000
[11:31:54] [PUSH_EMBED] No embedded message_data in notification
[11:31:54] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:31:54] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826], handled=false
[11:31:54] [PUSH] No embedded data, pre-loading messages from server
[11:31:54] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:31:54] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:31:54] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:31:54] [CLIENT_SIG] Event received: type=3 messageId=28835
[11:31:54] [WS_EVENT] Received event: type=3, messageId=28835
[11:31:54] [WS_EVENT] Read receipt for message 28835 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:31:54] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:31:54] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:31:54] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:31:54] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:31:54] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:31:54] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:31:54] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:54] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:54] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:31:54] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:54] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:31:54] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:31:54] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:31:54] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:31:54] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28835
[11:31:54] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28835, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[11:31:54] [PUSH] Parsed message_id: 28835
[11:31:54] [PUSH] Parsed operation_type: 3
[11:31:54] [PUSH] Taking direct action: opType=3, messageId=28835
[11:31:54] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28835
[11:31:56] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=61
[11:31:56] [SCROLL_END_DECEL] messagesTable offsetY=3824, insetTop=0, pendingVelocityY=0.0
[11:31:57] [SERVER] Polling - attempting to reconnect...
[11:31:57] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:31:57] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:31:58] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=0
[11:32:01] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[11:32:01] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[11:32:01] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=52
[11:32:01] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[11:32:01] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-1, 28835, 28834, 28833, 28832]
[11:32:01] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[11:32:01] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:01] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[11:32:01] [SCROLL] wasNearBottom=true, threshold=447, offset=3770, contentH=4217, boundsH=447, forceScroll=false
[11:32:01] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[11:32:01] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[11:32:01] [SCROLL] 💓 alive, visible=46...53, rows=54, estHeight=0.0, heightCalls=117
[11:32:01] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[11:32:01] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[11:32:01] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3847, currentOffset=3847
[11:32:01] [SCROLL] Scrolling to 3847, animated=true
[11:32:02] [SERVER] Polling - attempting to reconnect...
[11:32:02] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:02] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:02] [CLIENT_SIG] Event received: type=0 messageId=28836
[11:32:02] [WS_EVENT] Received event: type=0, messageId=28836
[11:32:02] [WS_EVENT] 📨 New message notification (msgId=28836) - triggering incremental refresh, currentMsgCount=52
[11:32:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[11:32:02] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28835
[11:32:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[11:32:02] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28836,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:32:02"}
[11:32:02] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "message_id": 28836, "datesent_utc": 2026-04-23 08:32:02, "file_name": , "ok": 1, "message_type": 0]
[11:32:02] [DB_UPGRADE] Upgrading message ID: -1 → 28836, preserveOriginalDate=false
[11:32:02] [DB_UPGRADE] ✅ Upgraded -1 → 28836 with send_status=0, 1 row(s) affected
[11:32:02] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28836
[11:32:02] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28836
[11:32:02] ReloadData 9
[11:32:02] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:32:02] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28836]
[11:32:02] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:02] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:02] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:32:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[11:32:02] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[11:32:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[11:32:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28836, 28835, 28834, 28833, 28832]
[11:32:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[11:32:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:02] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[11:32:02] [SCROLL] wasNearBottom=true, threshold=447, offset=3847, contentH=4294, boundsH=447, forceScroll=true
[11:32:02] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[11:32:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[11:32:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3847, currentOffset=3847
[11:32:02] [SCROLL] Scrolling to 3847, animated=false
[11:32:03] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:32:05] [PUSH] Silent push received
[11:32:05] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:05 +0000, appState=0, message_id=nil, type=nil
[11:32:05] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:32:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:05 +0000
[11:32:05] [PUSH_EMBED] No embedded message_data in notification
[11:32:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:32:05] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826], handled=false
[11:32:05] [PUSH] No embedded data, pre-loading messages from server
[11:32:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:05] [CLIENT_SIG] Event received: type=3 messageId=28836
[11:32:05] [WS_EVENT] Received event: type=3, messageId=28836
[11:32:05] [WS_EVENT] Read receipt for message 28836 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:32:05] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:32:05] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:32:05] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:32:05] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:32:05] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:32:05] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:32:05] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:05] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[11:32:05] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28745]
[11:32:05] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28745]
[11:32:05] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:05] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[11:32:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:32:05] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:05] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:32:05] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28836
[11:32:05] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28836]
[11:32:05] [PUSH] Parsed message_id: 28836
[11:32:05] [PUSH] Parsed operation_type: 3
[11:32:05] [PUSH] Taking direct action: opType=3, messageId=28836
[11:32:05] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28836
[11:32:07] [SERVER] Polling - attempting to reconnect...
[11:32:07] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:07] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:07] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:32:07] [CLIENT_SIG] Client disconnected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:32:10] [CLIENT_SIG] Event received: type=0 messageId=28837
[11:32:10] [WS_EVENT] Received event: type=0, messageId=28837
[11:32:10] [WS_EVENT] 📨 New message notification (msgId=28837) - triggering incremental refresh, currentMsgCount=52
[11:32:10] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[11:32:10] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28836, maxMemoryId=28836
[11:32:10] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28836
[11:32:10] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:32:10] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28837]
[11:32:10] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:10] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28837
[11:32:10] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 53, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:10] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:32:10] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[11:32:10] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[11:32:11] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[11:32:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28837, 28836, 28835, 28834, 28833]
[11:32:11] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[11:32:11] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[11:32:11] [SCROLL] wasNearBottom=true, threshold=447, offset=3847, contentH=4294, boundsH=447, forceScroll=false
[11:32:11] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[11:32:11] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28836 → 28837
[11:32:11] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[11:32:11] [SCROLL] 💓 alive, visible=47...54, rows=55, estHeight=0.0, heightCalls=119
[11:32:11] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3924, currentOffset=3924
[11:32:11] [SCROLL] Scrolling to 3924, animated=true
[11:32:11] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:32:11] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:32:11] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28837
[11:32:11] [PUSH] handlePollEventsNotification userInfo: [:]
[11:32:11] [PUSH] No message_id in userInfo
[11:32:11] [PUSH] No operation_type in userInfo
[11:32:11] [FAST_REFRESH] Evolution disabled - performing incremental sync
[11:32:11] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=51, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:11] [PUSH_TRACE] 📬 POLL: memory state: count=53, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [FAST_REFRESH] Already have 53 messages in memory
[11:32:11] [FAST_REFRESH] maxMemoryId=28837, maxLocalId=28837
[11:32:11] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[11:32:11] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[11:32:11] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[11:32:11] [READBY_OPT] No message IDs to fetch - skipping server call
[11:32:11] [GAP_FIX] Incremental sync will use since_id=28837 (background max=0, current DB max=28837)
[11:32:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[11:32:11] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28837, maxMemoryId=28837
[11:32:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28837
[11:32:11] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[11:32:11] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[11:32:11] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:32:11] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:32:11 +0000 - type: unknown, operation_type: 0, message_id: 28837, session_id: ILUIWU, state: 0
[11:32:11] [PUSH_DEBUG] Full userInfo: [AnyHashable("message_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:32:10, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:10";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Noooo;
    "message_id" = 28837;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28836;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("message_id"): 28837, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): Noooo, AnyHashable("sender_name"): Laurent]
[11:32:11] [PUSH] App active - suppressing notification UI, posting internal event
[11:32:11] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:11 +0000
[11:32:11] [PUSH_TRACE] ⬇️ Processing embedded message_id=28837
[11:32:11] [PUSH_EMBED] 📩 Received embedded message: id=28837, type=0, sender=Laurent
[11:32:11] [PUSH_TRACE] ⬇️ Message details: text="Noooo...", datesent=2026-04-23 08:32:10
[11:32:11] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:32:11] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28837
[11:32:11] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28837
[11:32:11] [PUSH_EMBED] ✅ Saved message 28837 to local DB (sync)
[11:32:11] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28837
[11:32:11] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28837
[11:32:11] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28837
[11:32:11] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[11:32:11] [PUSH_EMBED] Inserted message 28837 into existing cache (now 52 messages)
[11:32:11] [PUSH_TRACE] 📦 ✅ Inserted message 28837, cache now has IDs: [28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [PUSH_TRACE] 📦 EXITING cache update queue for message 28837
[11:32:11] [PUSH_EMBED] Fetching evolution data for message 28837 in background
[11:32:11] [PUSH_EMBED] ✅ Fully processed message 28837
[11:32:11] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28837
[11:32:11] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:32:11] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28837
[11:32:11] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:32:10, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:10";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Noooo;
    "message_id" = 28837;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28836;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("message_id"): 28837, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): Noooo, AnyHashable("sender_name"): Laurent]
[11:32:11] [PUSH_EMBED_VC] Message 28837 already in memory - skipping
[11:32:11] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:32:11] [PUSH] Parsed message_id: 28837
[11:32:11] [PUSH] Parsed operation_type: 0
[11:32:11] [PUSH] Taking direct action: opType=0, messageId=28837
[11:32:11] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28837
[11:32:11] [PUSH] ⚡ Message 28837 already in memory - skipping duplicate notification entirely
[11:32:11] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:32:11] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:32:11] [PUSH_TRACE] 👁️ Received message id=28837, text="Noooo..."
[11:32:11] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:32:11] [PUSH_UI] Message 28837 already in memory - skipping insert
[11:32:11] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:32:11] [PUSH] Silent push received
[11:32:11] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:11 +0000, appState=0, message_id=28837, type=nil
[11:32:11] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:11 +0000
[11:32:11] [PUSH_TRACE] ⬇️ Processing embedded message_id=28837
[11:32:11] [PUSH_EMBED] 📩 Received embedded message: id=28837, type=0, sender=Laurent
[11:32:11] [PUSH_TRACE] ⬇️ Message details: text="Noooo...", datesent=2026-04-23 08:32:10
[11:32:11] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:32:11] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28837
[11:32:11] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28837
[11:32:11] [PUSH_EMBED] ✅ Saved message 28837 to local DB (sync)
[11:32:11] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28837
[11:32:11] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28837
[11:32:11] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28837
[11:32:11] [PUSH_TRACE] 📦 Cache state: valid=true, count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [PUSH_TRACE] 📦 ⚠️ Message 28837 already in cache, skipping insert
[11:32:11] [PUSH_TRACE] 📦 EXITING cache update queue for message 28837
[11:32:11] [PUSH_EMBED] Fetching evolution data for message 28837 in background
[11:32:11] [PUSH_EMBED] ✅ Fully processed message 28837
[11:32:11] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28837
[11:32:11] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828], handled=true
[11:32:11] [PUSH] Embedded message handled instantly from silent push
[11:32:11] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:32:11] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28837
[11:32:11] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:32:11] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:32:11] [PUSH_TRACE] 👁️ Received message id=28837, text="Noooo..."
[11:32:11] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:32:11] [PUSH_UI] Message 28837 already in memory - skipping insert
[11:32:11] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:32:11] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:32:11] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28837
[11:32:11] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:10";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Noooo;
    "message_id" = 28837;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28836;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-23 08:32:10, AnyHashable("message_id"): 28837, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): Noooo, AnyHashable("sender_name"): Laurent]
[11:32:11] [PUSH_EMBED_VC] Message 28837 already in memory - skipping
[11:32:11] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:32:11] [PUSH] Parsed message_id: 28837
[11:32:11] [PUSH] Parsed operation_type: 0
[11:32:11] [PUSH] Taking direct action: opType=0, messageId=28837
[11:32:11] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28837
[11:32:11] [PUSH] ⚡ Message 28837 already in memory - skipping duplicate notification entirely
[11:32:11] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:32:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28837, 28836, 28835, 28834, 28833]
[11:32:11] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[11:32:11] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:11] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[11:32:11] [SCROLL] wasNearBottom=true, threshold=447, offset=3924, contentH=4371, boundsH=447, forceScroll=false
[11:32:11] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[11:32:11] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[11:32:11] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3924, currentOffset=3924
[11:32:11] [SCROLL] Scrolling to 3924, animated=true
[11:32:11] [PUSH_EMBED] Got evolution data for message 28837, saving to local DB
[11:32:11] [PUSH_EMBED] Saved evolution data for message 28837
[11:32:11] [INCREMENTAL_SYNC] ✅ No new messages
[11:32:11] [FAST_REFRESH] Incremental sync complete - 53 messages
[11:32:11] [PUSH_EMBED] Got evolution data for message 28837, saving to local DB
[11:32:11] [PUSH_EMBED] Saved evolution data for message 28837
[11:32:11] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[11:32:12] [CLIENT_SIG] Client connected: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF) on session 'ILUIWU' (my session: 'ILUIWU')
[11:32:12] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=137ms
[11:32:12] [SERVER] Polling - attempting to reconnect...
[11:32:12] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:12] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:12] [PUSH] Silent push received
[11:32:12] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:12 +0000, appState=0, message_id=nil, type=nil
[11:32:12] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:12 +0000
[11:32:12] [PUSH_EMBED] No embedded message_data in notification
[11:32:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:32:12] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828], handled=false
[11:32:12] [PUSH] No embedded data, pre-loading messages from server
[11:32:12] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:12] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:32:12] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:32:12] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:32:12] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:32:12] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:32:12] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:32:12] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:12] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:12] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28746, 28745]
[11:32:12] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28746, 28745]
[11:32:12] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:12] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[11:32:12] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:32:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=0 vccs=0
[11:32:12] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28837
[11:32:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28837, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[11:32:12] [PUSH] Parsed message_id: 28837
[11:32:12] [PUSH] Parsed operation_type: 3
[11:32:12] [PUSH] Taking direct action: opType=3, messageId=28837
[11:32:12] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28837
[11:32:13] [CLIENT_SIG] Event received: type=3 messageId=28837
[11:32:13] [WS_EVENT] Received event: type=3, messageId=28837
[11:32:13] [WS_EVENT] Read receipt for message 28837 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:32:17] [SERVER] Polling - attempting to reconnect...
[11:32:17] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:17] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:21] [CLIENT_SIG] Typing stop from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:32:21] [CLIENT_SIG] Event received: type=0 messageId=28838
[11:32:21] [WS_EVENT] Received event: type=0, messageId=28838
[11:32:21] [WS_EVENT] 📨 New message notification (msgId=28838) - triggering incremental refresh, currentMsgCount=53
[11:32:21] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[11:32:21] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28837, maxMemoryId=28837
[11:32:21] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28837
[11:32:21] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:32:21] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28838]
[11:32:21] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:21] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28838
[11:32:21] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 54, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:21] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:32:21] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[11:32:21] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=54
[11:32:22] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=119
[11:32:22] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28838, 28837, 28836, 28835, 28834]
[11:32:22] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[11:32:22] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[11:32:22] [SCROLL] wasNearBottom=true, threshold=447, offset=3924, contentH=4371, boundsH=447, forceScroll=false
[11:32:22] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[11:32:22] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28837 → 28838
[11:32:22] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[11:32:22] [SCROLL] 💓 alive, visible=48...55, rows=56, estHeight=0.0, heightCalls=121
[11:32:22] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3997, currentOffset=3997
[11:32:22] [SCROLL] Scrolling to 3997, animated=true
[11:32:22] [SERVER] Polling - attempting to reconnect...
[11:32:22] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:22] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:22] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:32:22] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=10 vccs=0
[11:32:22] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28838
[11:32:22] [PUSH] handlePollEventsNotification userInfo: [:]
[11:32:22] [PUSH] No message_id in userInfo
[11:32:22] [PUSH] No operation_type in userInfo
[11:32:22] [FAST_REFRESH] Evolution disabled - performing incremental sync
[11:32:22] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:22] [PUSH_TRACE] 📬 POLL: memory state: count=54, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [FAST_REFRESH] Already have 54 messages in memory
[11:32:22] [FAST_REFRESH] maxMemoryId=28838, maxLocalId=28838
[11:32:22] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[11:32:22] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[11:32:22] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[11:32:22] [READBY_OPT] No message IDs to fetch - skipping server call
[11:32:22] [GAP_FIX] Incremental sync will use since_id=28838 (background max=0, current DB max=28838)
[11:32:22] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[11:32:22] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28838, maxMemoryId=28838
[11:32:22] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28838
[11:32:22] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[11:32:22] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[11:32:22] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:32:22] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:32:22 +0000 - type: unknown, operation_type: 0, message_id: 28838, session_id: ILUIWU, state: 0
[11:32:22] [PUSH_DEBUG] Full userInfo: [AnyHashable("message"): Activate and disable notification please in app, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("sender_name"): Laurent, AnyHashable("datesent"): 2026-04-23 08:32:21, AnyHashable("file_name"): , AnyHashable("timer"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Activate and disable notification please in app";
    "message_id" = 28838;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28837;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28838]
[11:32:22] [PUSH] App active - suppressing notification UI, posting internal event
[11:32:22] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:22 +0000
[11:32:22] [PUSH_TRACE] ⬇️ Processing embedded message_id=28838
[11:32:22] [PUSH_EMBED] 📩 Received embedded message: id=28838, type=0, sender=Laurent
[11:32:22] [PUSH_TRACE] ⬇️ Message details: text="Activate and disable notification please in app...", datesent=2026-04-23 08:32:21
[11:32:22] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:32:22] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28838
[11:32:22] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28838
[11:32:22] [PUSH_EMBED] ✅ Saved message 28838 to local DB (sync)
[11:32:22] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28838
[11:32:22] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28838
[11:32:22] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28838
[11:32:22] [PUSH_TRACE] 📦 Cache state: valid=true, count=52, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[11:32:22] [PUSH_EMBED] Inserted message 28838 into existing cache (now 53 messages)
[11:32:22] [PUSH_TRACE] 📦 ✅ Inserted message 28838, cache now has IDs: [28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [PUSH_TRACE] 📦 EXITING cache update queue for message 28838
[11:32:22] [PUSH_EMBED] Fetching evolution data for message 28838 in background
[11:32:22] [PUSH_EMBED] ✅ Fully processed message 28838
[11:32:22] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28838
[11:32:22] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=10 vccs=0
[11:32:22] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28838
[11:32:22] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message"): Activate and disable notification please in app, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("sender_name"): Laurent, AnyHashable("datesent"): 2026-04-23 08:32:21, AnyHashable("file_name"): , AnyHashable("timer"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Activate and disable notification please in app";
    "message_id" = 28838;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28837;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28838]
[11:32:22] [PUSH_EMBED_VC] Message 28838 already in memory - skipping
[11:32:22] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:32:22] [PUSH] Parsed message_id: 28838
[11:32:22] [PUSH] Parsed operation_type: 0
[11:32:22] [PUSH] Taking direct action: opType=0, messageId=28838
[11:32:22] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28838
[11:32:22] [PUSH] ⚡ Message 28838 already in memory - skipping duplicate notification entirely
[11:32:22] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:32:22] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:32:22] [PUSH_TRACE] 👁️ Received message id=28838, text="Activate and disable notificat..."
[11:32:22] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:32:22] [PUSH_UI] Message 28838 already in memory - skipping insert
[11:32:22] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:32:22] [PUSH] Silent push received
[11:32:22] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:22 +0000, appState=0, message_id=28838, type=nil
[11:32:22] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:22 +0000
[11:32:22] [PUSH_TRACE] ⬇️ Processing embedded message_id=28838
[11:32:22] [PUSH_EMBED] 📩 Received embedded message: id=28838, type=0, sender=Laurent
[11:32:22] [PUSH_TRACE] ⬇️ Message details: text="Activate and disable notification please in app...", datesent=2026-04-23 08:32:21
[11:32:22] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:32:22] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28838
[11:32:22] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28838
[11:32:22] [PUSH_EMBED] ✅ Saved message 28838 to local DB (sync)
[11:32:22] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28838
[11:32:22] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28838
[11:32:22] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28838
[11:32:22] [PUSH_TRACE] 📦 Cache state: valid=true, count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [PUSH_TRACE] 📦 ⚠️ Message 28838 already in cache, skipping insert
[11:32:22] [PUSH_TRACE] 📦 EXITING cache update queue for message 28838
[11:32:22] [PUSH_EMBED] Fetching evolution data for message 28838 in background
[11:32:22] [PUSH_EMBED] ✅ Fully processed message 28838
[11:32:22] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28838
[11:32:22] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829], handled=true
[11:32:22] [PUSH] Embedded message handled instantly from silent push
[11:32:22] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:32:22] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28838
[11:32:22] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[11:32:22] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[11:32:22] [PUSH_TRACE] 👁️ Received message id=28838, text="Activate and disable notificat..."
[11:32:22] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=EDAD55A1-003F-415D-AA60-672B34B504FE, type=0
[11:32:22] [PUSH_UI] Message 28838 already in memory - skipping insert
[11:32:22] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[11:32:22] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=10 vccs=0
[11:32:22] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28838
[11:32:22] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message"): Activate and disable notification please in app, AnyHashable("sender_id"): 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("sender_name"): Laurent, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:32:21, AnyHashable("timer"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Activate and disable notification please in app";
    "message_id" = 28838;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28837;
    "sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
    "sender_name" = Laurent;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28838]
[11:32:22] [PUSH_EMBED_VC] Message 28838 already in memory - skipping
[11:32:22] [PUSH] ⚡ Embedded message handled directly in ViewController
[11:32:22] [PUSH] Parsed message_id: 28838
[11:32:22] [PUSH] Parsed operation_type: 0
[11:32:22] [PUSH] Taking direct action: opType=0, messageId=28838
[11:32:22] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28838
[11:32:22] [PUSH] ⚡ Message 28838 already in memory - skipping duplicate notification entirely
[11:32:22] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:32:22] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28838, 28837, 28836, 28835, 28834]
[11:32:22] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[11:32:22] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:22] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[11:32:22] [SCROLL] wasNearBottom=true, threshold=447, offset=3997, contentH=4444, boundsH=447, forceScroll=true
[11:32:22] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[11:32:22] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[11:32:22] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3997, currentOffset=3997
[11:32:22] [SCROLL] Scrolling to 3997, animated=false
[11:32:23] [PUSH_EMBED] Got evolution data for message 28838, saving to local DB
[11:32:23] [PUSH_EMBED] Saved evolution data for message 28838
[11:32:23] [INCREMENTAL_SYNC] ✅ No new messages
[11:32:23] [FAST_REFRESH] Incremental sync complete - 54 messages
[11:32:23] [PUSH_EMBED] Got evolution data for message 28838, saving to local DB
[11:32:23] [PUSH_EMBED] Saved evolution data for message 28838
[11:32:24] [PUSH] Silent push received
[11:32:24] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:24 +0000, appState=0, message_id=nil, type=nil
[11:32:24] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:24] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:24 +0000
[11:32:24] [PUSH_EMBED] No embedded message_data in notification
[11:32:24] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:32:24] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829], handled=false
[11:32:24] [PUSH] No embedded data, pre-loading messages from server
[11:32:24] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:24] [CLIENT_SIG] Event received: type=3 messageId=28838
[11:32:24] [WS_EVENT] Received event: type=3, messageId=28838
[11:32:24] [WS_EVENT] Read receipt for message 28838 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:32:24] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:32:24] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:32:24] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:32:24] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:32:24] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:32:24] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:32:24] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:24] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:24] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28747, 28746, 28745]
[11:32:24] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28747, 28746, 28745]
[11:32:24] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:24] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 3 from push)
[11:32:24] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:32:24] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:24] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=12 vccs=0
[11:32:24] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28838
[11:32:24] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28838, AnyHashable("operation_type"): 3]
[11:32:24] [PUSH] Parsed message_id: 28838
[11:32:24] [PUSH] Parsed operation_type: 3
[11:32:24] [PUSH] Taking direct action: opType=3, messageId=28838
[11:32:24] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28838
[11:32:27] [SERVER] Polling - attempting to reconnect...
[11:32:27] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:27] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:31] [CAM_CONN] 💓 PING #2 sent — conn=iosILUIWU query=true secsSinceLastPong=19
[11:32:32] [SERVER] Polling - attempting to reconnect...
[11:32:32] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:32] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:34] [CLIENT_SIG] Typing start from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:32:36] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[11:32:36] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=54, isReloading=false
[11:32:36] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=55
[11:32:36] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[11:32:36] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[-2, 28838, 28837, 28836, 28835]
[11:32:36] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 55 messages
[11:32:36] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-2, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[11:32:36] [RELOAD_TAB] 📊 Building chatRows from 55 messages
[11:32:36] [SCROLL] wasNearBottom=true, threshold=447, offset=3997, contentH=4444, boundsH=447, forceScroll=false
[11:32:36] [RELOAD_TAB] 📊 Built 57 chatRows, estHeight=0.0
[11:32:36] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[11:32:36] [SCROLL] 💓 alive, visible=49...56, rows=57, estHeight=0.0, heightCalls=123
[11:32:36] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[11:32:36] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[11:32:36] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4074, currentOffset=4074
[11:32:36] [SCROLL] Scrolling to 4074, animated=true
[11:32:36] [CLIENT_SIG] Event received: type=0 messageId=28839
[11:32:36] [WS_EVENT] Received event: type=0, messageId=28839
[11:32:36] [WS_EVENT] 📨 New message notification (msgId=28839) - triggering incremental refresh, currentMsgCount=55
[11:32:36] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=55
[11:32:36] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28838, maxMemoryId=28838
[11:32:36] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28838
[11:32:36] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28839,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:32:36"}
[11:32:36] [CHAT] receive_message.php JSON: ["message_id": 28839, "session_id": ILUIWU, "message_type": 0, "ok": 1, "file_name": , "datesent_utc": 2026-04-23 08:32:36]
[11:32:36] [DB_UPGRADE] Upgrading message ID: -2 → 28839, preserveOriginalDate=false
[11:32:36] [DB_UPGRADE] ✅ Upgraded -2 → 28839 with send_status=0, 1 row(s) affected
[11:32:36] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 28839
[11:32:36] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 28839
[11:32:36] ReloadData 9
[11:32:37] [SERVER] Polling - attempting to reconnect...
[11:32:37] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:37] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:37] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:32:37] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28839]
[11:32:37] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 55 msgs, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[11:32:37] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 55, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[11:32:37] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:32:37] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=55
[11:32:37] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=55
[11:32:37] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=64
[11:32:37] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[28839, 28838, 28837, 28836, 28835]
[11:32:37] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 55 messages
[11:32:37] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[11:32:37] [RELOAD_TAB] 📊 Building chatRows from 55 messages
[11:32:37] [SCROLL] wasNearBottom=true, threshold=447, offset=4074, contentH=4521, boundsH=447, forceScroll=true
[11:32:37] [RELOAD_TAB] 📊 Built 57 chatRows, estHeight=0.0
[11:32:37] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[11:32:37] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4074, currentOffset=4074
[11:32:37] [SCROLL] Scrolling to 4074, animated=false
[11:32:38] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x152f80000; baseClass = UITextView; frame = (44 8; 320 36
[11:32:38] [SCROLL] 💓 alive, visible=46...56, rows=57, estHeight=0.0, heightCalls=64
[11:32:38] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[11:32:38] [CLIENT_SIG] Typing stop from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:32:38] [MUTE] Status sent to server: muted=0, response code=200
[11:32:38] [MUTE] Status sent to server: muted=0, response code=200
[11:32:38] [LIFECYCLE] App resigning active - cleared crash flag
[11:32:39] [PUSH] Silent push received
[11:32:39] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:39 +0000, appState=1, message_id=nil, type=nil
[11:32:39] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[11:32:39] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:39 +0000
[11:32:39] [PUSH_EMBED] No embedded message_data in notification
[11:32:39] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:32:39] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829], handled=false
[11:32:39] [PUSH] No embedded data, pre-loading messages from server
[11:32:39] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:39] [CLIENT_SIG] Event received: type=3 messageId=28839
[11:32:39] [WS_EVENT] Received event: type=3, messageId=28839
[11:32:39] [WS_EVENT] Read receipt for message 28839 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:32:39] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[11:32:39] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[11:32:39] [SECURITY] Saved background timestamp
[11:32:39] [LIFECYCLE] App entering background - cleared crash flag
[11:32:39] [CLIENT_SIG] Disconnecting
[11:32:39] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[11:32:39] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[11:32:39] [PUSH_TRACE] 💤 BACKGROUND: memory has 55 messages, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[11:32:39] [LIFECYCLE] Background snapshot: count=55, maxId=28839
[11:32:39] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[11:32:39] [WS] Canceling WebSocket for query connection to iosILUIWU
[11:32:39] In cleanupPeer
[11:32:39] In cleanupPeer
[11:32:39] [LIFECYCLE] WebRTC audio disabled
[11:32:39] [LIFECYCLE] AVAudioSession deactivated
[11:32:39] [LIFECYCLE] All connections stopped
[11:32:39] [CLIENT_SIG] WebSocket closed with code 1001
[11:32:39] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:32:39] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:32:39] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:32:39] [SERVER] Stopped reconnect polling
[11:32:39] Will request stop of video 0
[11:32:39] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[11:32:39] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:32:39] Will request stop of video 0
[11:32:39] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:32:39] [WS] Query connection failed - cleaning up all agent connections and views
[11:32:39] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[11:32:46] [CRASH] No crash detected
[11:32:46] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[11:32:46] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[11:32:46] [GIPHY] SDK not available - using REST API fallback
[11:32:46] [BACKGROUND] Background fetch enabled
[11:32:46] [SECURITY] Initial launch - timeout exceeded (7.203667879104614s > 0.0s)
[11:32:46] [AUTH] Starting PIN authentication
[11:32:46] [PUSH] Silent push received
[11:32:46] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:46 +0000, appState=2, message_id=28840, type=nil
[11:32:46] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:32:46] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:46 +0000
[11:32:46] [PUSH_TRACE] ⬇️ Processing embedded message_id=28840
[11:32:46] [PUSH_EMBED] 📩 Received embedded message: id=28840, type=0, sender=Laurent
[11:32:46] [PUSH_TRACE] ⬇️ Message details: text="And kill and restart app also...", datesent=2026-04-23 08:32:45
[11:32:46] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:32:46] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28840
[11:32:46] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28840
[11:32:46] [CLEANUP] No old timer messages to delete
[11:32:46] [PUSH_EMBED] ✅ Saved message 28840 to local DB (sync)
[11:32:46] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28840
[11:32:46] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28840
[11:32:46] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28840
[11:32:46] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[11:32:46] [PUSH_EMBED] Created new cache with embedded message 28840
[11:32:46] [PUSH_TRACE] 📦 ✅ Created new cache with message 28840
[11:32:46] [PUSH_TRACE] 📦 EXITING cache update queue for message 28840
[11:32:46] [PUSH_EMBED] Fetching evolution data for message 28840 in background
[11:32:46] [PUSH_EMBED] ✅ Fully processed message 28840
[11:32:46] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28840
[11:32:46] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28840], handled=true
[11:32:46] [PUSH] Embedded message handled instantly from silent push
[11:32:46] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:32:46] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28840
[11:32:46] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:32:46] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:32:47] [PRELOAD] Cache already valid (1 messages), skipping pre-load
[11:32:47] [PUSH_EMBED] Got evolution data for message 28840, saving to local DB
[11:32:47] [PUSH_EMBED] Saved evolution data for message 28840
[11:32:47] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":0,"removed_from_other_channels":0}
[11:32:47] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:32:47] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":0,"removed_from_other_channels":0}
[11:32:47] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:32:47] [USER] ✅ User registered successfully
[11:32:47] [PUSH] User registration after token update: success
[11:32:47] [USER] ✅ User registered successfully
[11:32:47] [PUSH] User registration after token update: success
[11:32:48] [PUSH] Notification tapped - session_id: ILUIWU
[11:32:48] [PUSH] Max message_id before tap: 28840
[11:32:48] [PUSH] Stored pending session: ILUIWU
[11:32:48] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:48 +0000
[11:32:48] [PUSH_TRACE] ⬇️ Processing embedded message_id=28840
[11:32:48] [PUSH_EMBED] 📩 Received embedded message: id=28840, type=0, sender=Laurent
[11:32:48] [PUSH_TRACE] ⬇️ Message details: text="And kill and restart app also...", datesent=2026-04-23 08:32:45
[11:32:48] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:32:48] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28840
[11:32:48] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28840
[11:32:48] [PUSH_EMBED] ✅ Saved message 28840 to local DB (sync)
[11:32:48] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28840
[11:32:48] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28840
[11:32:48] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28840
[11:32:48] [PUSH_TRACE] 📦 Cache state: valid=true, count=1, IDs=[28840]
[11:32:48] [PUSH_TRACE] 📦 ⚠️ Message 28840 already in cache, skipping insert
[11:32:48] [PUSH_TRACE] 📦 EXITING cache update queue for message 28840
[11:32:48] [PUSH_EMBED] Fetching evolution data for message 28840 in background
[11:32:48] [PUSH_EMBED] ✅ Fully processed message 28840
[11:32:48] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28840
[11:32:48] [PUSH] Embedded message handled instantly on tap
[11:32:48] [PUSH] Fetching server messages since_id=28840 to catch coalesced notifications on tap
[11:32:48] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28840 to catch coalesced notifications
[11:32:48] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:32:48] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:48] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:32:48] [PUSH_EMBED] Got evolution data for message 28840, saving to local DB
[11:32:48] [PUSH_EMBED] Saved evolution data for message 28840
[11:32:48] [PUSH_PRELOAD] No messages or parse error
[11:32:48] [PUSH] Server fetch on tap completed (success=false)
[11:32:48] [CLIENT_SIG] WebSocket opened
[11:32:48] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:32:48] [CLIENT_SIG] Connected! clientId=e3J9UVUXIcM-gu4b
[11:32:48] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:32:48] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:32:48] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:32:49] [PIN_AUTH] Correct PIN
[11:32:49] [SECURITY] Restored real session: ILUIWU
[11:32:49] [SECURITY] Restored real session: ILUIWU
[11:32:49] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:32:49] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[11:32:49] [SECURITY] Saved real session: ILUIWU
[11:32:49] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[11:32:49] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[11:32:49] [UPLOAD_QUEUE] ✅ Database integrity check passed
[11:32:49] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[11:32:49] Documents Directory: /var/mobile/Containers/Data/Application/C54170A7-4208-45E1-972B-D75BEF83B039/Documents
[11:32:49] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[11:32:49] [CAPTURE_HOST] live-feed moved hosted view to plain container
[11:32:50] [THEME] Applying current theme
[11:32:50] [CHAT] Applied day theme (mode: day)
[11:32:50] [SECURITY] Saved real session: ILUIWU
[11:32:50] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[11:32:50] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:32:50] [NETWORK] Network monitor started
[11:32:50] [NETWORK] Status changed: connected
[11:32:50] Did transition
[11:32:50] [CHUNK] Pre-cache has only 1 messages - supplementing from local DB
[11:32:50] [CHUNK] After merge: 50 messages (added 49 from local DB)
[11:32:50] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[11:32:50] [VIEWER] Screen lock enabled - normal idle behavior
[11:32:50] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[11:32:50] [VCC] ========== VideoConnectionClass INIT ==========
[11:32:50] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[11:32:50] [DATA AUDIO] ========== setupWebRTC() START ==========
[11:32:50] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[11:32:50] [DATA AUDIO] Creating encoder/decoder factories...
[11:32:50] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[11:32:50] [CODEC] Viewer selected encoder: AV1 (best quality)
[11:32:50] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[11:32:50] [DATA AUDIO] ✅ Factory created
[11:32:50] [DATA AUDIO] RTCAudioSession locked
[11:32:50] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[11:32:50] [DATA AUDIO] RTCAudioSession unlocked
[11:32:50] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[11:32:50] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[11:32:50] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[11:32:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:32:50] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[11:32:50] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[11:32:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:32:50] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[11:32:50] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[11:32:50] Did transition
[11:32:50] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[11:32:50] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:32:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:32:50] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:32:50] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[11:32:50] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[11:32:50] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[11:32:50] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[11:32:50] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[11:32:50] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[11:32:50] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[11:32:50] [USER] ✅ User registered successfully
[11:32:50] [USER] User registration successful
[11:32:50] [GALLERY_DB] ✅ Loaded 1256 media messages
[11:32:50] [MIGRATION] No messages need sender_name backfill
[11:32:50] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:32:50] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28840, maxMemoryId=28840
[11:32:50] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28840
[11:32:50] [INCREMENTAL_SYNC] ✅ No new messages
[11:32:50] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[11:32:50] [GALLERY] First 5 after sort (newest first):
[11:32:50] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[11:32:50] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[11:32:50] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[11:32:50] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[11:32:50] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[11:32:50] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[11:32:50] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[11:32:50] [SERVER] Starting reconnect polling (5s interval)
[11:32:50] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[11:32:50] [ICONS] Offset applied: -14.6
[11:32:50] [ICONS] New left margin: 11.2, New right margin: 11.3
[11:32:50] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[11:32:50] [READBY_ENRICH] Enriched 3/3 unsettled messages with readBy data
[11:32:50] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:32:50] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:32:50] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:32:50] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[11:32:50] [ICONS] Chat center: (31.2, 87.0)
[11:32:50] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[11:32:50] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[11:32:50] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[11:32:50] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[11:32:50] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[11:32:50] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[11:32:50] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[11:32:50] [ICONS] Screen width: 440.0
[11:32:50] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:32:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28840, 28839, 28838, 28837, 28836]
[11:32:50] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:32:50] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[11:32:50] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:32:50] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[11:32:50] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:32:50] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[11:32:50] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[11:32:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:32:50] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[11:32:50] [UNSENT_RETRY] Checking for unsent messages...
[11:32:50] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[11:32:50] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[11:32:50] [UPLOAD_RECOVERY] Session: ILUIWU
[11:32:50] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[11:32:50] [UPLOAD_RECOVERY] Checking recent media messages on server...
[11:32:50] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[11:32:50] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[11:32:50] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[11:32:50] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[11:32:50] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[11:32:50] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[11:32:50] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[11:32:50] [PENDING_UPLOAD] Total pending upload messages: 0
[11:32:50] [UNSENT_RETRY] No unsent messages found
[11:32:50] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28839 → 28840
[11:32:50] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3491, currentOffset=3491
[11:32:50] [SCROLL] Scrolling to 3491, animated=false
[11:32:50] new_session POST ok: token len=157
[11:32:50] HELLO → sent (fetched token, role=query)
[11:32:50] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[11:32:50] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[11:32:50] [SIG] hello_ok received for query connection - ready to query agents
[11:32:50] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[11:32:50] [SIG] get_agents request sent for sessionId=ILUIWU
[11:32:50] [SIG] get_agents request sent for sessionId=iosILUIWU
[11:32:50] [SERVER] Stopped reconnect polling
[11:32:50] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=73
[11:32:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28840, 28839, 28838, 28837, 28836]
[11:32:50] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:32:50] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[11:32:50] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:32:50] [SCROLL] wasNearBottom=true, threshold=758, offset=3491, contentH=4249, boundsH=758, forceScroll=true
[11:32:50] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:32:50] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[11:32:50] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3491, currentOffset=3491
[11:32:50] [SCROLL] Scrolling to 3491, animated=false
[11:32:50] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:32:50] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[11:32:50] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[11:32:50] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:32:50] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[11:32:50] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[11:32:50] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[11:32:50] [SERVER] Starting reconnect polling (5s interval)
[11:32:50] [UPLOAD_RECOVERY] ✅ All media files verified on server
[11:32:52] [MUTE] Status sent to server: muted=1, response code=200
[11:32:52] [MUTE] Status sent to server: muted=1, response code=200
[11:32:52] [PUSH] Silent push received
[11:32:52] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:52 +0000, appState=0, message_id=nil, type=nil
[11:32:52] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:32:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:52 +0000
[11:32:52] [PUSH_EMBED] No embedded message_data in notification
[11:32:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:32:52] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:32:52] [PUSH] No embedded data, pre-loading messages from server
[11:32:52] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:52] [CLIENT_SIG] Event received: type=3 messageId=28840
[11:32:52] [WS_EVENT] Received event: type=3, messageId=28840
[11:32:52] [WS_EVENT] Read receipt for message 28840 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:32:52] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:32:52] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:32:52] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:32:52] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:32:52] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:32:52] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:32:52] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[11:32:52] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[11:32:52] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:32:52] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:32:52] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[11:32:52] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:32:52] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28840
[11:32:52] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28840, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
[11:32:52] [PUSH] Parsed message_id: 28840
[11:32:52] [PUSH] Parsed operation_type: 3
[11:32:52] [PUSH] Taking direct action: opType=3, messageId=28840
[11:32:52] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28840
[11:32:53] [SCROLL] 💓 alive, visible=41...48, rows=52, estHeight=0.0, heightCalls=64
[11:32:53] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[11:32:53] [SCROLL_END_DECEL] messagesTable offsetY=3802, insetTop=0, pendingVelocityY=0.0
[11:32:55] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[11:32:55] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[11:32:55] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[11:32:55] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=5
[11:32:55] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28840, 28839, 28838, 28837]
[11:32:55] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:32:55] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:55] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:32:55] [SCROLL] wasNearBottom=true, threshold=447, offset=3802, contentH=4249, boundsH=447, forceScroll=false
[11:32:55] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:32:55] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[11:32:55] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=114
[11:32:55] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[11:32:55] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[11:32:55] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3879, currentOffset=3879
[11:32:55] [SCROLL] Scrolling to 3879, animated=true
[11:32:55] [CLIENT_SIG] Event received: type=0 messageId=28841
[11:32:55] [WS_EVENT] Received event: type=0, messageId=28841
[11:32:55] [WS_EVENT] 📨 New message notification (msgId=28841) - triggering incremental refresh, currentMsgCount=51
[11:32:55] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:32:55] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28840, maxMemoryId=28840
[11:32:55] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28840
[11:32:55] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28841,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:32:55"}
[11:32:55] [CHAT] receive_message.php JSON: ["ok": 1, "session_id": ILUIWU, "message_type": 0, "message_id": 28841, "datesent_utc": 2026-04-23 08:32:55, "file_name": ]
[11:32:55] [DB_UPGRADE] Upgrading message ID: -1 → 28841, preserveOriginalDate=false
[11:32:55] [DB_UPGRADE] ✅ Upgraded -1 → 28841 with send_status=0, 1 row(s) affected
[11:32:55] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28841
[11:32:55] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28841
[11:32:55] ReloadData 9
[11:32:55] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:32:55] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28841]
[11:32:55] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:55] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:55] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:32:55] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:32:55] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[11:32:55] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[11:32:55] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28841, 28840, 28839, 28838, 28837]
[11:32:55] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:32:55] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:55] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:32:55] [SCROLL] wasNearBottom=true, threshold=447, offset=3879, contentH=4326, boundsH=447, forceScroll=true
[11:32:55] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:32:55] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[11:32:55] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3879, currentOffset=3879
[11:32:55] [SCROLL] Scrolling to 3879, animated=false
[11:32:55] [SERVER] Polling - attempting to reconnect...
[11:32:55] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:32:55] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:32:56] [LIFECYCLE] App resigning active - cleared crash flag
[11:32:56] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[11:32:56] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[11:32:56] [SECURITY] Saved background timestamp
[11:32:56] [LIFECYCLE] App entering background - cleared crash flag
[11:32:56] [CLIENT_SIG] Disconnecting
[11:32:56] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[11:32:56] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[11:32:56] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:56] [LIFECYCLE] Background snapshot: count=51, maxId=28841
[11:32:56] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[11:32:56] [WS] Canceling WebSocket for query connection to iosILUIWU
[11:32:56] In cleanupPeer
[11:32:56] In cleanupPeer
[11:32:56] [LIFECYCLE] WebRTC audio disabled
[11:32:56] [LIFECYCLE] AVAudioSession deactivated
[11:32:56] [LIFECYCLE] All connections stopped
[11:32:56] [CLIENT_SIG] WebSocket closed with code 1001
[11:32:56] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:32:56] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:32:56] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:32:56] [SERVER] Stopped reconnect polling
[11:32:56] Will request stop of video 0
[11:32:56] Will request stop of video 0
[11:32:56] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[11:32:56] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[11:32:56] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[11:32:56] [WS] Query connection failed - cleaning up all agent connections and views
[11:32:56] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[11:32:56] [APP_TERMINATE] ✅ No pending uploads in DB queue
[11:32:56] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=false, returning=false, textView=<Eye.PastingTextView: 0x10d7f4000; baseClass = UITextView; frame = (44 8; 320 36
[11:32:58] [CRASH] No crash detected
[11:32:58] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[11:32:58] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[11:32:58] [GIPHY] SDK not available - using REST API fallback
[11:32:58] [BACKGROUND] Background fetch enabled
[11:32:58] [SECURITY] Initial launch - timeout exceeded (1.4460992813110352s > 0.0s)
[11:32:58] [AUTH] Starting PIN authentication
[11:32:58] [PUSH] Silent push received
[11:32:58] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:58 +0000, appState=2, message_id=nil, type=nil
[11:32:58] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:32:58] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:58 +0000
[11:32:58] [PUSH_EMBED] No embedded message_data in notification
[11:32:58] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:32:58] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:32:58] [PUSH] No embedded data, pre-loading messages from server
[11:32:58] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:32:58] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:32:58] [PUSH] APNs token: ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f
[11:32:58] [CLEANUP] No old timer messages to delete
[11:32:58] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28828)...
[11:32:59] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:32:59] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:32:59] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"ea74d1b23419aba9c7f42f122ceaac51082c3477711ef6cb1bbd1988f213ab7f","role":"viewer","muted":1,"removed_from_other_channels":0}
[11:32:59] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:32:59] [USER] ✅ User registered successfully
[11:32:59] [PUSH] User registration after token update: success
[11:32:59] [PRELOAD] Fetched 13 messages
[11:32:59] [PRELOAD] ✅ Saved 13 messages to local DB
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=13, sessionId=ILUIWU
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[11:32:59] [PRELOAD] ⚡ Cached 13 messages for instant display (preserved 0 from push)
[11:32:59] [USER] ✅ User registered successfully
[11:32:59] [PUSH] User registration after token update: success
[11:32:59] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:32:59] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:32:59] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:32:59] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:32:59] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=13, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:32:59] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:32:59] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:32:59] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:33:13] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:33:13] [PUSH] Silent push received
[11:33:13] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:13 +0000, appState=2, message_id=28842, type=nil
[11:33:13] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:33:13] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:13 +0000
[11:33:13] [PUSH_TRACE] ⬇️ Processing embedded message_id=28842
[11:33:13] [PUSH_EMBED] 📩 Received embedded message: id=28842, type=0, sender=Laurent
[11:33:13] [PUSH_TRACE] ⬇️ Message details: text="Hello babyyyy...", datesent=2026-04-23 08:33:13
[11:33:13] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:33:13] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28842
[11:33:13] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28842
[11:33:13] [PUSH_EMBED] ✅ Saved message 28842 to local DB (sync)
[11:33:13] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28842
[11:33:13] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28842
[11:33:13] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28842
[11:33:13] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[11:33:13] [PUSH_EMBED] Inserted message 28842 into existing cache (now 51 messages)
[11:33:13] [PUSH_TRACE] 📦 ✅ Inserted message 28842, cache now has IDs: [28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[11:33:13] [PUSH_TRACE] 📦 EXITING cache update queue for message 28842
[11:33:13] [PUSH_EMBED] Fetching evolution data for message 28842 in background
[11:33:13] [PUSH_EMBED] ✅ Fully processed message 28842
[11:33:13] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28842
[11:33:13] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833], handled=true
[11:33:13] [PUSH] Embedded message handled instantly from silent push
[11:33:13] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:33:13] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28842
[11:33:14] [PUSH_EMBED] Got evolution data for message 28842, saving to local DB
[11:33:14] [PUSH_EMBED] Saved evolution data for message 28842
[11:33:18] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[11:33:18] [PUSH] Silent push received
[11:33:18] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:18 +0000, appState=2, message_id=28843, type=nil
[11:33:18] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[11:33:18] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:18 +0000
[11:33:18] [PUSH_TRACE] ⬇️ Processing embedded message_id=28843
[11:33:18] [PUSH_EMBED] 📩 Received embedded message: id=28843, type=0, sender=Laurent
[11:33:18] [PUSH_TRACE] ⬇️ Message details: text="Notification received ?...", datesent=2026-04-23 08:33:17
[11:33:18] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:33:18] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28843
[11:33:18] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28843
[11:33:18] [PUSH_EMBED] ✅ Saved message 28843 to local DB (sync)
[11:33:18] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28843
[11:33:18] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28843
[11:33:18] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28843
[11:33:18] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[11:33:18] [PUSH_EMBED] Inserted message 28843 into existing cache (now 52 messages)
[11:33:18] [PUSH_TRACE] 📦 ✅ Inserted message 28843, cache now has IDs: [28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:18] [PUSH_TRACE] 📦 EXITING cache update queue for message 28843
[11:33:18] [PUSH_EMBED] Fetching evolution data for message 28843 in background
[11:33:18] [PUSH_EMBED] ✅ Fully processed message 28843
[11:33:18] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28843
[11:33:18] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=52, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834], handled=true
[11:33:18] [PUSH] Embedded message handled instantly from silent push
[11:33:18] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[11:33:18] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28843
[11:33:19] [PUSH_EMBED] Got evolution data for message 28843, saving to local DB
[11:33:19] [PUSH_EMBED] Saved evolution data for message 28843
[11:33:22] [PUSH] Notification tapped - session_id: ILUIWU
[11:33:22] [PUSH] Max message_id before tap: 28843
[11:33:22] [PUSH] Stored pending session: ILUIWU
[11:33:22] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:22 +0000
[11:33:22] [PUSH_TRACE] ⬇️ Processing embedded message_id=28843
[11:33:22] [PUSH_EMBED] 📩 Received embedded message: id=28843, type=0, sender=Laurent
[11:33:22] [PUSH_TRACE] ⬇️ Message details: text="Notification received ?...", datesent=2026-04-23 08:33:17
[11:33:22] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[11:33:22] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28843
[11:33:22] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28843
[11:33:22] [PUSH_EMBED] ✅ Saved message 28843 to local DB (sync)
[11:33:22] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28843
[11:33:22] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28843
[11:33:22] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28843
[11:33:22] [PUSH_TRACE] 📦 Cache state: valid=true, count=52, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:22] [PUSH_TRACE] 📦 ⚠️ Message 28843 already in cache, skipping insert
[11:33:22] [PUSH_TRACE] 📦 EXITING cache update queue for message 28843
[11:33:22] [PUSH_EMBED] Fetching evolution data for message 28843 in background
[11:33:22] [PUSH_EMBED] ✅ Fully processed message 28843
[11:33:22] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28843
[11:33:22] [PUSH] Embedded message handled instantly on tap
[11:33:22] [PUSH] Fetching server messages since_id=28843 to catch coalesced notifications on tap
[11:33:22] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:33:22] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28843 to catch coalesced notifications
[11:33:22] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:33:22] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:33:22] [CLIENT_SIG] WebSocket opened
[11:33:22] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:33:22] [CLIENT_SIG] Connected! clientId=PwzxlrugHLuRr-9f
[11:33:22] [PUSH_EMBED] Got evolution data for message 28843, saving to local DB
[11:33:22] [PUSH_EMBED] Saved evolution data for message 28843
[11:33:22] [PUSH_PRELOAD] No messages or parse error
[11:33:22] [PUSH] Server fetch on tap completed (success=false)
[11:33:22] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:33:22] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:33:22] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:33:24] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:33:24] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[11:33:24] [LIFECYCLE] App resigning active - cleared crash flag
[11:33:25] [UPLOAD_QUEUE] ✅ Database integrity check passed
[11:33:25] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[11:33:25] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[11:33:25] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[11:33:25] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[11:33:25] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[11:33:25] [LIFECYCLE] App entering background - cleared crash flag
[11:33:25] [CLIENT_SIG] Disconnecting
[11:33:25] [CLIENT_SIG] WebSocket closed with code 1001
[11:33:25] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[11:33:25] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[11:33:25] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[11:33:29] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[11:33:29] [CLIENT_SIG] Connecting to session ILUIWU as Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:33:29] [CLIENT_SIG] WebSocket opened
[11:33:29] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[11:33:29] [CLIENT_SIG] Connected! clientId=6HJqw6CbcEWJakxf
[11:33:29] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[11:33:29] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:33:29] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:33:29] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:33:30] [PIN_AUTH] Correct PIN
[11:33:30] [SECURITY] Restored real session: ILUIWU
[11:33:30] [SECURITY] Restored real session: ILUIWU
[11:33:31] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[11:33:31] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[11:33:31] [SECURITY] Saved real session: ILUIWU
[11:33:31] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[11:33:31] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[11:33:31] Documents Directory: /var/mobile/Containers/Data/Application/C54170A7-4208-45E1-972B-D75BEF83B039/Documents
[11:33:31] [CAPTURE_HOST] live-feed moved hosted view to plain container
[11:33:31] [THEME] Applying current theme
[11:33:31] [CHAT] Applied day theme (mode: day)
[11:33:31] [SECURITY] Saved real session: ILUIWU
[11:33:31] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[11:33:31] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[11:33:31] [NETWORK] Network monitor started
[11:33:31] [NETWORK] Status changed: connected
[11:33:31] Did transition
[11:33:31] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[11:33:31] [VIEWER] Screen lock enabled - normal idle behavior
[11:33:31] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[11:33:31] [VCC] ========== VideoConnectionClass INIT ==========
[11:33:31] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[11:33:31] [DATA AUDIO] ========== setupWebRTC() START ==========
[11:33:31] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[11:33:31] [DATA AUDIO] Creating encoder/decoder factories...
[11:33:31] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[11:33:31] [CODEC] Viewer selected encoder: AV1 (best quality)
[11:33:31] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[11:33:31] [DATA AUDIO] ✅ Factory created
[11:33:31] [DATA AUDIO] RTCAudioSession locked
[11:33:31] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[11:33:31] [DATA AUDIO] RTCAudioSession unlocked
[11:33:31] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[11:33:31] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[11:33:31] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[11:33:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[11:33:31] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[11:33:31] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[11:33:31] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:33:31] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[11:33:31] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[11:33:31] Did transition
[11:33:31] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[11:33:31] [USER] Registering user: EDAD55A1-003F-415D-AA60-672B34B504FE, name: Esra
[11:33:31] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:33:31] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[11:33:31] [READBY_OPT] No message IDs to fetch - skipping server call
[11:33:31] [MIGRATION] No messages need sender_name backfill
[11:33:31] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[11:33:31] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[11:33:31] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[11:33:31] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[11:33:31] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28843, maxMemoryId=28843
[11:33:31] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28843
[11:33:31] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[11:33:31] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[11:33:31] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[11:33:31] [GALLERY_DB] ✅ Loaded 1256 media messages
[11:33:31] [USER] ✅ User registered successfully
[11:33:31] [USER] User registration successful
[11:33:31] [INCREMENTAL_SYNC] ✅ No new messages
[11:33:31] [GALLERY] Filtered 1256 -> 1233 (only with local thumbnails)
[11:33:31] [GALLERY] First 5 after sort (newest first):
[11:33:31] [GALLERY]   0: id=28821, date=2026-04-23 07:16:04, file=2c2436d604281163.jpg
[11:33:31] [GALLERY]   1: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[11:33:31] [GALLERY]   2: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[11:33:31] [GALLERY]   3: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[11:33:31] [GALLERY]   4: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[11:33:31] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[11:33:31] [SCROLL_BTN] Showing button - 29pt from bottom > half 22pt
[11:33:31] [SERVER] Starting reconnect polling (5s interval)
[11:33:31] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[11:33:31] [ICONS] Offset applied: -14.6
[11:33:31] [ICONS] New left margin: 11.2, New right margin: 11.3
[11:33:31] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[11:33:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[11:33:31] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:33:31] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[11:33:31] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[11:33:31] [ICONS] Chat center: (31.2, 87.0)
[11:33:31] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[11:33:31] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[11:33:31] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[11:33:31] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[11:33:31] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[11:33:31] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[11:33:31] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[11:33:31] [ICONS] Screen width: 440.0
[11:33:31] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:33:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28843, 28842, 28841, 28840, 28839]
[11:33:31] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:33:31] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:31] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:33:31] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=61, boundsH=758, forceScroll=true
[11:33:31] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:33:31] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[11:33:31] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[11:33:31] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28841 → 28842
[11:33:31] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28842 → 28843
[11:33:31] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[11:33:31] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[11:33:31] [UNSENT_RETRY] Checking for unsent messages...
[11:33:31] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[11:33:31] [UPLOAD_RECOVERY] User ID: EDAD55A1-003F-415D-AA60-672B34B504FE
[11:33:31] [UPLOAD_RECOVERY] Session: ILUIWU
[11:33:31] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[11:33:31] [UPLOAD_RECOVERY] Checking recent media messages on server...
[11:33:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28821, file=2c2436d604281163.jpg, upload_status=complete
[11:33:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28740, file=adbb72082c79fd33.jpg, upload_status=complete
[11:33:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28734, file=653beabd4db198ba.jpg, upload_status=complete
[11:33:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28665, file=ecb18b0d57be7e6f.png, upload_status=complete
[11:33:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28643, file=6203759b347d3ad8.png, upload_status=complete
[11:33:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28502, file=3e5f8d3301a13b0c.jpg, upload_status=complete
[11:33:31] [UPLOAD_RECOVERY] Verifying 6 media files exist on server...
[11:33:31] [PENDING_UPLOAD] Total pending upload messages: 0
[11:33:31] [UNSENT_RETRY] No unsent messages found
[11:33:31] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3367, currentOffset=3367
[11:33:31] [SCROLL] Scrolling to 3367, animated=false
[11:33:31] new_session POST ok: token len=157
[11:33:31] HELLO → sent (fetched token, role=query)
[11:33:31] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[11:33:31] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[11:33:31] [SIG] hello_ok received for query connection - ready to query agents
[11:33:31] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[11:33:31] [SIG] get_agents request sent for sessionId=ILUIWU
[11:33:31] [SIG] get_agents request sent for sessionId=iosILUIWU
[11:33:31] [SERVER] Stopped reconnect polling
[11:33:32] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=75
[11:33:32] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28843, 28842, 28841, 28840, 28839]
[11:33:32] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[11:33:32] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:32] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[11:33:32] [SCROLL] wasNearBottom=true, threshold=758, offset=3367, contentH=4125, boundsH=758, forceScroll=true
[11:33:32] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[11:33:32] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[11:33:32] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:33:32] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[11:33:32] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3367, currentOffset=3367
[11:33:32] [SCROLL] Scrolling to 3367, animated=false
[11:33:32] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[11:33:32] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[11:33:32] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[11:33:32] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[11:33:32] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[11:33:32] [SERVER] Starting reconnect polling (5s interval)
[11:33:32] [UPLOAD_RECOVERY] ✅ All media files verified on server
[11:33:33] [PUSH] Silent push received
[11:33:33] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:33 +0000, appState=0, message_id=nil, type=nil
[11:33:33] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:33 +0000
[11:33:33] [PUSH_EMBED] No embedded message_data in notification
[11:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:33:33] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:33:33] [PUSH] No embedded data, pre-loading messages from server
[11:33:33] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:33:33] [PUSH] Silent push received
[11:33:33] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:33 +0000, appState=0, message_id=nil, type=nil
[11:33:33] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[11:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:33 +0000
[11:33:33] [PUSH_EMBED] No embedded message_data in notification
[11:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:33:33] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[11:33:33] [PUSH] No embedded data, pre-loading messages from server
[11:33:33] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:33:33] [CLIENT_SIG] Event received: type=3 messageId=28842
[11:33:33] [WS_EVENT] Received event: type=3, messageId=28842
[11:33:33] [WS_EVENT] Read receipt for message 28842 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:33:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:33:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:33:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:33:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[11:33:34] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:33:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:33:34] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:34] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:33:34] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28843
[11:33:34] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28842, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[11:33:34] [PUSH] Parsed message_id: 28842
[11:33:34] [PUSH] Parsed operation_type: 3
[11:33:34] [PUSH] Taking direct action: opType=3, messageId=28842
[11:33:34] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28842
[11:33:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:33:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:33:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:33:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[11:33:34] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:34] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[11:33:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:33:34] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:34] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:33:34] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28843
[11:33:34] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28843, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[11:33:34] [PUSH] Parsed message_id: 28843
[11:33:34] [PUSH] Parsed operation_type: 3
[11:33:34] [PUSH] Taking direct action: opType=3, messageId=28843
[11:33:34] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28843
[11:33:34] [CLIENT_SIG] Event received: type=3 messageId=28843
[11:33:34] [WS_EVENT] Received event: type=3, messageId=28843
[11:33:34] [WS_EVENT] Read receipt for message 28843 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[11:33:35] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=63
[11:33:35] [SCROLL_END_DECEL] messagesTable offsetY=3732, insetTop=0, pendingVelocityY=0.0
[11:33:36] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[11:33:36] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[11:33:36] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[11:33:36] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[11:33:36] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 28843, 28842, 28841, 28840]
[11:33:36] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:33:36] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:36] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:33:36] [SCROLL] wasNearBottom=true, threshold=393, offset=3732, contentH=4125, boundsH=393, forceScroll=false
[11:33:36] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:33:36] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[11:33:36] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=114
[11:33:36] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[11:33:36] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[11:33:36] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=3809, currentOffset=3809
[11:33:36] [SCROLL] Scrolling to 3809, animated=true
[11:33:37] [CLIENT_SIG] Event received: type=0 messageId=28844
[11:33:37] [WS_EVENT] Received event: type=0, messageId=28844
[11:33:37] [WS_EVENT] 📨 New message notification (msgId=28844) - triggering incremental refresh, currentMsgCount=51
[11:33:37] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[11:33:37] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28843, maxMemoryId=28843
[11:33:37] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28843
[11:33:37] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28844,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:33:36"}
[11:33:37] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "datesent_utc": 2026-04-23 08:33:36, "message_type": 0, "file_name": , "message_id": 28844, "ok": 1]
[11:33:37] [DB_UPGRADE] Upgrading message ID: -1 → 28844, preserveOriginalDate=false
[11:33:37] [DB_UPGRADE] ✅ Upgraded -1 → 28844 with send_status=0, 1 row(s) affected
[11:33:37] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28844
[11:33:37] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28844
[11:33:37] ReloadData 9
[11:33:37] [SERVER] Polling - attempting to reconnect...
[11:33:37] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:33:37] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:33:37] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[11:33:37] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28844]
[11:33:37] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:37] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:37] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[11:33:37] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[11:33:37] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[11:33:37] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[11:33:37] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28844, 28843, 28842, 28841, 28840]
[11:33:37] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[11:33:37] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:37] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[11:33:37] [SCROLL] wasNearBottom=true, threshold=393, offset=3809, contentH=4202, boundsH=393, forceScroll=true
[11:33:37] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[11:33:37] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[11:33:37] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3809, currentOffset=3809
[11:33:37] [SCROLL] Scrolling to 3809, animated=false
[11:33:38] [SCROLL] 💓 alive, visible=47...52, rows=53, estHeight=0.0, heightCalls=59
[11:33:39] [PUSH] Silent push received
[11:33:39] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:39 +0000, appState=0, message_id=nil, type=nil
[11:33:39] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:39] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:39 +0000
[11:33:39] [PUSH_EMBED] No embedded message_data in notification
[11:33:39] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[11:33:39] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834], handled=false
[11:33:39] [PUSH] No embedded data, pre-loading messages from server
[11:33:39] [PUSH_PRELOAD] Fetching messages for instant display cache
[11:33:39] [CLIENT_SIG] Event received: type=3 messageId=28844
[11:33:39] [WS_EVENT] Received event: type=3, messageId=28844
[11:33:39] [WS_EVENT] Read receipt for message 28844 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[11:33:39] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[11:33:39] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[11:33:39] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[11:33:39] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[11:33:39] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[11:33:39] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:39] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[11:33:39] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28756]
[11:33:39] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28756]
[11:33:39] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:39] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[11:33:39] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[11:33:39] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[11:33:39] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[11:33:39] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28844
[11:33:39] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28844, AnyHashable("session_id"): ILUIWU]
[11:33:39] [PUSH] Parsed message_id: 28844
[11:33:39] [PUSH] Parsed operation_type: 3
[11:33:39] [PUSH] Taking direct action: opType=3, messageId=28844
[11:33:39] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28844
[11:33:42] [SERVER] Polling - attempting to reconnect...
[11:33:42] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:33:42] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:33:45] [SCROLL] 💓 alive, visible=47...52, rows=53, estHeight=0.0, heightCalls=1
[11:33:45] [SCROLL_END_DECEL] messagesTable offsetY=3809, insetTop=0, pendingVelocityY=0.0
[11:33:47] [SERVER] Polling - attempting to reconnect...
[11:33:47] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:33:47] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:33:51] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[11:33:52] [SERVER] Polling - attempting to reconnect...
[11:33:52] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:33:52] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:33:52] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=92ms
[11:33:57] [SERVER] Polling - attempting to reconnect...
[11:33:57] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:33:57] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:34:02] [SERVER] Polling - attempting to reconnect...
[11:34:02] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:34:02] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:34:07] [SERVER] Polling - attempting to reconnect...
[11:34:07] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[11:34:07] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[11:34:07] [CLIENT_SIG] Typing start from: Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)