Design an in-memory task manager that supports the following operations:
ADD(task_id, priority) – insert a new task with a unique ID and an integer priority (higher number = higher priority). If the task already exists, do nothing.
GET() – return the highest-priority task that has not been assigned or completed, formatted as "task_id:priority". If two tasks share the same priority, return the one that was added earliest. If no such task exists, return "".
ASSIGN(task_id, user_id, deadline) – mark the task as assigned to the given user and store an integer deadline timestamp. Fail (return False) if the task does not exist or is already assigned; otherwise succeed (return True).
COMPLETE(task_id, timestamp) – mark the task as completed. Fail (return False) if the task is not currently assigned or if the provided timestamp is later than the task’s deadline; otherwise succeed (return True) and remove it from assigned tracking.
SEARCH(prefix) – return a comma-separated string of task IDs (no spaces) whose IDs start with the given prefix, ordered first by descending priority and then by creation order (earliest first). If no match, return "".
GET_OVERDUE(current_timestamp) – return a comma-separated string of assigned but not yet completed task IDs whose deadline is strictly less than current_timestamp, ordered by ascending deadline (earliest overdue first). If none, return "".
Your implementation will be initialized once and then queried repeatedly. All task_ids, user_ids and prefixes are non-empty strings; timestamps and deadlines are non-negative integers; priorities are integers (positive, negative or zero).