<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def update_locate_candidates(candidate, next_candidates, x_val, y_val, degree):
 """Update list of candidate surfaces during geometric search for a point. .. note:: This is used **only** as a helper for :func:`locate_point`. Checks if the point ``(x_val, y_val)`` is contained in the ``candidate`` surface. If not, this function does nothing. If the point is contaned, the four subdivided surfaces from ``candidate`` are added to ``next_candidates``. Args: candidate (Tuple[float, float, float, numpy.ndarray]):
 A 4-tuple describing a surface and its centroid / width. Contains * Three times centroid ``x``-value * Three times centroid ``y``-value * "Width" of parameter space for the surface * Control points for the surface next_candidates (list):
 List of "candidate" sub-surfaces that may contain the point being located. x_val (float):
 The ``x``-coordinate being located. y_val (float):
 The ``y``-coordinate being located. degree (int):
 The degree of the surface. """

    centroid_x, centroid_y, width, candidate_nodes = candidate
    point = np.asfortranarray([x_val, y_val])
    if not _helpers.contains_nd(candidate_nodes, point):
        return

    nodes_a, nodes_b, nodes_c, nodes_d = _surface_helpers.subdivide_nodes(
        candidate_nodes, degree
    )
    half_width = 0.5 * width
    next_candidates.extend(
        (
            (
                centroid_x - half_width,
                centroid_y - half_width,
                half_width,
                nodes_a,
            ),
            (centroid_x, centroid_y, -half_width, nodes_b),
            (centroid_x + width, centroid_y - half_width, half_width, nodes_c),
            (centroid_x - half_width, centroid_y + width, half_width, nodes_d),
        )
    )