def eo(self) -> tuple:
    """
    Solve last layer cross.

    Returns
    -------
    tuple of (list of str, dict of {'LAST LAYER CROSS': int})
        Moves to solve last layer cross, statistics (move count in ETM).

    Notes
    -----
    If an odd number of edges are oriented (1 or 3), do the OLL parity
    algorithm: `Rw' U2 Lw F2 Lw' F2 Rw2 U2 Rw U2 Rw' U2 F2 Rw2 F2`. This
    can only happen on even layered cubes. For 6x6 and larger, the wide
    moves have to be changed to adapt to the size of the cube.

    If no edges are oriented (dot shape) do `F R U R' U' F'` orienting
    two edges, making an L shape.

    If two adjacent edges are oriented (L shape), turn the cube so that
    the two oriented edges are in the front and right positions and do
    the same algorithm to make the line shape.

    If two opposite edges are oriented (line shape), turn the cube so
    that the two oriented edges form a horizontal line and do the same
    algorithm to solve the last layer cross.
    """
    cube = self.cube
    size = self.size
    solve = []
    edges = (1,0), (-1,1), (1,-1), (0,1)
    eo_alg = "F R U R' U' F'".split()
    setups = {
        (0,1,2): 'U2',
        (0,1,3): 'U',
        (1,2,3): "U'",
        (0,1): "U'",
        (0,3): 'U2',
        (1,3): 'U',
        (2,3): 'U',
        (1,): 'U'
    }

    while any(cube[0][y][x] != 'D' for y, x in edges):
        pieces = tuple([i for i in range(4)
                        if cube[0][edges[i][0]][edges[i][1]] == 'D'])
        if pieces in setups:
            self.move(setups[pieces])
            solve.append(setups[pieces])

        # OLL parity
        if len(pieces) % 2:
            oll_parity = "Rw' U2 Lw F2 Lw' F2 Rw2 U2 Rw U2 Rw' U2 F2 Rw2 F2"
            if size > 5:
                rw = f'{size // 2}Rw'
                lw = f'{size // 2}Lw'
                oll_parity = oll_parity.replace('Rw', rw).replace('Lw', lw)
            oll_parity = oll_parity.split()
            self.move(oll_parity)
            solve.extend(oll_parity)
        else:
            self.move(eo_alg)
            solve.extend(eo_alg)

    return solve, {'LAST LAYER CROSS': len(solve)}