Implement a multi threaded task manager.
The manager receives tasks with dependencies, priorities, retry limits, and deterministic failure settings. Execute independent tasks concurrently, schedule ready tasks by priority, retry failures when allowed, and mark descendants as blocked when a dependency permanently fails.
Input: tasks, a list of dictionaries containing id, dependencies, priority, retries, and fail_until, plus worker_count. Output: a dictionary mapping each task ID to its final status and number of attempts. Valid inputs contain unique IDs, known dependencies, and an acyclic dependency graph.
Example: task b depending on successful task a finishes after a. If a permanently fails, b is blocked.
def execute_task_manager(tasks, worker_count):