text:
include("matrix.jl")

mutable struct S a :: Int64; end;

SIZE = 30000
table = newarray(SIZE, 0)
pointer = S(0)

function eval_phrase(s)
    n = array_length(s)
    returnForward = newarray(n, -1)
    returnBackward = newarray(n, -1)
    i = 0
    while i < n
        #println(i)
        if s[i] == '>'
            pointer.a = pointer.a + 1;
        elseif s[i] == '<'
            pointer.a = pointer.a - 1;
        elseif s[i] == '+'
            table[pointer.a] = table[pointer.a] + 1;
        elseif s[i] == '-'
            table[pointer.a] = table[pointer.a] - 1;
        elseif s[i] == '.'
            print(char(table[pointer.a]));
        elseif s[i] == ','
            table[pointer.a] = input_int();
        elseif (s[i] == ']' && table[pointer.a] != 0)
            if returnBackward[i] >= 0
                i = returnBackward[i]
            else
                j = i
                profondeur = 1
                while (i >= 0 && profondeur > 0)
                    i = i - 1
                    if s[i] == '['
                        profondeur = profondeur - 1;
                    elseif s[i] == ']'
                        profondeur = profondeur + 1;
                    end
                end
                if profondeur > 0
                    println("No matching [. Aborting")
                    return
                end
                returnBackward[j] = i
            end
        elseif s[i] == '[' && table[pointer.a] == 0
            if returnForward[i] >= 0
                i = returnForward[i]
            else
                j = i
                profondeur = 1
                while (i < n && profondeur > 0)
                    i = i + 1
                    if s[i] == '['
                        profondeur = profondeur + 1;
                    elseif s[i] == ']'
                        profondeur = profondeur - 1;
                    end
                end
                if profondeur > 0
                    println("No matching [. Aborting")
                    return
                end;
                returnForward[j] = i
            end
        end;
        i = i + 1
    end
    println()
end

helloWorld = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."
tinyMandelbrot = "+++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[>>>>>>>>[-]<<<<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+<<<<<<<<>+++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>>>>+<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>[<<<>>>>>>>>>[>>>>>>>[-]<<<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>[-]+<<<<<<<>++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>>>+<<<<<<<>+++++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[<<<>>>[-]<<<>>>>>>>>>[>>>>>>>[-<<<<<<<>+<>>>>>>>]<<<<<<<>[-<>>>>>>>+<<<<<<<>>>>>+<<<<<>>+<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>>>[-<<<<<<<<>+<>>>>>>>>]<<<<<<<<>[-<>>>>>>>>+<<<<<<<<>>>>>>+<<<<<<>>>+<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>[<<<<<<<>>>>>>>-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<>>>>>+<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>[-<<<<<>+<>>>>>]<<<<<>[-<>>>>>+<<<<<[->>[-<<+>>]<<[->>+<<>>>>+<<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>]<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>[<<<<>>>>-<<<<+>[<->-<<<<<<<<<<>>>>+<<<<>>>>>>>>>>]<[->+<]>>>>]<<<<>[<>-<>>>>+<<<<>]<+<<<<<<<<<]>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>>[-<<<<<<>+<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<[->>>[-<<<+>>>]<<<[->>>+<<<>>>>+<<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>>[<<<>>>-<<<>>>>>>>>>>>>+<<<<<<<<<<<<>>>]<<<<<<<<<<<<>]<>>>[<<<>>>-<<<>>>>>>>>>>>>+<<<<<<<<<<<<>>>]<<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>[<<<<>>>>-<<<<+>[<->-<<<<<<<<<<>>>>+<<<<>>>>>>>>>>]<[->+<]>>>>]<<<<>[<>-<>>>>+<<<<>]<+<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<<<<<]>>>>>>>>>[-+>>>[-<<<->>>]+<<<[->>>-<<<>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<<<<>>>[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]<<<<<<<[->+>>>-<<<<]>>>>>>>>>++++++++++++++++++++++++++<<>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>[-]<<]>>[<<<<<<<+<[-<+>>>>+<<[-]]>[-><<<[->+>>>-<<<<]>>>]>>>>>>>>>>>>>[>>[-]<<>>>[-]<<<>>>>[-]<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]<<<>>>>>>>>>[>>>>>[-<<<<<>+<>>>>>]<<<<<>[-<>>>>>+<<<<<>>+<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>[-<<<<<<<<<+>>>>>>>>>]<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>>[-<<<<<<>+<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<[->>[-<<+>>]<<[->>+<<>>>+<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>]<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>[<<<>>>-<<<+>[<->-<<<<<<<<<<>>>+<<<>>>>>>>>>>]<[->+<]>>>]<<<>[<>-<>>>+<<<>]<+<<<<<<<<<]>>>>>>>>>[>>>>>>[-<<<<<<>+<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<>>+<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>>[-<<<<<<>+<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<[->>[-<<+>>]<<[->>+<<>>>>+<<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>]<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>[<<<<>>>>-<<<<+>[<->-<<<<<<<<<<>>>>+<<<<>>>>>>>>>>]<[->+<]>>>>]<<<<>[<>-<>>>>+<<<<>]<+<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[>>>>>>>>[-<<<<<<<<>+<>>>>>>>>]<<<<<<<<>[-<>>>>>>>>+<<<<<<<<>>+<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[-]<<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>+<<<<>>>>>[<<<<<>>>>>-<<<<<>>>>-<<<<+>>>>>]<<<<<>>>>>>[<<<<<<>>>>>>-<<<<<<[->>>>>+<<<<<>>>>+<<<<>>>>+<<<<]>>>>>[<<<<<>>>>>-<<<<<+>>>>>]<<<<<>>>>-<<<<>>>>>+<<<<<>>>>>>]<<<<<<>>>>>[<<<<<>>>>>-<<<<<>>>>>>+<<<<<<>>>>>]<<<<<[->>>>>+<<<<<]>>>>>>[-]<<<<<<+>>>>[-<<<<->>>>]+<<<<[->>>>-<<<<>>>>>>>>>[-+>>[-<<->>]+<<[->>-<<>>>[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>>[-<<<->>>]+<<<[->>>-<<<>>[-<<+>>]<<[->>+<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>>>>>>>>[>+<>>>[-<<<>-<>>>]<<<>[-<>>>+<<<>]<>>>>>>>>>]<<<<<<<<<>+<[>[-<>>>>>>+<<<<<<>>[-<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>>[-<<<>>>>>>+<<<<<<>>>]<<<>>]<<>>>[-<<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>]<>>[-<<>>>>>>+<<<<<<>>>[-<<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>>]<<>>>[-<<<>>>>>>+<<<<<<>>>]<<<<<<<<<<<<]>>>>[-]<<<<]>>>[-<<<+>>>]<<<[->>>+<<<>>>>>>>>>[>+<>>[-<<>-<>>]<<>[-<>>+<<>]<>>>>>>>>>]<<<<<<<<<>+<[>[-<>>>>>>+<<<<<<>>>[-<<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>[-<<>>>>>>+<<<<<<>>]<<>>>]<<<>>[-<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>]<<>]<>>>[-<<<>>>>>>+<<<<<<>>[-<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>]<<>>>]<<<>>[-<<>>>>>>+<<<<<<>>]<<<<<<<<<<<]>>>>>>+<<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[-<>>>>>>+<<<<<<>>[-<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>>[-<<<>>>>>>+<<<<<<>>>]<<<>>]<<>>>[-<<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>]<>>[-<<>>>>>>+<<<<<<>>>[-<<<>>>>>>-<<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>>]<<>>>[-<<<>>>>>>+<<<<<<>>>]<<<<<<<<<<<<]]>[-]<>>>[-]<<<>>>>[-]<<<<>>>>>>>>>[>>[-]<<>>>[-]<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-<<<<<>+<>>>>>]<<<<<>[-<>>>>>+<<<<<>>+<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>[-<<<<<>+<>>>>>]<<<<<>[-<>>>>>+<<<<<[->>[-<<+>>]<<[->>+<<>>>+<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>]<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>[<<<>>>-<<<+>[<->-<<<<<<<<<<>>>+<<<>>>>>>>>>>]<[->+<]>>>]<<<>[<>-<>>>+<<<>]<+<<<<<<<<<]>>>>>>>>>[>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>[-]<<<<<>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[-+>>>[-<<<->>>]+<<<[->>>-<<<>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<<<<>>>[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-<<<+>>>]<<<[->>>+<<<>>>>>>>>>[>+<>>>>[-<<<<>-<>>>>]<<<<>[-<>>>>+<<<<>]<>>>>>>>>>]<<<<<<<<<>+<[>[-<>>+<<>>>[-<<<>>-<<><<<<<<<<<+>>>>>>>>><>>>>[-<<<<>>+<<>>>>]<<<<>>>]<<<>>>>[-<<<<>>-<<><<<<<<<<<+>>>>>>>>><>>>>]<<<<>]<>>>[-<<<>>+<<>>>>[-<<<<>>-<<><<<<<<<<<+>>>>>>>>><>>>>]<<<<>>>]<<<>>>>[-<<<<>>+<<>>>>]<<<<<<<<<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>>>>>>>>[>+<>>>[-<<<>-<>>>]<<<>[-<>>>+<<<>]<>>>>>>>>>]<<<<<<<<<>+<[>[-<>>+<<>>>>[-<<<<>>-<<><<<<<<<<<+>>>>>>>>><>>>[-<<<>>+<<>>>]<<<>>>>]<<<<>>>[-<<<>>-<<><<<<<<<<<+>>>>>>>>><>>>]<<<>]<>>>>[-<<<<>>+<<>>>[-<<<>>-<<><<<<<<<<<+>>>>>>>>><>>>]<<<>>>>]<<<<>>>[-<<<>>+<<>>>]<<<<<<<<<<<<]>>>>>+<<<<<]>>>>>>>>>[>>>[-]<<<>>>>[-]<<<<>>>>>[-]<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]<<<>>>>[-]<<<<>>>>>>>>>[>>>>>>>[-<<<<<<<>+<>>>>>>>]<<<<<<<>[-<>>>>>>>+<<<<<<<>>>+<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>+<<<<>>>>>[<<<<<>>>>>-<<<<<>>>>-<<<<+>>>>>]<<<<<>>>>>>>[<<<<<<<>>>>>>>-<<<<<<<[->>>>>+<<<<<>>>>+<<<<>>>>+<<<<]>>>>>[<<<<<>>>>>-<<<<<+>>>>>]<<<<<>>>>-<<<<>>>>>+<<<<<>>>>>>>]<<<<<<<>>>>>[<<<<<>>>>>-<<<<<>>>>>>>+<<<<<<<>>>>>]<<<<<[->>>>>+<<<<<]+>>>>[-<<<<->>>>]+<<<<[->>>>-<<<<>>>>>>>>>[-+>>>[-<<<->>>]+<<<[->>>-<<<>>[-<<+>>]<<[->>+<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>[-<<->>]+<<[->>-<<>>>[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-<<<+>>>]<<<[->>>+<<<>>>>>>>>>[>+<>>[-<<>-<>>]<<>[-<>>+<<>]<>>>>>>>>>]<<<<<<<<<>+<[>[-<>>>>>+<<<<<>>>[-<<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>[-<<>>>>>+<<<<<>>]<<>>>]<<<>>[-<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>]<<>]<>>>[-<<<>>>>>+<<<<<>>[-<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>]<<>>>]<<<>>[-<<>>>>>+<<<<<>>]<<<<<<<<<<<]>>>>>[-]<<<<<>>>>>>>[<<<<<<<>>>>>>>-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<>>>>>+<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>>>>>>>>[>+<>>>[-<<<>-<>>>]<<<>[-<>>>+<<<>]<>>>>>>>>>]<<<<<<<<<>+<[>[-<>>>>>+<<<<<>>[-<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>>[-<<<>>>>>+<<<<<>>>]<<<>>]<<>>>[-<<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>]<>>[-<<>>>>>+<<<<<>>>[-<<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>>]<<>>>[-<<<>>>>>+<<<<<>>>]<<<<<<<<<<<<]]>>>>[-]<<<<]>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>>>>[-]<<<<<>>>>>>>[<<<<<<<>>>>>>>-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<>>>>>+<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[-<>>>>>+<<<<<>>[-<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>>[-<<<>>>>>+<<<<<>>>]<<<>>]<<>>>[-<<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>]<>>[-<<>>>>>+<<<<<>>>[-<<<>>>>>-<<<<<><<<<<<<<<+>>>>>>>>><>>>]<<<>>]<<>>>[-<<<>>>>>+<<<<<>>>]<<<<<<<<<<<<]]>>>>>>>>>[>>[-]<<>>>[-]<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]<<<>>>>[-]<<<<>>>>>>>>>[>>>>>[-<<<<<>+<>>>>>]<<<<<>[-<>>>>>+<<<<<>>+<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[-<<<<<<>+<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<>>>+<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>[-<<<<<>+<>>>>>]<<<<<>[-<>>>>>+<<<<<[->>[-<<+>>]<<[->>+<<>>>>+<<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>]<>>[<<>>-<<>>>>>>>>>>>+<<<<<<<<<<<>>]<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>[<<<<>>>>-<<<<+>[<->-<<<<<<<<<<>>>>+<<<<>>>>>>>>>>]<[->+<]>>>>]<<<<>[<>-<>>>>+<<<<>]<+<<<<<<<<<]>>>>>>>>>[>+<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>-<>>>>>>[-<<<<<<>+<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<[->>>[-<<<+>>>]<<<[->>>+<<<>>>>+<<<<]+>>>>>>>>>]><<<<<<<<<[<<<<<<<<<]<>]<>>>>>>>>>>[>>>>>>>>>]<<<<<<<<<<>[<>>>[<<<>>>-<<<>>>>>>>>>>>>+<<<<<<<<<<<<>>>]<<<<<<<<<<<<>]<>>>[<<<>>>-<<<>>>>>>>>>>>>+<<<<<<<<<<<<>>>]<<<<<<<<<<<<>>>>>>>>>>+<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>[<<<<>>>>-<<<<+>[<->-<<<<<<<<<<>>>>+<<<<>>>>>>>>>>]<[->+<]>>>>]<<<<>[<>-<>>>>+<<<<>]<+<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++++++++++-[[>>>>>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<<<<<]>>>>>>>>>[-+>>>[-<<<->>>]+<<<[->>>-<<<>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<<<<>>>[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>-<<>>>>[-<<<<+>>>>]<<<<[->>>>+<<<<>>[-]<<]>>]<<+>>>>[-<<<<->>>>]+<<<<[->>>>-<<<<<<.>>]>>>>[<<<<>>>>-<<<<<<<.>>>>>>>]<<<<>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<>>>>>>>>>[>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-]<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>++++++++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>+<<<<<>>>>>>>>>>>>>>+<<<<<<<<<<<<<<[<<<<<<<<<]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<>>>>>>>[-]<<<<<<<>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>>>>>>>[-<<<<<<<>+<>>>>>>>]<<<<<<<>[-<>>>>>>>+<<<<<<<[<<<<<<<<<]>>>>>>>[-]+<<<<<<<>>>>>>>>>>]<<<<<<<<<<]]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<>>>>>>>>>[>+<>>>>>[-<<<<<>-<>>>>>]<<<<<>[-<>>>>>+<<<<<>]<>>>>>>>>>]<<<<<<<<<>>>>>>>+<<<<<<<[>>>>>[<<<<<>>>>>-<<<<<>>>>>>>+<<<<<<<>>>>>]<<<<<<<<<<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[-]<->>>>>>>[<<<<<<<>>>>>>>-<<<<<<<+>[<->-<<<<<<<<<<>>>>>>>+<<<<<<<>>>>>>>>>>]<[->+<]>>>>>>>]<<<<<<<>[<>-<>>>>>>>+<<<<<<<>]<+<<<<<<<<<]>>>>>>>-<<<<<<<>>>[-]+<<<]+>>>>>>>[-<<<<<<<->>>>>>>]+<<<<<<<[->>>>>>>-<<<<<<<>>>>>>>>>[>>>>>[<<<<<>>>>>-<<<<<>>>>>>>+<<<<<<<>>>>>]<<<<<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>>>>[<<<<<<<>>>>>>>-<<<<<<<+>[<->-<<<<<<<<<<>>>>>>>+<<<<<<<>>>>>>>>>>]<[->+<]>>>>>>>]<<<<<<<>[<>-<>>>>>>>+<<<<<<<>]<+<<<<<<<<<]>+++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>+<<<<<[<<<<<<<<<]>>>>>>>>>[-+>>>>>[-<<<<<->>>>>]+<<<<<[->>>>>-<<<<<>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>>>>>>[-<<<<<<<->>>>>>>]+<<<<<<<[->>>>>>>-<<<<<<<>>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<<>+++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>-<<<<<[<<<<<<<<<]]>>>]<<<<.>>>>>>>>>>[>>>>>>[-]<<<<<<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>+++++++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>>+<<<<<<>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<>>>>>>>>[-]<<<<<<<<>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>>>>>>>>[-<<<<<<<<>+<>>>>>>>>]<<<<<<<<>[-<>>>>>>>>+<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+<<<<<<<<>>>>>>>>>>]<<<<<<<<<<]]>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<>>>>>>>>>[>+<>>>>>>[-<<<<<<>-<>>>>>>]<<<<<<>[-<>>>>>>+<<<<<<>]<>>>>>>>>>]<<<<<<<<<>>>>>>>>+<<<<<<<<[>>>>>>[<<<<<<>>>>>>-<<<<<<>>>>>>>>+<<<<<<<<>>>>>>]<<<<<<<<<<<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[-]<->>>>>>>>[<<<<<<<<>>>>>>>>-<<<<<<<<+>[<->-<<<<<<<<<<>>>>>>>>+<<<<<<<<>>>>>>>>>>]<[->+<]>>>>>>>>]<<<<<<<<>[<>-<>>>>>>>>+<<<<<<<<>]<+<<<<<<<<<]>>>>>>>>-<<<<<<<<>>>[-]+<<<]+>>>>>>>>[-<<<<<<<<->>>>>>>>]+<<<<<<<<[->>>>>>>>-<<<<<<<<>>>>>>>>>[>>>>>>[<<<<<<>>>>>>-<<<<<<>>>>>>>>+<<<<<<<<>>>>>>]<<<<<<>>>>>>>>>]<<<<<<<<<[>[-]<->>>>>>>>[<<<<<<<<>>>>>>>>-<<<<<<<<+>[<->-<<<<<<<<<<>>>>>>>>+<<<<<<<<>>>>>>>>>>]<[->+<]>>>>>>>>]<<<<<<<<>[<>-<>>>>>>>>+<<<<<<<<>]<+<<<<<<<<<]>+++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>>+<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<[<<<<<<<<<]>>>>>>>>>[-+>>>>>>[-<<<<<<->>>>>>]+<<<<<<[->>>>>>-<<<<<<>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+<<<<>>>>>>>>>[>>>>>>>>>]>+<]]+>>>>>>>>[-<<<<<<<<->>>>>>>>]+<<<<<<<<[->>>>>>>>-<<<<<<<<>>>>>>[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+<<<>>>>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<<>]<>>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<<>+++++<>[<>-<>[<>-<>>>>>>>>>>+<<<<<<<<<<>]<>>>>>>>>>>]<>>>>>>-<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<<<<<<]]>>>]<<<"

hanoi = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------.---------------------------------------------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------.++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------.+++++++++.---------.+++++.+++++++++++++++++.++++++++++++.+++++++++++++++++++++++++++.++++++++.------------------.+++++++++++++.+.-----------------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------.----------------------------------------------------------------------.++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++.+++++++++++++.+.------.-------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++.------------------------------------------------------------------------------.++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++.[-]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.----------------------------------------.++++++++.----------.++++.+++++++++++++++++++.+++++++++++++++.+++++++++++++++++++++++++++.---------.+++++++++++..---------------.+++++++++.------------------------------------------------------------------------------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++.-----------------------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++.---.---..+++++++++.+++.--------------.--------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.---.------.----------------------------------------------------------------------.++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++.++++++++++++..----.------------------------------------------------------.-----------..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...-------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++.---.---..+++++++++.+++.--------------.------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++.---------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++.++++.---.+++++++++++++.+++++.----------------------------------------------------------------------.+++++++++++++++.[-]>+++++++++>+++>>++++++++++[->>>+<<<]>>>[-<<<+>>+>]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[>[-]+++++++++++++++++++++++++++++++++++++++++++++<<<<[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]<+++++++++++++++++++++++++++++++++++++++++++>]<<<[>>>[-]<<<[->>>+<<<]>>>[[-<<<+>>>]<<<->>>]++++++++++++++++>[-]++++++++++++++>>>>>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>[-]>[-<<<<<<<<<<+>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<+++++>>>>]>+<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>[-]>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<++++++++++>>>]+++++++++++++++++++++++++>>[-]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>[-]>[-<<<<<<<<<+>>>>>>>>+>]<[<[->>+<<]>>[-<<+<<+>>>>]<-]<[-]<<[->>+<<]>>[-<<+<<+>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>->>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>->>>>]>++>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<----->>>>]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+>>>>>>->>>]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<<<[->>>>>+<<<<<]>>>>[-]>[-<<<<<+>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<--------------------------------.>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<+++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>[-]>>[-<<<<<<<<+>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]<<<.<<<[->>>>>>>>+<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<]>>>[-]<<<<<[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]>[-]<<<<<[->>>>>+<<<<<]>>>>>[-<<<<<+<<<+>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>]<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]<<<<<->>>>>]<]<<<<<+>>+>>[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]<<<[-]>+>[-]++>++++++++>[-]+>+[>>>++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>[-]>[-<<<<<<+>>>>>+>]>[-]<<<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[>[-]<<<<<[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]>>[-]>>>+<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>>>>[-]<<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<+>+>>]>[-]+++<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>[-]>[-<<<<<<<<<<<+>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<+>>+>]<<<[->>>+<<<]>>>[[-<<<+>>>]>[-]>>[-]<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>+>]<[<+>-]<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<[<+++>-]<<<<<<<<<<<<[->>>>>>>>>>>>>+<<<<<<<<<<<<<]>>>>>>>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>+>]<[<+++++++++>-]<[->>+<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>>>>+<<<<<<<<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>>>+<<<<<<<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>]<<[->>+<<]>>[[-<<+>>]>[-]<<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>[-]>>>>>>>[-<<<<<<<<<<<<+>>>>>+>>>>>>>]<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]<[-]>>>>>>>>>>>>[-<<<<<<<<<<<+<+>>>>>>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]<<<<[-]>>>>>>>>>>>[-<<<<<<<+<<<<+>>>>>>>>>>>]<<<<<<<<<<->[-]>+>>>>>>>]<[->+<]>[[-<+>]>[-]<<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>[-]>>>>>>>[-<<<<<<<<<<<<+>>>>>+>>>>>>>]<<<<<<<<<<<<<[->>>>>>>>>>>>>+<<<<<<<<<<<<<]>[-]>>>>>>>>>>>>[-<<<<<<<<<<<<<+>+>>>>>>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]<<<<<<[-]>>>>>>>>>>>>>[-<<<<<<<+<<<<<<+>>>>>>>>>>>>>]<<<<<<<<<<->[-]>+>>>>>>>]<<<<]>[-]++>>[-]<<<<<<<[->>>>>>>+<<<<<<<]>>>>>>[-]>[-<<<<<<<+>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>>>>[-]<<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>>>>++<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<]>+<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<]>[-]++>>[-]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<]>[-]>>[-]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>+>>>>>]<]>+<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>]<]>[-]++>>[-]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>]<]>[-]>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<[->>>>>+<<<<<]<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>[-<<<<<+<<<<<<<<<<<+>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>+<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<[->>>>>+<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>[-]++>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<[->>>>>+<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>[-]>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>]<]>+<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>]<]>[-]++>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>]<]<[->>>>[-]<<<<[->>>>+<<<<]>>>>>[-]+<[[-<<<<+>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>[-]>>>>[-<<<<<<<<+>>>>+>>>>]<<<++++++++++++++++++++++++++++++++>>-<]>[[-]<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>+>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]>>>[-]>>>>[-<<<<<<<+>>>+>>>>]<<<[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>]<++++++++++++++++>++++++++++++++>>>>>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<+++++>>>>]>+<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>[-]>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<++++++++++>>>]+++++++++++++++++++++++++>>[-]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>[-]>[-<<<<<<<<<+>>>>>>>>+>]<[<[->>+<<]>>[-<<+<<+>>>>]<-]<[-]<<[->>+<<]>>[-<<+<<+>>>>]<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>->>>>]<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>->>>>]>++>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<----->>>>]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>->>>]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<<<[->>>>>+<<<<<]>>>>[-]>[-<<<<<+>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<--------------------------------.>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<+++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>[-]>>[-<<<<<<<<<<<+>>>>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]<<<.<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<<]>[-]++++++++++.[-]+>[-]+>[-]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>>[-]<<<[->>>+<<<]>>[-]>[-<<<+>>+>]>>>++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]++++++++++[-]++++++++++[-]>+[[-]>>+[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<--------------------------------.>>[-]<<<<[->>>>+<<<<]>>>>[-<<<<+>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]++++++++++[-]++++++++++[-]>+[[-]>>+[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<+++++++++++++.<<[-]>[-]>[-]<<<<<<<]<<<<+>>>>++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>[-]>[-<<<<<<+>>>>>+>]>[-]<<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]<<-[->>+<<]>>[[-<<+>>]<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<<<<<<<[-]>[-]>>>>>>>++++++++[->>+<<]>>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[<<<<<<<<--------->>+>>>>>>>[-]++++++++>>[-]<<[->>+<<]>>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]>[-]++[->>+<<]>[-]>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[<<<<<<<<--->+>>>>>>>>[-]++>>[-]<<[->>+<<]>>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]<<<<+>>>]<<]>>>>>>>>>>>>>>>>>>>>>>>>"


text:
export Parser

type Parser
    worddict::IdDict{String}
    catdict::IdDict{String}
    model
end

function Parser()
    worddict = IdDict{String}()
    catdict = IdDict{String}()
    Parser(worddict, catdict, nothing)
end

function train(p::Parser)
    trainconll = CoNLL.read("C:/Users/hshindo/Dropbox/tagging/wsj_22-24.conll", 2, 5, 7)
    traindata::Vector{State} = map(trainconll) do sent
        map(sent) do x
            form0 = replace(x[1], r"[0-9]", '0') |> lowercase
            form = push!(p.worddict, form0)
            cat = push!(p.catdict, x[2])
            head = parse(Int, x[3])
            Token(form, cat, head)
        end
    end

    for epoch = 1:10
        for i = 1:length(traindata)
            map(x -> beamsearch(1, x), traindata)
        end
    end
end

ext: jl


text:
module MetLP

    using ProgressMeter
    using Base.Threads
    using SparseArrays

    import MetNets
    import MetNets: metindex, rxnindex,
        MetNet, IDER_TYPE, AbstractMetState,
        del_blocked, bounds, fixxing
    import JuMP, Clp

    include("FBAOut.jl")
    include("getters.jl")
    include("summary.jl")
    include("base.jl")
    include("const.jl")
    include("utils.jl")
    include("fba.jl")
    include("fba_lp_model.jl")
    include("fva.jl")
    include("fva_preprocess.jl")
    include("check_newbounds.jl")
    include("projection2D.jl")
    # include("yLP.jl")

end


text:
using Documenter, ForneyLab

ENV["GKS_ENCODING"] = "utf-8"
ENV["GKSwstype"] = "100"

makedocs(modules = [ForneyLab],
    clean = true,
    sitename = "ForneyLab.jl",
    pages = [
        "Home" => "index.md",
        "Getting started" => "getting-started.md",
        "User guide" => "user-guide.md",
        "Library" => Any[
            "User API" => "library/user-api.md",
            "Developer API" => "library/developer-api.md"
        ],
        "Contributing" => "contributing.md",
        "Internals" => "internals.md"
    ],
    format = Documenter.HTML(
        assets = [
            joinpath("assets", "favicon.ico"),
        ],
        prettyurls = get(ENV, "CI", nothing) == "true"
    )
)

if get(ENV, "CI", nothing) == "true"
    deploydocs(
        repo = "github.com/biaslab/ForneyLab.jl.git"
    )
end


text:
using JuMP, FactCheck, AmplNLWriter

## Solve test problem with non-linear binary variables
 #
 #  min   100 * (x2 - (0.5 + x1) ^ 2) ^ 2 + (1 - x1) ^ 2
 #  s.t.  x1, x2 binary
 #
 #  The solution is (0, 0).
 ##

if !isdefined(:solver); solver = BonminNLSolver(); end

m = Model(solver=solver)
@variable(m, x[1:2], Bin)

# Set some non-binary bounds on x1 and x2. These should be ignored.
# The optimal solution if x is Int is (1, 2) which is allowed by these bounds
setupperbound(x[1], 2)
setupperbound(x[2], 2)

@NLobjective(m, Min, 100*(x[2] - (0.5 + x[1])^2)^2 + (1 - x[1])^2)

context("example: jump_nonlinearbinary") do
    @fact solve(m) --> :Optimal
    @fact getvalue(x)[:] --> [0.0, 0.0]
    @fact getobjectivevalue(m) --> 7.25
end


text:
# """
# Creates a callback function for the GlobalModel.
# """
function gm_user_cuts(gm::GlobalModel)
    M=1e5
    for bbl in gm.bbls
        if bbl isa BlackBoxClassifier & !bbl.equality
            varvals = DataFrame(JuMP.callback_value(cb_data, bbl.vars), string.(bbl.vars))
            eval!(bbl, val_vals)
            if bbl.Y[end] <= -1*get_param(gm, :tighttol)
                update_gradients(bbl, [size(bbl.X, 1)])
                leaf = IAI.apply(bbl.learners[end], varvals)
                leaf_var = bbl.leaf_variables[leaf[1]]
                con = JuMP.build_constraint(sum(Array(bbl.gradients[end]) .* (bbl.vars .- Array(var_vals)))  +
                                            bbl.Y[end] + M * (1 - leaf_var) >= 0)
                push!(bbl.mi_constraints[leaf[1]], con)
                MOI.submit(gm.model, MOI.UserCut(cb_data), con)
            end
        end
    end
    return
end

# function add_convex_callback(gm::GlobalModel, bbc::BlackBoxClassifier, tighttol = get_param(gm, :tighttol))
#     cvx_cb = let bbc = bbc, gm = gm, tighttol = tighttol
#         function cvx_callback(cb_data)
#             varvals = [JuMP.callback_value(cb_data, var) for var in bbc.vars]
#             eval!(bbc, DataFrame(varvals, string.(bbc.vars)))
#             if bbc.Y[end] <= -tighttol
#                 update_gradients(bbc, [size(bbr.X,1)])
#                 con = @build_constraint(0 >= bbc.Y[end]  -
#                                          sum(Array(bbc.gradients[end,:]) .* (bbc.vars .- varvals)))
#                 MOI.submit(gm.model, MOI.UserCut(cb_data), con)
#             end
#         end
#     end
#     MOI.set(gm.model, MOI.UserCutCallback(), cvx_cb)
# end

# gm = test_gqp()
# set_optimizer(gm, CPLEX_SILENT)
# # set_optimizer(gm.model, Gurobi.Optimizer)
# # set_optimizer_attribute(gm.model, "LazyConstraints", 1)
# # set_optimizer(gm.model, CPLEX.Optimizer)
# bbr = gm.bbls[1]
# set_param(bbr, :n_samples, 100)
# uniform_sample_and_eval!(gm)
# update_vexity(bbr)
# add_tree_constraints!(gm, bbr)
# # optimize!(gm)

# tighttol = get_param(gm, :tighttol)

# function add_convex_callback(gm::GlobalModel, bbr::BlackBoxRegressor, tighttol = get_param(gm, :tighttol))
#     cvx_cb = let bbr = bbr, gm = gm, tighttol = tighttol
#         function (cb_data)
#             # varvals = [MOI.get(gm.model.moi_backend.optimizer,
#             #                    MOI.CallbackVariablePrimal(cb_data), var) for var in bbr.vars]
#             varvals = [JuMP.callback_value(var) for var in bbr.vars]
#             # varvals = [JuMP.getvalue(var) for var in bbr.vars]
#             # dep_var = MOI.get(gm.model.moi_backend.optimizer,
#             #                   MOI.CallbackVariablePrimal(cb_data), bbr.dependent_var)
#             dep_var = JuMP.callback_value(bbr.dependent_var)
#             # dep_var = JuMP.getvalue(bbr.dependent_var)
#             eval!(bbr, DataFrame(string.(bbr.vars) .=> varvals))
#             if dep_var <= bbr.Y[end] - tighttol
#                 update_gradients(bbr, [size(bbr.X,1)])
#                 con = @build_constraint(bbr.dependent_var >= bbr.Y[end] +
#                                          sum(Array(bbr.gradients[end,:]) .* (bbr.vars .- varvals)))
#                 # JuMP.add_constraint(gm.model, con)
#                 # MOI.submit(gm.model, MOI.LazyConstraint(cb_data), con.func, con.set)
#                 MOI.submit(gm.model, MOI.LazyConstraint(cb_data), con)
#             end
#         end
#     end
#     MOI.set(gm.model, MOI.LazyConstraintCallback(), cvx_cb)
# end

# add_convex_callback(gm, bbr)
# optimize!(gm)

# using JuMP
# using Gurobi
# m = Model(Gurobi.Optimizer)
# @variable(m, x >= 1)
# @objective(m, Min, x)
# # optimize!(m)

# function cb_fn(cb_data)
#     val = JuMP.callback_value(x)
#     con = @build_constraint(x >= 2)
#     MOI.submit(m, MOI.LazyConstraint(cb_data), con)
# end
# MOI.set(m, MOI.LazyConstraintCallback(), cb_fn)
# optimize!(m)

# TYPES OF ERRORS
    # With GUROBI:
        # ERROR: Cannot use Gurobi.CallbackFunction as well as MOI.AbstractCallbackFunction
        # Why does it think that there are two kinds of callbacks?
        # Check gm.model.moi_backend.optimizer.model.generic_callback
        # And gm.model.moi_backend.optimizer.model.lazy_callback being both full!
    # WITH CPLEX:
        # ERROR: CPLEX Error  1811: Attempt to invoke unsupported operation..

# Other questions
    # How to remove a callback once it's added?

# function gm_callback(gm::GlobalModel)
#     sol_leaves = find_leaf_of_soln.(gm.bbls)
#     var_vals = solution(gm)
# for i=1:length(gm.bbls)
#     if gm.bbls[i] isa BlackBoxClassifier && gm.feas_history[end][i] != 0 && !gm.bbls[i].equality
#         bbl = gm.bbls[i]
#         rel_vals = var_vals[:, string.(bbl.vars)]
#         eval!(bbl, rel_vals)
#         Y = bbl.Y[end]
#         update_gradients(bbl, [size(bbl.X, 1)])
#         cut_grad = bbl.gradients[end, :]
#         push!(bbl.mi_constraints[sol_leaves[i]],
#             @constraint(gm.model, sum(Array(cut_grad) .* (bbl.vars .- Array(rel_vals))) + Y >= 0))
#     end
#     # TODO: add infeasibility cuts for equalities as well.
# end

# gm = nlp1(true)
# uniform_sample_and_eval!(gm)
# learn_constraint!(gm)
# add_tree_constraints!(gm)
# optimize!(gm)
# bbrs = [bbl in gm.bbls if bbl isa BlackBoxRegressor]
# bbls = [bbl in gm.bbls if bbl isa BlackBoxClassifier]

# update_vexity(gm.bbls[1])

    # cvx_cb = let bbr = bbr, gm = gm, tighttol = tighttol
    #     function cvx_cb(cb_data)
    #         status = JuMP.callback_node_status(cb_data, gm.model)
    #         # if status == MOI.CALLBACK_NODE_STATUS_FRACTIONAL
    #         #     return
    #         # elseif status == MOI.CALLBACK_NODE_STATUS_INTEGER
    #         # else
    #         #     @assert status == MOI.CALLBACK_NODE_STATUS_UNKNOWN
    #         # end
    #         varvals = [JuMP.callback_value(cb_data, var) for var in bbr.vars]
    #         # varvals = JuMP.getvalue.(bbr.vars)
    #         dep_var = JuMP.callback_value(bbr.dependent_var)
    #         # dep_var = JuMP.getvalue(bbr.dependent_var)
    #         dat = DataFrame(string.(bbr.vars) .=> varvals)
    #         val = bbr(dat)[1]
    #         if dep_var <= 11. #val - tighttol
    #             grad = Array(evaluate_gradient(bbr, dat))
    #             con = @build_constraint(bbr.dependent_var >= bbr.Y[end]  +
    #                                      sum(grad .* (bbr.vars .- varvals)))
    #             MOI.submit(gm.model, MOI.LazyConstraint(cb_data), con)
    #         end
    #         return
    #     end
    # # end
    # MOI.set(gm.model, MOI.RawParameter("LazyConstraints"), 1)
    # MOI.set(gm.model, MOI.LazyConstraintCallback(), cvx_cb)


text:
using KhepriUnity
using Test

@testset "KhepriUnity.jl" begin
    # Write your tests here.
end


text:
function State_Setup(config_file="")
  return ccall((:State_Setup, spiritlib),  Ptr{Void}, (Cstring,), config_file)
end

max_stars_repo_name: ddkn/spirit

max_issues_repo_name: ddkn/spirit

max_forks_repo_name: ddkn/spirit


text:
# main file of Variational Autoencoder
# based on Auto-Encoding Variational Bayes by D. Kingma and M. Welling ([K&W])
# https://arxiv.org/abs/1312.6114
# see also http://vdumoulin.github.io/morphing_faces/
# see also https://jmetzen.github.io/2015-11-27/vae.html

using Distributions
using GradDescent
using MLDataUtils
using StatsBase
using Milk
using XGrad

# logistic(x) = 1 ./ (1 + exp.(-x))
# @diffrule logistic(x::Number) x (logistic(x) .* (1 .- logistic(x)) .* ds)

include("model.jl")
# include("modelopt.jl")

model_params(m) = [getfield(m, f) for f in fieldnames(m)]
model_named_params(m) = [f => getfield(m, f) for f in fieldnames(m)]

# function xavier_init(dim_in, dim_out; c=1)
#     low = -c * sqrt(6.0 / (dim_in + dim_out))
#     high = c * sqrt(6.0 / (dim_in + dim_out))
#     return rand(Uniform(low, high), dim_in, dim_out)
# end

function StatsBase.fit!(m::VAE{T}, X::AbstractMatrix{T};
              n_epochs=10, batch_size=100, opt=Adam(α=0.001), cuda=false) where T
    mem = Dict()
    m_opt = ModelOptimizer(typeof(m), opt)
    for epoch in 1:n_epochs
        print("Epoch $epoch: ")
        epoch_cost = 0
        t = @elapsed for (i, x) in enumerate(eachbatch(X, size=batch_size))
            if cuda
                x = to_cuda(x)
            end
            eps = typeof(x)(rand(Normal(0, 1), size(m.We3, 1), batch_size))
            cost, dm, deps, dx = xgrad(vae_cost, mem=mem, m=m, eps=eps, x=x)
            update_params!(m_opt, m, dm)
            epoch_cost += cost
        end
        println("avg_cost=$(epoch_cost / (size(X,2) / batch_size)), elapsed=$t")
    end
    return m
end

function generate(m::VAE, z::AbstractVector)
    return decode(m, z)
end

function generate(m::VAE, id::Int)
    z = zeros(size(m.Wd1, 2))
    z[id] = 1.0
    hd1 = tanh.(m.Wd1 * z .+ m.bd1)
    hd2 = tanh.(m.Wd2 * hd1 .+ m.bd2)
    return logistic.(m.Wd3 * hd2 .+ m.bd3)
end

function reconstruct(m::VAE, x::AbstractVector)
    x = reshape(x, length(x), 1)
    mu, _ = encode(m, x)
    z = mu
    x_rec = decode(m, z)
    return x_rec
end


text:
using Test
using MPI
using CLIMA
using CLIMA.Mesh.Topologies
using CLIMA.Mesh.Grids
using CLIMA.Mesh.Grids: VerticalDirection, HorizontalDirection, EveryDirection
using CLIMA.VTK
using Logging
using Printf
using LinearAlgebra
using CLIMA.DGmethods: DGModel, init_ode_state, LocalGeometry, courant
using CLIMA.DGmethods.NumericalFluxes: Rusanov, CentralNumericalFluxGradient,
                                       CentralNumericalFluxDiffusive
using CLIMA.Courant
using CLIMA.PlanetParameters: kappa_d
using CLIMA.Atmos: AtmosModel,
                   AtmosAcousticLinearModel, RemainderModel,
                   FlatOrientation,
                   NoReferenceState, ReferenceState,
                   DryModel, NoRadiation, PeriodicBC, NoPrecipitation,
                   Gravity, HydrostaticState, IsothermalProfile,
                   ConstantViscosityWithDivergence, vars_state, soundspeed
using CLIMA.Atmos
using CLIMA.ODESolvers
const ArrayType = CLIMA.array_type()

using CLIMA.MoistThermodynamics: air_density, total_energy, internal_energy,
                                 soundspeed_air

using CLIMA.VariableTemplates: Vars
using StaticArrays

function initialcondition!(bl, state, aux, coords, t)
    FT = eltype(state)

    p∞::FT = 10 ^ 5
    T∞::FT = 300
    translation_speed::FT = 150
    translation_angle::FT = pi / 4
    α = translation_angle
    u∞ = SVector(translation_speed * coords[1], translation_speed * coords[1], 0)

    u = u∞
    T = T∞
    # adiabatic/isentropic relation
    p = p∞ * (T / T∞) ^ (FT(1) / kappa_d)
    ρ = air_density(T, p)

    state.ρ = ρ
    state.ρu = ρ * u
    e_kin = u' * u / 2
    state.ρe = ρ * total_energy(e_kin, FT(0), T)

    nothing
end

let
    # boiler plate MPI stuff
    CLIMA.init()
    mpicomm = MPI.COMM_WORLD

    # Mesh generation parameters
    N = 4
    Nq = N+1
    Neh = 10
    Nev = 4

    @testset "$(@__FILE__) DGModel matrix" begin
        for FT in (Float64, Float32)
            for dim = (2, 3)
                if dim == 2
                    brickrange = (range(FT(0); length=Neh+1, stop=1),
                                  range(FT(1); length=Nev+1, stop=2))
                elseif dim == 3
                    brickrange = (range(FT(0); length=Neh+1, stop=1),
                                  range(FT(0); length=Neh+1, stop=1),
                                  range(FT(1); length=Nev+1, stop=2))
                end

                topl = StackedBrickTopology(mpicomm, brickrange)

                function warpfun(ξ1, ξ2, ξ3)
                    FT = eltype(ξ1)

                    ξ1 ≥ FT(1//2) && (ξ1 = FT(1//2) + 2(ξ1 - FT(1//2)))
                    if dim == 2
                        ξ2 ≥ FT(3//2) && (ξ2 = FT(3//2) + 2(ξ2 - FT(3//2)))
                    elseif dim == 3
                        ξ2 ≥ FT(1//2) && (ξ2 = FT(1//2) + 2(ξ2 - FT(1//2)))
                        ξ3 ≥ FT(3//2) && (ξ3 = FT(3//2) + 2(ξ3 - FT(3//2)))
                    end
                    return (ξ1, ξ2, ξ3)
                end

                grid = DiscontinuousSpectralElementGrid(topl,
                                                        FloatType = FT,
                                                        DeviceArray = ArrayType,
                                                        polynomialorder = N)
                                                #meshwarp = warpfun)

                model = AtmosModel{FT}(AtmosLESConfiguration;
                                       ref_state=NoReferenceState(),
                                       turbulence=ConstantViscosityWithDivergence(FT(2)),
                                       moisture=DryModel(),
                                       source=Gravity(),
                                       boundarycondition=PeriodicBC(),
                                       init_state=initialcondition!)

                dg = DGModel(model, grid, Rusanov(), CentralNumericalFluxDiffusive(),
                             CentralNumericalFluxGradient())

                Δt = FT(1e-11)#FT(1//2)
                #Δt = FT(0.00001) #FT(1//10)

                Q = init_ode_state(dg, FT(0))
                solver = LSRK54CarpenterKennedy(dg, Q; dt = Δt, t0 = 0)
                solve!(Q, solver; timeend=Δt)
                Δx = min_node_distance(grid, EveryDirection())
                Δx_v = min_node_distance(grid, VerticalDirection())
                Δx_h = min_node_distance(grid, HorizontalDirection())

                T∞ = FT(300)
                translation_speed = FT(212.13203435596427)
                diff_speed_h = 734.8469228349534
                diff_speed_v = 0
                c   = Δt*(translation_speed + soundspeed_air(T∞))/Δx
                c_h = Δt*(translation_speed + soundspeed_air(T∞))/Δx_h
                c_v = Δt*(soundspeed_air(T∞))/Δx_v
                d_h = Δt*diff_speed_h/Δx_h^2
                d_v = Δt*diff_speed_v/Δx_v^2

                if (FT==Float64 && dim == 2)
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, HorizontalDirection()) - c_h) <= 1e-15
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, HorizontalDirection()) - d_h) <= 1e-4
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, VerticalDirection()) - c_v) <= 1e-16
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, VerticalDirection()) - d_v) <= 1e-8
                elseif (FT==Float64 && dim == 3)
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, HorizontalDirection()) - c_h) <= 1e-11
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, HorizontalDirection()) - d_h) <= 1e-4
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, VerticalDirection()) - c_v) <= 1e-11
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, VerticalDirection()) - d_v) <= 1e-8
                elseif (dim == 2)
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, HorizontalDirection()) - c_h) <= 1e-11
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, HorizontalDirection()) - d_h) <= 1e-4
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, VerticalDirection()) - c_v) <= 1e-16
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, VerticalDirection()) - d_v) <= 1e-8
                else
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, HorizontalDirection()) - c_h) <= 1e-11
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, HorizontalDirection()) - d_h) <= 1e-4
                    @test abs(courant(nondiffusive_courant, dg, model, Q, Δt, VerticalDirection()) - c_v) <= 1e-11
                    @test abs(courant(diffusive_courant,    dg, model, Q, Δt, VerticalDirection()) - d_v) <= 2e-8
                end
            end
        end
    end
end

nothing

max_stars_repo_name: favba/CLIMA

max_issues_repo_name: favba/CLIMA

max_forks_repo_name: favba/CLIMA


text:
module timbpMisc

import Base.:-
import Base.:+
import Base.isless
import Base.show
import Base.print
import Dates

using Distributions

export FinancialYear
export controllimits
export agemonths

"""
    FinancialYear

Australian financial year (1 July to 30 June)
"""
struct FinancialYear
  value::Int16
end

"""
    FinancialYear(date::Dates.Date)

Create FinancialYear from Date
"""
function FinancialYear(date::Dates.Date)
  Dates.month(date) in 7:12 ? FinancialYear(Dates.year(date) + 1) : FinancialYear(Dates.year(date))
end

"""
    FinancialYear(date::String)

Create FinancialYear from String by parsing as Date
"""
FinancialYear(date::String) = FinancialYear(Dates.Date(date))

# FinancialYear show/print
function Base.show(io::IO, ::MIME"text/plain", fy::FinancialYear)
  write(io, string(fy.value - 1) * "/" * string(fy.value % 100, pad=2))
end

function Base.print(io::IO, fy::FinancialYear)
  fy.value
end

# FinancialYear arithmetic
(-)(fy::FinancialYear, ffy::FinancialYear) = Dates.Year(fy.value - ffy.value)
(+)(fy::FinancialYear, y::Dates.Year) = FinancialYear(fy.value + y.value % 100)
(-)(fy::FinancialYear, y::Dates.Year) = FinancialYear(fy.value - y.value % 100)

Base.isless(fy::FinancialYear, ffy::FinancialYear) = isless(fy.value, ffy.value)

Base.Broadcast.broadcastable(fy::FinancialYear) = Ref(fy)

"""
    controllimits(p, n, θ)

Calculate Spiegelhalter (2005) control limit for funnel plot.

`p ∈ (0.0, 1.0)`: quantile for the control limit

`n`: sample size (Integer)

`θ ∈ (0.0, 1.0)`: population value

### References

1. Spiegelhalter DJ. Funnel plots for comparing institutional performance.
   Stat Med. 2005;24:1185–202.

"""
function controllimits(p, n, θ)
  r = quantile(Binomial(n, θ), p)
  numerator = cdf(Binomial(n, θ), r) - p
  denominator = cdf(Binomial(n, θ), r) - cdf(Binomial(n, θ), r - 1)
  α = numerator / denominator
  limit = min(1.0, max(0.0, (r - α) / n))
end

"""
    agemonths(dob, date)

Calculate age in whole months from birthdate and date
"""
function agemonths(dob, date)
  y, m, d = Dates.yearmonthday(date) .- Dates.yearmonthday(dob)
  return 12y + m - (d < 0 ? 1 : 0)
end

end


text:
module FinEtoolsFlexStructuresTutorials

end # module


text:
# Autogenerated wrapper script for OCaml_jll for i686-linux-gnu
export ocamlc, ocamlopt

## Global variables
PATH = ""
LIBPATH = ""
LIBPATH_env = "LD_LIBRARY_PATH"
LIBPATH_default = ""

# Relative path to `ocamlc`
const ocamlc_splitpath = ["bin", "ocamlc.opt"]

# This will be filled out by __init__() for all products, as it must be done at runtime
ocamlc_path = ""

# ocamlc-specific global declaration
function ocamlc(f::Function; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true)
    global PATH, LIBPATH
    env_mapping = Dict{String,String}()
    if adjust_PATH
        if !isempty(get(ENV, "PATH", ""))
            env_mapping["PATH"] = string(PATH, ':', ENV["PATH"])
        else
            env_mapping["PATH"] = PATH
        end
    end
    if adjust_LIBPATH
        LIBPATH_base = get(ENV, LIBPATH_env, expanduser(LIBPATH_default))
        if !isempty(LIBPATH_base)
            env_mapping[LIBPATH_env] = string(LIBPATH, ':', LIBPATH_base)
        else
            env_mapping[LIBPATH_env] = LIBPATH
        end
    end
    withenv(env_mapping...) do
        f(ocamlc_path)
    end
end

# Relative path to `ocamlopt`
const ocamlopt_splitpath = ["bin", "ocamlopt.opt"]

# This will be filled out by __init__() for all products, as it must be done at runtime
ocamlopt_path = ""

# ocamlopt-specific global declaration
function ocamlopt(f::Function; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true)
    global PATH, LIBPATH
    env_mapping = Dict{String,String}()
    if adjust_PATH
        if !isempty(get(ENV, "PATH", ""))
            env_mapping["PATH"] = string(PATH, ':', ENV["PATH"])
        else
            env_mapping["PATH"] = PATH
        end
    end
    if adjust_LIBPATH
        LIBPATH_base = get(ENV, LIBPATH_env, expanduser(LIBPATH_default))
        if !isempty(LIBPATH_base)
            env_mapping[LIBPATH_env] = string(LIBPATH, ':', LIBPATH_base)
        else
            env_mapping[LIBPATH_env] = LIBPATH
        end
    end
    withenv(env_mapping...) do
        f(ocamlopt_path)
    end
end

"""
Open all libraries
"""
function __init__()
    global artifact_dir = abspath(artifact"OCaml")

    # Initialize PATH and LIBPATH environment variable listings
    global PATH_list, LIBPATH_list
    # Lastly, we need to add to LIBPATH_list the libraries provided by Julia
    append!(LIBPATH_list, [joinpath(Sys.BINDIR, Base.LIBDIR, "julia"), joinpath(Sys.BINDIR, Base.LIBDIR)])
    global ocamlc_path = normpath(joinpath(artifact_dir, ocamlc_splitpath...))

    push!(PATH_list, dirname(ocamlc_path))
    global ocamlopt_path = normpath(joinpath(artifact_dir, ocamlopt_splitpath...))

    push!(PATH_list, dirname(ocamlopt_path))
    # Filter out duplicate and empty entries in our PATH and LIBPATH entries
    filter!(!isempty, unique!(PATH_list))
    filter!(!isempty, unique!(LIBPATH_list))
    global PATH = join(PATH_list, ':')
    global LIBPATH = join(LIBPATH_list, ':')

    # Add each element of LIBPATH to our DL_LOAD_PATH (necessary on platforms
    # that don't honor our "already opened" trick)
    #for lp in LIBPATH_list
    #    push!(DL_LOAD_PATH, lp)
    #end
end  # __init__()


text:
using DataFrames
using CSV
using StaticArrays
const ℝ = SVector{N,T} where {N,T}

"""
    readData(::Val{true}, filename)

Reads first passage time data from a file `filename` (assumed to be saved in a
correct format---no checks are performed).
"""
function readData(::Val{true}, filename)
    df = CSV.read(filename)
    x0 = ℝ{2}(df.upCross[1], df.x2[1])
    obs = ℝ{1}.(df.upCross)
    obsTime = Float64.(df.time)
    fpt = [FPTInfo((1,), (true,), (resetLvl,), (i==1,)) for
            (i, resetLvl) in enumerate(df.downCross[2:end])]
    fptOrPartObs = FPT()
    df, x0, obs, obsTime, fpt, fptOrPartObs
end

"""
    readData(::Val{false}, filename)

Reads partial observation type data from a file `filename` (assumed to be saved
in a correct format---no checks are performed)
"""
function readData(::Val{false}, filename)
    df = CSV.read(filename)
    obs = ℝ{1}.(df.x1)
    obsTime = Float64.(df.time)
    x0 = ℝ{2}(df.x1[1], df.x2[1])
    fpt = [NaN for _ in obsTime[2:end]]
    fptOrPartObs = PartObs()
    df, x0, obs, obsTime, fpt, fptOrPartObs
end

"""
    savePathsToFile(paths, time, filename)

Put diffusion paths and respective times to a dataframe and save to a file
"""
function savePathsToFile(paths, time, filename)
    idx = collect( Iterators.flatten([fill(i,length(X))
                            for (i,X) in enumerate(paths)]))
    time = collect(Iterators.flatten(fill(time,length(paths))))
    paths = collect(Iterators.flatten(paths))
    numDims = length(paths[1])
    df = DataFrame(idx=idx, time=time)
    for i in 1:numDims
        X = [pt[i] for pt in paths]
        df = hcat(df, X, makeunique=true)
    end
    CSV.write(filename, df)
    df
end

"""
    saveChainToFile(chains, filename)

Save MCMC chain to a file
"""
function saveChainToFile(chains, filename)
    df = DataFrame()
    for i in 1:length(chains[1])
        X = [pt[i] for pt in chains]
        df = hcat(df, X, makeunique=true)
    end
    CSV.write(filename, df)
    df
end

"""
    getunique(xs)

Return the first element, error if other elements are not equal to the first.
"""
function getunique(xs)
      ϕ = iterate(xs)
      if ϕ === nothing
            throw(ArgumentError("empty iterator"))
      end
      x, state = ϕ
      while true
            ϕ = iterate(xs, state)
            ϕ === nothing && return x
            xnew, state = ϕ
            x == xnew || throw(ArgumentError("not all the same"))
      end
end


text:
@testset "modpi" begin
    x=cbrt(41)*sqrt(Double64(pi))

    @test DoubleFloats.mod2pi(x) == Double64(6.111805926475162, -1.667563077572613e-16)
    @test DoubleFloats.mod1pi(x) == Double64(2.9702132728853683, 1.54868222178066e-16)
    # these tests are unusable, sometimes they pass and othertimes they fail
    # @test DoubleFloats.modhalfpi(x) == Double64(1.3994169460904717, 9.362948122802731e-17)
    # @test DoubleFloats.modqrtrpi(x) == Double64(0.6140187826930236, -4.8008991213172176e-17)
end

@testset "rempi" begin
    x=cbrt(41)*sqrt(Double64(pi))

    @test DoubleFloats.rem2pi(x) == Double64(6.111805926475162, -1.667563077572613e-16)
    @test DoubleFloats.rem1pi(x) == Double64(2.9702132728853683, 1.54868222178066e-16)
    @test DoubleFloats.rem2pi(-x) == Double64(-0.1713793807044248, 4.647966647701768e-18)
    @test DoubleFloats.rem1pi(-x) == Double64(2.9702132728853683, 1.54868222178066e-16)
end