'Insert a new job into the job queue. If the job queue is ordered, this job will be inserted at the correct
position.
:param job: The job to insert
:return:    None'

def _insert_job(self, job):

    key = self._job_key(job)
    if self._allow_merging:
        if (key in self._job_map):
            job_info = self._job_map[key]
            job_added = False
            if (self._allow_widening and self._should_widen_jobs(job_info.job, job)):
                try:
                    widened_job = self._widen_jobs(job_info.job, job)
                    if (job_info in self._job_info_queue):
                        self._job_info_queue.remove(job_info)
                    job_info.add_job(widened_job, widened=True)
                    job_added = True
                except AngrJobWideningFailureNotice:
                    pass
            if (not job_added):
                try:
                    merged_job = self._merge_jobs(job_info.job, job)
                    if (job_info in self._job_info_queue):
                        self._job_info_queue.remove(job_info)
                    job_info.add_job(merged_job, merged=True)
                except AngrJobMergingFailureNotice:
                    job_info = JobInfo(key, job)
                    self._job_map[key] = job_info
        else:
            job_info = JobInfo(key, job)
            self._job_map[key] = job_info
    else:
        job_info = JobInfo(key, job)
    if self._order_jobs:
        self._binary_insert(self._job_info_queue, job_info, (lambda elem: self._job_sorting_key(elem.job)))
    else:
        self._job_info_queue.append(job_info)
