def draw():
    l, e2, a2n, n = create_linked_list([2])
    ca2n = Cross(a2n, color=RED)
    _, e4, a4n2, n2 = create_linked_list(
    	[4], 
    	x=e2.x + e2.width + 15,
    	y=e2.y + 40,
    	color=RED
    )
    a24 = Arrow(e2.prox_3, e4.start_1, color=RED)
    return [
    	l, e2, a2n, n,
    	ca2n, e4, a4n2, n2,
    	a24
    ]
def fail():
    l, e2, a2n, n = create_linked_list([2], y=200)
    sa = SubArrow(e2.prox_2, e2.start_2)
    circ = Circle((n.x + 40, n.y), "3", color=BLUE)
    return [
        l, e2, sa,
        circ
    ]
def ok():
    l, e3, a3n, n = create_linked_list([3])
    sa = SubArrow(e3.prox_2, e3.start_2)
    c3 = Cross(e3, color=RED, size=20)
    circ = Circle((n.x + 40, n.y), "3", color=BLUE)
    return [
        l, e3, sa,
        c3, circ
    ]
def draw():
    l, e1, a12, e2, a23, e3, a3n, n = create_linked_list([1, 2, 3])
    cl = Cross(l.arrow, color=RED)
    c1 = Cross(e1.middle, color=RED, size=20)
    l2 = Pointer(e2, 'l', direction='lu.start_0', color=RED)
    return [
    	l, e1, a12, e2, a23, e3, a3n, n,
        cl, c1, l2
    ]
def draw():
    l, e1, a1_21, e21, a21_22, e22, a22_3, e3, a3n, n = create_linked_list(
        [1, 2, 2, 3])
    p = Pointer(e21, ' ', direction='u.u_2', color=RED)
    c = Circle((e21.mx + 4, e21.my - 2), "", radius=30, color=RED)
    return [
        l, e1, a1_21, e21, a21_22, e22, a22_3, e3, a3n, n,
        p, c
    ]
def draw():
    l, e1, a12, e2, a23, e3, a3n, n = create_linked_list(["", "", None, ""])
    
    ellipsis = Label((a23.mx, a23.my), "...")
    a2e = Arrow(e2.prox_2,(a23.mx - 10, a23.my))
    ae3 = Arrow(ellipsis.nearest(e3.start_2), e3.start_2)
    return [
        l, e1, a12, e2, e3, a3n, n,
        ellipsis, a2e, ae3
    ]
def draw():
    l, e1, a13, e3, a35, e5, a5n, n = create_linked_list([None, 1, 3, 5])
    # Add 0
    e0 = LinkedList((e1.x - 40, e1.y + 40, 0), 0, color=RED)
    a01 = Arrow(e0.prox_1, e1.start_4, color=RED)
    novo = Pointer(e0, 'novo', direction='ul.start_0', color=RED)

    return [
    	l, e1, a13, e3, a35, e5, a5n, n,
        e0, novo, a01
    ]
def draw():
    l, e8, a8n, n = create_linked_list([8])
    sa = SubArrow(e8.prox_2, e8.start_2)
    c1 = Cross(sa, color=RED)
    e5 = LinkedList((n.x + 30, e8.y), 5, color=RED)
    a85 = Arrow(e8.prox_1, e5.start_1, color=RED)
    sa2 = SubArrow(e5.prox_3, e8.start_1, color=RED, size_x2=20)
    return [
        l, e8, sa, 
        c1, e5, a85, sa2
    ] 
def draw():
    # Level 0
    l, n = create_linked_list([], x=35, y=50)
    c2 = Circle((100, 60), "2")
    x = (75, 90)
    li1 = Line((n.x, 70), x, color=BLUE)
    li2 = Line(c2.nearest(x), x, color=BLUE)

    # Level 1
    nl, e2, a2n, n2 = create_linked_list([2], x=45, y=120)
    a2 = Arrow(x, e2.u_3, color=BLUE)
    novo2 = Pointer(e2, 'novo', direction='lu.start_0')
    c1 = Circle((150, 140), "1")
    x = (115, 170)
    li3 = Line(e2.d_4, x, color=BLUE)
    li4 = Line(c1.nearest(x), x, color=BLUE)
    
    # Level 2
    e1 = LinkedList((75, 200), 1)
    a1 = Arrow(x, e1.u_4, color=BLUE)
    novo3 = Pointer(e1, 'novo', direction='lu.start_0')
    a12 = Arrow(e1.prox_1, e2.d_2)
    c3 = Circle((180, 220), "3")
    x = (142, 250)
    li5 = Line(e1.d_4, x, color=BLUE)
    li6 = Line(c3.nearest(x), x, color=BLUE)

    # Level 3
    e3 = LinkedList((102, 280), 3)
    a3 = Arrow(x, e3.u_4, color=BLUE)
    novo4 = Pointer(e3, 'novo', direction='lu.start_0')
    a31 = Arrow(e3.prox_1, e1.d_2)
    l3 = Pointer(e3, 'l', direction='l.start_2')

    return [
        n, l, c2, li1, li2, e2, a2, novo2, a2n, n2,
        c1, li3, li4, e1, a1, novo3, a12, c3, li5, li6,
        e3, a3, novo4, a31, l3
    ]
def search():
    l, e1, a12, e2, a2n, n = create_linked_list([1, 2])
    sa = SubArrow(e2.prox_2, e1.start_2)
    ant1 = Pointer(e1, 'ant', direction='d.d_2', color=RED, dist=25)
    p1 = Pointer(e1, 'p', direction='u.u_2', color=RED)
    ant2 = Pointer(e2, 'ant', direction='d.d_2', color=RED, dist=25)
    p2 = Pointer(e2, 'p', direction='u.u_2', color=RED)
    circ = Circle((n.x + 40, n.y), "1", color=BLUE)
    cant1 = Cross(ant1.label, color=BLUE)
    cp2 = Cross(p2.label, color=RED)
    return [
        l, e1, a12, e2, sa, circ,
        ant1, ant2, p1, p2, cant1, cp2
    ]
def draw():
    l, e1, a12, e2, a23, e3, a3n, n = create_linked_list([1, 2, 3])
    ant = Pointer(e1, 'ant', direction='d.d_2', color=RED)
    p1 = Pointer(e1, 'p', direction='u.u_2', color=RED)
    c1 = Cross(p1.arrow, color=RED)
    c2 = Cross(e2.middle, color=RED, size=20)
    c3 = Cross(a12, color=RED)
    p2 = Pointer(e2, 'p', direction='u.u_2', color=RED)
    sa = SubArrow(e1.prox_3, e3.start_3, color=RED)
    lab = Label((sa.mx, sa.my+20), "ant->prox = p->prox", color=RED)
    return [
        l, e1, a12, e2, a23, e3, a3n, n,
        c1, c2, c3, p1, p2, ant, sa, lab
    ]
def draw():
    l, e0, a03, e3, a32, e2, a2n, n = create_linked_list([0, 3, 2])
    sa = SubArrow(e2.prox_2, e0.start_2)
    ant0 = Pointer(e0, "ant", direction="d.d_2", color=RED, dist=25)
    p0 = Pointer(e0, "p", direction="u.u_2", color=RED)
    ant3 = Pointer(e3, "ant", direction="d.d_2", color=RED, dist=25)
    p3 = Pointer(e3, "p", direction="u.u_2", color=RED)
    ant2 = Pointer(e2, "ant", direction="d.d_2", color=RED, dist=25)
    p2 = Pointer(e2, "p", direction="u.u_2", color=RED)
    circ = Circle((n.x + 40, n.y), "1", color=BLUE)

    cant0 = Cross(ant0.label, color=RED)
    cant3 = Cross(ant3.label, color=RED)
    cp3 = Cross(p3.label, color=RED)
    cp2 = Cross(p2.label, color=RED)

    c = Cross((a03.mx, a03.my - 10), size=10, color=RED)

    return [l, e0, a03, e3, a32, e2, sa, circ, ant0, ant3, ant2, p0, p3, p2, cant0, cant3, cp3, cp2, c]
def draw():
    l, e2, a24, e4, a4n, n = create_linked_list([None, 2, None, 4])
    # Add 0
    cl = Cross(l, color=RED)
    e0 = LinkedList((e2.x - 40, e2.y + 40, 0), 0, color=RED)
    a02 = Arrow(e0.prox_1, e2.start_4, color=RED)
    l0 = Pointer(e0, 'l', direction='ul.start_0', color=RED)
    # Add 3
    ca24 = Cross(a24, color=BLUE)
    e3 = LinkedList((e4.x - 60, e4.y + 40, 0), 3, color=BLUE)
    a23 = Arrow(e2.prox_3, e3.start_0, color=BLUE)
    a34 = Arrow(e3.prox_1, e4.start_4, color=BLUE)
   
    ant = Pointer(e2, 'ant', direction='u.u_2', color=BLUE)
    pp = Pointer(e4, 'p', direction='u.u_2', color=BLUE)
    novo = Pointer(e3, 'novo', direction='d.d_2', color=BLUE)

    return [
    	l, e2, a24, e4, a4n, n,
    	cl, e0,  a02, l0,
        ca24, e3, a23, a34,
        ant, pp, novo
    ]
def draw():
    return create_linked_list([])
def draw():
    return create_linked_list([1, 2, 3])