module CUDAatomics

using CUDAnative, LLVM
using LLVM.Interop

let type_map = Dict( Int32 => ("u32", "r", "b32", "s32"), UInt32 => ("u32", "r", "b32", "u32"), Int64 => ("u64", "l", "b64", "s64"), UInt64 => ("u64", "l", "b64", "s64"), Float32 => ("f32", "f", "b32", "f32"), Float64 => ("f64", "d", "b64", "f64") ), atomiclist = [("add",2,1), ("exch",2,3), ("min",2,4), ("max",2,4), ("inc",2,1), ("dec",2,1), ("cas",3,3), ("and",2,3), ("or",2,3), ("xor",2,3)]

global @generated function cvt( a::Type{T}, b::U ) where {T,U}
    round_str = ""
    if U==Float32
        if !(T in [Float32, Float64])
            round_str = "rzi."
        end
    elseif U==Float64
        if T==Float32
            round_str = "rn."
        elseif T!=Float64
            round_str = "rzi."
        end
    else
        if T in [Float32,Float64]
            round_str = "rn."
        end
    end

    call_string = string("cvt.",round_str,type_map[T][1],".",type_map[U][1], " \$0, \$1;")
    ex = :(@asmcall)
    append!(ex.args, [call_string, string("=",type_map[T][2],",",type_map[U][2]), false, Symbol(T), :(Tuple{$U}), :b])
    return :(Base.@_inline_meta; $ex)
end

function atomicexpression(instr::String, nargs, typeindex)
    fex = :(@generated function $(Symbol("atomic"*instr))(a) end)
    for i=1:(nargs-1)
        push!(fex.args[3].args[1].args, Symbol("a"*"$i"))
    end
    push!(fex.args[3].args[1].args, Expr(:kw, :index, 1))
    push!(fex.args[3].args[1].args, Expr(:kw, :field, Val(nothing)))
    fargs = fex.args[3].args[2].args
    append!(fargs, (quote
        type_map = $type_map
        fieldsym = field.parameters[1]
        if fieldsym == nothing
            base_type = a.parameters[1]
            offset = 0
        else
            field_index = findfirst(fieldnames(a.parameters[1]) .== fieldsym)
            base_type = a.parameters[1].types[field_index]
            offset = (cumsum(sizeof.(a.parameters[1].types)) .- sizeof.(a.parameters[1].types))[field_index]
        end
        ASstr = a.parameters[3] == CUDAnative.AS.Shared ? "shared" : "global"
    end).args)

    append!(fargs, (quote
        call_string = string( "cvta.to.",ASstr,".u64 %rd1, \$1;\natom.",ASstr,".",$instr,".", type_map[base_type][$typeindex], " \$0, [%rd1],")
        call_string = string(call_string, string(string(string.(" \$", collect(2:$nargs), ",")...)[1:end-1],";"))
    end).args)

    for i=1:(nargs-1)
        varsym = Symbol("a"*"$i")
        subex = :($(Symbol("a"*"$i"*"val")) = $varsym==base_type ? $(QuoteNode(:($varsym))) : :(cvt($base_type, $varsym)))
        subex.args[end].args[end].args[end].args[end] = varsym
        push!(fargs, subex)
    end

    append!(fargs, (quote
        ex = :(@asmcall)
        constraint_list = Array{String}(["=", type_map[base_type][2], ",l"])
        argtype_expr = :(Tuple{UInt64})
        for i=2:$nargs
            push!(constraint_list,string(","*type_map[base_type][2]))
            push!(argtype_expr.args,Symbol(base_type))
        end
        append!(ex.args, [call_string, string(constraint_list...), true, Symbol(base_type), argtype_expr, :( UInt64(pointer(a)) + $offset + $(sizeof(base_type))*(index-1)), a1val])
        return :(Base.@_inline_meta; $ex)
    end).args)

    for i=2:(nargs-1)
        push!(fargs[end-2].args[end].args, Symbol("a"*"$i"*"val"))
    end

    return fex
end

for atomicfunc in atomiclist
    eval(atomicexpression(atomicfunc[1], atomicfunc[2], atomicfunc[3]))
    eval(:(export $(Symbol("atomic"*atomicfunc[1]))))
end

end

function atomicsub(a::CuDeviceArray{Int32, N, A}, b, index=1, field=Val(nothing)) where {N,A}
    atomicadd(a, -b, index, field)
end
export atomicsub

export cvt

end


module SparseSampling

using Random
using POMDPs
using Parameters
using StaticArrays
using POMDPModelTools

export
    SSOptions,
    SparseSamplingSolver,
    POWSSOptions,
    SSPlanner,
    valuepairs

abstract type AbstractSSOptions end

# accessors
maxdepth(opt::AbstractSSOptions) = opt.maxdepth
width(opt::AbstractSSOptions) = opt.width

@with_kw struct SSOptions <: AbstractSSOptions
    maxdepth::Int
    width::Int
end

@with_kw struct POWSSOptions <: AbstractSSOptions
    maxdepth::Int
    width::Int
end

struct SparseSamplingSolver
    opt::AbstractSSOptions
    rng::AbstractRNG
end

SparseSamplingSolver(opt::AbstractSSOptions; rng=Random.GLOBAL_RNG) = SparseSamplingSolver(opt, rng)
SparseSamplingSolver(;rng=Random.GLOBAL_RNG, kwargs...) = SparseSamplingSolver(SSOptions(kwargs...), rng)

function POMDPs.solve(s::SparseSamplingSolver, m::Union{MDP,POMDP})
    if s.opt isa POWSSOptions
        @assert !(Nothing <: statetype(m)) "POWSS does not support problems where the state can be nothing (this can be fixed by adding Some in appropriate places)."
        # @assert !(Nothing <: obstype(m)) "POWSS does not support problems where the observation can be nothing (this can be fixed by adding Some in appropriate places)."
    end
    SSPlanner(m, s.opt, s.rng)
end
struct SSPlanner{M<:Union{MDP,POMDP},O<:AbstractSSOptions,R<:AbstractRNG}
    m::M
    opt::O
    rng::R
end

include("pomdp_sparse_sampling.jl")

end # module


module SCIP

include("scip_objsense.jl")
include("scip_retcode.jl")
include("scip_stage.jl")
include("scip_status.jl")
include("scip_vartype.jl")

export run_test

################################################################################
# Mappings to SCIP types
################################################################################
typealias SCIP_Real Float64
typealias SCIP_Bool Bool

typealias PtrSCIP Ptr{Void}
typealias PtrPtrSCIP Ptr{Ptr{Void}}

typealias PtrSCIP_Var Ptr{Void}
typealias PtrPtrSCIP_Var Ptr{Ptr{Void}}

typealias PtrSCIP_Cons Ptr{Void}
typealias PtrPtrSCIP_Cons Ptr{Ptr{Void}}

typealias PtrSCIP_Sol Ptr{Void}
typealias PtrPtrSCIP_Sol Ptr{Ptr{Void}}

################################################################################
# Macros for interacting with SCIP
################################################################################
# Macro for calling SCIP functions that return misc. types
macro scip_ccall(func, args...)
    f = "SCIP$(func)"
    return quote
        ccall(($f, "libscipopt"), $(args...))
    end
end

# Macro for calling SCIP functions that have checked return codes
macro scip_ccall_check(func, args...)
    f = "SCIP$(func)"
    return quote
        ret = ccall(($f, "libscipopt"), Int8, $(args...))
        if ret != SCIP_OKAY
            error(SCIP_RETCODE[ret])
        end
    end
end

################################################################################
# Miscellaneous methods
################################################################################
version() = @scip_ccall("version", SCIP_Real, ())
major_version() = @scip_ccall("majorVersion", Int, ())
minor_version() = @scip_ccall("minorVersion", Int, ())
tech_version() = @scip_ccall("techVersion", Int, ())
subversion() = @scip_ccall("subversion", Int, ())
# TODO: SCIPprintVersion
print_error(e) = @scip_ccall("printError", Void, (SCIP_Retcode,), e)
store_solution_gap(scip) = @scip_ccall("storeSolutionGap", Void, (PtrSCIP,), scip)

################################################################################
# General SCIP methodds
################################################################################
create(scip) = @scip_ccall_check("create", (PtrPtrSCIP,), scip) # TODO: Add !?
free(scip) = @scip_ccall_check("free", (PtrPtrSCIP,), scip)     # TODO: Add !?
get_stage(scip) = @scip_ccall("getStage", SCIP_Stage, (PtrSCIP,), scip[1])
# TODO: SCIPprintStage
get_status(scip) = @scip_ccall("getStatus", SCIP_Status, (PtrSCIP,), scip[1])
# TODO: SCIPprintStatus
is_transformed(scip) = @scip_ccall("isTransformed", SCIP_Bool, (PtrSCIP,), scip[1])
is_exact_solve(scip) = @scip_ccall("isExactSolve", SCIP_Bool, (PtrSCIP,), scip[1])
is_presolve_finished(scip) = @scip_ccall("isPresolveFinished", SCIP_Bool, (PtrSCIP,), scip[1])
pressed_ctrl_c(scip) = @scip_ccall("pressedCtrlC", SCIP_Bool, (PtrSCIP,), scip[1])
is_stopped(scip) = @scip_ccall("isStopped", SCIP_Bool, (PtrSCIP,), scip[1])

################################################################################
# More methods to get a basic example working
################################################################################
include_default_plugins!(scip) = @scip_ccall_check("includeDefaultPlugins", (PtrSCIP,), scip[1])

create_prob_basic!(scip, name) = @scip_ccall_check("createProbBasic", (PtrSCIP, String), scip[1], name)
free_prob!(scip) = @scip_ccall_check("freeProb", (PtrSCIP,), scip[1])

create_var_basic!(scip, var, name, lb, ub, obj, vartype) = @scip_ccall_check(
    "createVarBasic",
    (PtrSCIP, PtrPtrSCIP_Var, String, SCIP_Real, SCIP_Real, SCIP_Real, SCIP_Vartype),
    scip[1], var, name, lb, ub, obj, vartype
)
add_var!(scip, var) = @scip_ccall_check("addVar", (PtrSCIP, PtrSCIP_Var), scip[1], var[1])
release_var!(scip, var) = @scip_ccall_check("releaseVar", (PtrSCIP, PtrPtrSCIP_Var), scip[1], var)

# TODO: handle vars & vals conversion
include_conshdlr_linear!(scip) = @scip_ccall_check("includeConshdlrLinear", (PtrSCIP,), scip[1])
create_cons_basic_linear!(scip, cons, name, nvars, vars, vals, lhs, rhs) = @scip_ccall_check(
    "createConsBasicLinear",
    (PtrSCIP, PtrPtrSCIP_Cons, String, Int, PtrPtrSCIP_Var, Ptr{SCIP_Real}, SCIP_Real, SCIP_Real),
    scip[1], cons, name, nvars, vars, vals, lhs, rhs
)
add_cons!(scip, cons) = @scip_ccall_check("addCons", (PtrSCIP, PtrSCIP_Cons), scip[1], cons[1])
del_cons!(scip, cons) = @scip_ccall_check("delCons", (PtrSCIP, PtrSCIP_Cons), scip[1], cons[1])
release_cons!(scip, cons) = @scip_ccall_check("releaseCons", (PtrSCIP, PtrPtrSCIP_Cons), scip[1], cons)

set_objsense!(scip, objsense) = @scip_ccall_check("setObjsense", (PtrSCIP, SCIP_Objsense), scip[1], objsense)
presolve!(scip) = @scip_ccall_check("presolve", (PtrSCIP,), scip)
solve!(scip) = @scip_ccall_check("solve", (PtrSCIP,), scip[1])

get_best_sol(scip) = @scip_ccall("getBestSol", PtrSCIP_Sol, (PtrSCIP,), scip[1])
get_sol_orig_obj(scip, sol) = @scip_ccall("getSolOrigObj", SCIP_Real, (PtrSCIP, PtrSCIP_Sol), scip[1], sol)
get_sol_val(scip, sol, var) = @scip_ccall("getSolVal", SCIP_Real, (PtrSCIP, PtrSCIP_Sol, PtrSCIP_Var), scip[1], sol, var[1])

################################################################################
# Basic SCIP example - this will be wrapped up in an API
################################################################################
function run_test()
    scip = Array(Ptr{Void}, 1)
    create(scip)
    include_default_plugins!(scip)

    # Create a problem
    create_prob_basic!(scip, "Test problem")

    # Create a couple binary variables.
    x1 = Array(Ptr{Void}, 1)
    create_var_basic!(scip, x1, "x1", 0, 1, 4, SCIP_VARTYPE_BINARY)
    add_var!(scip, x1)

    x2 = Array(Ptr{Void}, 1)
    create_var_basic!(scip, x2, "x2", 0, 1, 3, SCIP_VARTYPE_BINARY)
    add_var!(scip, x2)

    # Add a constraint: 0 <= x1 + x2 <= 1
    cons = Array(Ptr{Void}, 1)
    vars = Array(Ptr{Void}, 2)
    vars[1] = x1[1]
    vars[2] = x2[1]
    vals = Array(SCIP_Real, 2)
    vals[1] = 1
    vals[2] = 1
    #include_conshdlr_linear!(scip)
    create_cons_basic_linear!(scip, cons, "c1", 2, vars, vals, 0, 1)
    add_cons!(scip, cons)

    # Objective sense = maximize
    set_objsense!(scip, SCIP_OBJSENSE_MAXIMIZE)
    solve!(scip)

    sol = get_best_sol(scip)
    println("\n========================================")
    println("MODEL SOLUTION:")
    println("OBJ = ", get_sol_orig_obj(scip, sol))
    println("X1 = ", get_sol_val(scip, sol, x1))
    println("X2 = ", get_sol_val(scip, sol, x2))
    println("========================================")

    # Cleaning up
    release_cons!(scip, cons)
    release_var!(scip, x1)
    release_var!(scip, x2)
    free_prob!(scip)
    free(scip)
end

end


"""
    M_file(P, col::int64)

    Generate filepath and extract indices from spreadsheet log.xlsx

    Arguments
    - 'col::Int64' : column of file of interest in accompanying spread sheet
"""
function M_file(col::Int64)
    if Sys.iswindows()
        xf = XLSX.readxlsx("C:\\Users\\cwaha\\Dropbox\\My PC (DESKTOP-8JF2H49)\\Documents\\UCL\\raw_lab data\\log.xlsx")
    else
        xf = XLSX.readxlsx("/Users/christopherharbord/Dropbox/My PC (DESKTOP-8JF2H49)/Documents/UCL/raw_lab data/log.xlsx")
    end
    sh = xf[XLSX.sheetnames(xf)[1]]
    info = sh[:]
    exp_info = Dict()
    exp_info[:I]=[info[col,4],info[col,5],info[col,6]] # Indice at HP
    exp_info[:P_exp] = info[col,2]
    exp_info[:T] = info[col,7] # Temperature of experiment
    exp_info[:εr] = info[col,8] # Strain rate of test
    exp_info[:K_mm_kN] = info[col,9] # Machine compliance [mm kN^-1]
    exp_info[:L_mm] = info[col,10] # Sample length
    exp_info[:d_mm] = info[col,11] # Diameter of sample [m]
    fil = info[col,1]
    if Sys.iswindows()
        fid = "C:\\Users\\cwaha\\Dropbox\\My PC (DESKTOP-8JF2H49)\\Documents\\UCL\\raw_lab data\\"*fil*".tdms"
    else
        fid = "/Users/christopherharbord/Dropbox/My PC (DESKTOP-8JF2H49)/Documents/UCL/raw_lab data/"*fil*".tdms"
    end
    return fid, exp_info
end
"""
    M_read(P)

    Open and read contents of .tdms file
    #Arguments
    - fid : file path string
    return P
"""
function M_read(fid::String)
    tdmsIN = readtdms(fid)
    P = Dict()
    P[:t_s] = tdmsIN.groups["Numeric"]["TimeStamp"].data
    P[:F_kN] = tdmsIN.groups["Numeric"]["Load"].data
    P[:Ua_mm] = tdmsIN.groups["Numeric"]["Displacement"].data
    P[:U1_mm] = tdmsIN.groups["Numeric"]["LVDT 1"].data
    P[:U2_mm] = tdmsIN.groups["Numeric"]["LVDT 2"].data
    P[:Pc1_MPa] = tdmsIN.groups["Numeric"]["Pc 700MPa"].data
    P[:Pc2_MPa] = tdmsIN.groups["Numeric"]["PC 1400 MPa"].data
    P[:Pf_MPa] = tdmsIN.groups["Numeric"]["Pore Pressure"].data
    P[:PpVol_mm3] = tdmsIN.groups["Numeric"]["PP vol"].data
    return P
end

function t_conv(P)
    P[:t_date_time] = unix2datetime(datetime2unix(DateTime(1904,1,1,0,0,0)) .+Int.(Round.(P[:t_s]*1000)))
end

"""
    M_reduce!(P, exp_info)

    Reduce Murrell data
    #Arguments
    * P : dictionary containing raw data from the Murrell, must include indices of hit point and sample information
    * exp_info : dictionary containing experimental parameters
"""

function M_reduce!(P,exp_info)
    I1 = exp_info[:I][1]
    P[:t_s_c] = P[:t_s].-P[:t_s][I1]
    P[:F_kN_c] = P[:F_kN] .-P[:F_kN][I1]
    P[:U_mm_c] = ((P[:U1_mm].+P[:U2_mm]).-(P[:U1_mm][I1]+P[:U2_mm][I1]))./2
    P[:U_mm_fc] = P[:U_mm_c] .-(P[:F_kN_c]*exp_info[:K_mm_kN])
    P[:ε] = P[:U_mm_fc]./exp_info[:L_mm]
    P[:Jr] = JR!(P, exp_info)
    P[:F_kN_j] = P[:F_kN_c] .-P[:Jr]
    P[:σ_MPa] = P[:F_kN_c]./(0.25e-6π*exp_info[:d_mm]^2) .*1e-3
    P[:σ_MPa_j] = P[:F_kN_j]./(0.25e-6π*exp_info[:d_mm]^2) .*1e-3
end

"""
    H_mod(P,ds::Int64)

    Calculate tangent moduli and yield stress using robust numerical differentiation

    #Arguments
    - 'P' : dictionary information pertaining to the 'Murrell'
"""
function Youngs_mod!(P, exp_info)
    ε1 = Array{Float64,1}(undef,1)
    σ1 = Array{Float64,1}(undef,1)
    t1 = Array{Float64,1}(undef,1)
    I1 = exp_info[:I][1]
    I2 = exp_info[:I][2]
    ε = P[:ε][I1:I2]
    σ = P[:σ_MPa][I1:I2]
    t = P[:t_s][I1:I2]
    # Youngs modulus calculation
    while true
        fig = figure()
        plot(ε,σ)
        xlim(0,0.005)
        ylim(0,300)
        g_data = ginput(2)
        close(fig)
        IE = (findfirst(ε.>g_data[1][1]), findfirst(ε.>g_data[2][1]))
        P[:EE] = linfit(ε[IE[1]:IE[2]], σ[IE[1]:IE[2]])
        P[:E_GPa] = P[:EE][1]/1e3
        fig = figure()
        plot(ε[IE[1]:IE[2]],σ[IE[1]:IE[2]],ε[IE[1]:IE[2]],M(ε[IE[1]:IE[2]],P[:EE].param))
        title("Youngs' modulus ="*string(P[:E_GPa])*"GPa")
        println("Fit ok? (y/n)")
        if readline() == "y"
            close(fig)
            break
        else
            close(fig)
        end
    end
end

function YS!(P,exp_info)
    I1 = exp_info[:I][1]
    I2 = exp_info[:I][2]
    ε1 = Array{Float64,1}(undef,1)
    σ1 = Array{Float64,1}(undef,1)
    t1 = Array{Float64,1}(undef,1)
    ε = P[:ε][I1:I2-1000]
    σ = P[:σ_MPa][I1:I2-1000]
    t = P[:t_s][I1:I2-1000]
    while true
        println("Enter moving average:")
        ds = parse(Float64,readline())
        for i in 1:Int(floor(length(P[:ε][I1:I2-1000])/ds))-1
            push!(ε1,sum(ε[Int(i*ds-ds+1):Int(i*ds)])/ds)
            push!(σ1,sum(σ[Int(i*ds-ds+1):Int(i*ds)])/ds)
            push!(t1,t[Int(i*ds)+Int(ceil(ds/2))])
        end
        deleteat!(ε1,1)
        deleteat!(σ1,1)
        deleteat!(t1,1)
        dσ = TVRegDiff(σ1,200, 0.2, dx=1, ε=1e-6)
        dε = TVRegDiff(ε1,200, 0.2, dx=1, ε=1e-6)
        P[:h] = dσ./dε*1e-3 # Calculate the tangent modulus in GPa, excluding initial non-linearity
        P[:ε_h] = ε1
        h_max = maximum(P[:h])
        II = findfirst(P[:h] .== h_max)
        P[:H_GPa] = sum(P[:h][P[:h].<0.4P[:E_GPa]])/sum(P[:h].<0.4P[:E_GPa])
        P[:ε_E] = ε1[II]
        P[:σ_E] = σ1[II]
        P[:YSa_MPa] = σ1[findfirst((P[:h].<0.8P[:E_GPa]) .& (ε1 .> ε1[II]))] #80% yield
        P[:εa] = ε1[findfirst((P[:h].<0.8P[:E_GPa]) .& (ε1 .> ε1[II]))]
        P[:YSb_MPa] = σ1[findfirst((P[:h].<0.5P[:E_GPa]) .& (ε1 .> ε1[II]))] #50% yield
        P[:εb] = ε1[findfirst((P[:h].<0.5P[:E_GPa]) .& (ε1 .> ε1[II]))]
        M(ε, p) = p[1]*ε .+p[2]
        fig = figure()
        ax=[]
        push!(ax,subplot(2,1,1))
        ax[1].plot(ε,σ,"0.5")
        ax[1].plot(ε,M(ε,P[:EE].param),"--k")
        ax[1].scatter(P[:εa],P[:YSa_MPa],s=100)
        ax[1].scatter(P[:εb],P[:YSb_MPa],s=100)
        ax[1].set_xlim(0,P[:εb]+0.001)
        ax[1].set_ylim(0,P[:YSb_MPa]+20)
        push!(ax,subplot(2,1,2))
        ax[2].plot(P[:ε_h],P[:h])
        ax[2].plot(P[:ε_h],M(P[:ε_h],(0,P[:E_GPa])),"--k")
        ax[2].plot(P[:ε_h],M(P[:ε_h],(0,0.8P[:E_GPa])),"--k")
        ax[2].plot(P[:ε_h],M(P[:ε_h],(0,0.5P[:E_GPa])),"--k")
        ax[2].scatter(P[:εa],0.8P[:E_GPa])
        ax[2].scatter(P[:εb],0.5P[:E_GPa])
        ax[2].set_xlim(0,P[:εb]+0.001)
        ax[2].set_ylim(0,2P[:E_GPa])
        println("Fit ok (y/n)")
        if readline() == "y"
            close(fig)
            break
        else
            close(fig)
        end
    end
end

"""
    SFP_read()

    Read and return data from program SFP_furnace_control_V2.vi

    #Arguments
    - 'SFP' : empty dictionary to store extracted data
    - 'fil::string' : path to file
"""
function SFP_read(fid)
    path="/Users/christopherharbord/Dropbox/My PC (DESKTOP-8JF2H49)/Documents/UCL/Furnace_calibration/SFP_logging/"*fil
    dat = readdlm(path)
    headers = dat[:,1]
    I = findall(x->x==headers[1],dat[:,1])
    SFP = Dict()
    SFP[:t] = dat[:,1]
    SFP[:PF] = dat[:,3]
    SFP[:S1] = dat[:,4]
    SFP[:S2] = dat[:,5]
    SFP[:S3] = dat[:,6]
    SFP[:TC1] = dat[:,7]
    SFP[:TC2] = dat[:,8]
    close(dat)
    deleteat!(SFP[:t],I)
    deleteat!(SFP[:PF],I)
    deleteat!(SFP[:S1],I)
    deleteat!(SFP[:S2],I)
    deleteat!(SFP[:S3],I)
    deletat!(SFP[:TC1],I)
    deletat!(SFP[:TC2],I)
end
"""
    JR(P, exp_info)

    Calculate strength contribution of copper jacket for corrections

    #Arguments
    * 'P' : dictionary containing processed data from the 'Murrell'
    * exp_info : details of experiment
"""
function JR!(P, exp_info)
    EaJ = 197000 # Copper activation enthalpy
    n1J = 4.8 # Empirical factor 1
    n2J = 0.22 # Empirical factor 2
    ε̇j = P[:εr]*(exp_info[:d_mm]/exp_info[:L_mm]) # Jacket strain rate
    Jr = 2*10^((log10(ε̇j*exp(EaJ/(8.3145*(exp_info[:T]+278)))))/n1J-n2J) # Copper flow stress at experiment conditions
    Ja = π*exp_info[:d_mm]*exp_info[:L_mm]*1e-6 # Jacket area
    JR = Jr.*Ja.*(P[:ε]*(exp_info[:d_mm]/exp_info[:L_mm])).*1e-3 # Force due to jacket assuming linear increase due to incremental strain
end

function M_interp!(P, t_UT)
    P[:F_kN_i] = lininterp(P[:t_s],P[:F_kN_j], t_UT)
    P[:U_mm_i] = lininterp(P[:t_s],P[:U_mm_c], t_UT)
    P[:σ_MPa_i] = lininterp(P[:t_s],P[:σ_MPa_j], t_UT)
    P[:σ3_MPa_i] = lininterp(P[:t_s],P[:PC2_MPa], t_UT)
    P[:ε_i] = lininterp(P[:t_s],P[:ε], t_UT)
end


function KalmanModel(arg0::List, arg1::List, arg2::ParameterDriversList)
    return KalmanModel((List, List, ParameterDriversList), arg0, arg1, arg2)
end

function finalize_estimation(obj::KalmanModel, arg0::ObservedMeasurement, arg1::ProcessEstimate)
    return jcall(obj, "finalizeEstimation", void, (ObservedMeasurement, ProcessEstimate), arg0, arg1)
end

function get_corrected_measurement(obj::KalmanModel)
    return jcall(obj, "getCorrectedMeasurement", EstimatedMeasurement, ())
end

function get_corrected_spacecraft_states(obj::KalmanModel)
    return jcall(obj, "getCorrectedSpacecraftStates", Vector{SpacecraftState}, ())
end

function get_current_date(obj::KalmanModel)
    return jcall(obj, "getCurrentDate", AbsoluteDate, ())
end

function get_current_measurement_number(obj::KalmanModel)
    return jcall(obj, "getCurrentMeasurementNumber", jint, ())
end

function get_estimate(obj::KalmanModel)
    return jcall(obj, "getEstimate", ProcessEstimate, ())
end

function get_estimated_measurements_parameters(obj::KalmanModel)
    return jcall(obj, "getEstimatedMeasurementsParameters", ParameterDriversList, ())
end

function get_estimated_orbital_parameters(obj::KalmanModel)
    return jcall(obj, "getEstimatedOrbitalParameters", ParameterDriversList, ())
end

function get_estimated_propagation_parameters(obj::KalmanModel)
    return jcall(obj, "getEstimatedPropagationParameters", ParameterDriversList, ())
end

function get_estimated_propagators(obj::KalmanModel)
    return jcall(obj, "getEstimatedPropagators", Vector{NumericalPropagator}, ())
end

function get_evolution(obj::KalmanModel, arg0::jdouble, arg1::RealVector, arg2::MeasurementDecorator)
    return jcall(obj, "getEvolution", NonLinearEvolution, (jdouble, RealVector, MeasurementDecorator), arg0, arg1, arg2)
end

function get_innovation(obj::KalmanModel, arg0::MeasurementDecorator, arg1::NonLinearEvolution, arg2::RealMatrix)
    return jcall(obj, "getInnovation", RealVector, (MeasurementDecorator, NonLinearEvolution, RealMatrix), arg0, arg1, arg2)
end

function get_physical_estimated_covariance_matrix(obj::KalmanModel)
    return jcall(obj, "getPhysicalEstimatedCovarianceMatrix", RealMatrix, ())
end

function get_physical_estimated_state(obj::KalmanModel)
    return jcall(obj, "getPhysicalEstimatedState", RealVector, ())
end

function get_physical_innovation_covariance_matrix(obj::KalmanModel)
    return jcall(obj, "getPhysicalInnovationCovarianceMatrix", RealMatrix, ())
end

function get_physical_kalman_gain(obj::KalmanModel)
    return jcall(obj, "getPhysicalKalmanGain", RealMatrix, ())
end

function get_physical_measurement_jacobian(obj::KalmanModel)
    return jcall(obj, "getPhysicalMeasurementJacobian", RealMatrix, ())
end

function get_physical_state_transition_matrix(obj::KalmanModel)
    return jcall(obj, "getPhysicalStateTransitionMatrix", RealMatrix, ())
end

function get_predicted_measurement(obj::KalmanModel)
    return jcall(obj, "getPredictedMeasurement", EstimatedMeasurement, ())
end

function get_predicted_spacecraft_states(obj::KalmanModel)
    return jcall(obj, "getPredictedSpacecraftStates", Vector{SpacecraftState}, ())
end


## return copy of `a` with midi channel changed to `v`
function channel(v::Int, a::Atom)
	@assert 1 <= v <= 16
	if in(:cha,fieldnames(typeof(a)))
		a = deepcopy(a)
		a.cha = v
	end
	a
end

## return copy of `a` with duration and offset multiplied by `v`
function dilate(v::Rat, a::Atom)
	@assert v > 0
	if in(:dur,fieldnames(typeof(a)))
		a = deepcopy(a)
		a.ofs *= v
		a.dur *= v
	end
	a
end

## return copy of `a` with `v` added to offset
function sshift(v::Rat, a::Atom)
	a = deepcopy(a)
	a.ofs += v
	a
end

## return copy of `a` with velocity mutiplied by `v`
function accel(v::Float64, a::Atom)
	@assert 0 < v
	if in(:vel,fieldnames(typeof(a)))
		a = deepcopy(a)
		a.vel *= v
	end
	a
end

## return copy of `a` with `v` added to note inteval value
function transl(v::Int, a::Atom)
	if in(:itv,fieldnames(typeof(a)))
		a = deepcopy(a)
		a.itv += v
	end
	a
end

## return copy of `a` with `v` added to note octave value
function octave(v::Int, a::Atom)
	if in(:ocv,fieldnames(typeof(a)))
		a = deepcopy(a)
		a.ocv = v
	end
	a
end

## return copy of `a` with note scale changed to `v`
function sscale(v::Scales.Scale, a::Atom)
	if in(:sca,fieldnames(typeof(a)))
		a = deepcopy(a)
		a.sca = v
	end
	a
end

## tests if atom default fields have valid values
function atomTest(a::Atom)
	if in(:cha,fieldnames(typeof(a))) ; @assert 1 <= a.cha <= 16 ; end
	if isa(a,Duratom)
		if in(:dur,fieldnames(typeof(a))) ; @assert 0 < a.dur ; end
	else
		if in(:dur,fieldnames(typeof(a))) ; @assert 0 <= a.dur ; end
	end
	if in(:ocv,fieldnames(typeof(a))) ; @assert 1 <= a.ocv <= 5 ; end
	if in(:vel,fieldnames(typeof(a))) ; @assert 0 < a.vel ; end
	a
end

## play a note (on and off midi events)
type Note <: Duratom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	itv::Int			# interval value
	ocv::Int			# octave
	vel::Float64		# velocity
	sca::Scales.Scale	# scale

	Note(ofs,dur,cha,itv,ocv,vel,sca) = atomTest(new(ofs,dur,cha,itv,ocv,vel,sca))
end

## select instrument bank
type BankSel <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	bank::Int			# bank number

	BankSel(ofs,cha,bank) = ( @assert 0<=bank<=16383 ; atomTest(new(ofs,0//1,cha,bank)) )
end

## select instrument program
type ProgSel <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	prog::Int			# program

	ProgSel(ofs,cha,prog) = ( @assert 0<=prog<=127 ; atomTest(new(ofs,0//1,cha,prog)) )
end

## set channel volume
type VolSet <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	vol::Float64		# volume [0,1]

	VolSet(ofs,cha,vol) = ( @assert 0<=vol<=1 ; atomTest(new(ofs,0//1,cha,vol)) )
end

## pitch wheel bend
type PitchWheel <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	val::Int			# value {0..2^14-1}

	PitchWheel(ofs,cha,val) = ( @assert 0<=val<=16383 ; atomTest(new(ofs,0//1,cha,val)) )
end

## channel aftertouch
type ChanAfter <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	val::Int			# value {0..127}

	ChanAfter(ofs,cha,val) = ( @assert 0<=val<=127 ; atomTest(new(ofs,0//1,cha,val)) )
end

## channel contol 7bit
type Control7 <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	num::Int			# control number {64..127}
	val::Int			# control value {0..127}

	Control7(ofs,cha,num,val) = ( @assert 0<=val<=127 && 64<=num<=127 ; atomTest(new(ofs,0//1,cha,num,val)) )
end

## channel contol 14bit
type Control14 <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	cha::Int			# channel
	num::Int			# control number {0..31}
	val::Int			# control value {0..2^14-1}

	Control14(ofs,cha,num,val) = ( @assert 0<=val<=16383 && 0<=num<=31 ; atomTest(new(ofs,0//1,cha,num,val)) )
end

## track marker
type Marker <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	name::AbstractString	# marker name

	Marker(ofs,name) = ( @assert length(name) > 0 ; atomTest(new(ofs,0//1,name)) )
end

## set track time signature
type TimeSignature <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	num::Int			# numerator
	den::Int			# denominator as logarithm of 2
	clocks::Int			# divisions per quarter note
	sub::Int			# subdivisions

	TimeSignature(ofs,num,den,clocks,sub) = ( @assert 1<=num<=32 && 0<=den<=6 && 1<=clocks<64 && 1<=sub<64 ; atomTest(new(ofs,0//1,num,den,clocks,sub)) )
end

## track tempo
type Tempo <: Atom
	ofs::Rat			# offset
	dur::Rat			# duration
	bpm::Int			# beats per minute

	Tempo(ofs,bpm) = ( @assert 12<=bpm<=1728 ; atomTest(new(ofs,0//1,bpm)) )
end

## functions for writing Atoms to a MidiTrack; uses Jumidi functions; returns a's end time in MidiTrack ticks

function toTrack!(mt::MidiTrack, a::Note)
	t1 = timm(mt,a.ofs) ; t2 = t1 + tim(mt,a.dur) ; @assert t1 < t2-1
	ve = ftoi7(a.vel) ; pch::Int = Scales.getPitch(a.sca,a.ocv,a.itv) ; @assert 0 <= pch < 128
	noteOn!(mt,a.ofs,a.cha,pch,ve)
	noteOff!(mt,a.ofs+a.dur,a.cha,pch,ve)
	t2
end

toTrack!(mt::MidiTrack, a::BankSel) = bankSel!(mt,a.ofs,a.cha,a.bank)

toTrack!(mt::MidiTrack, a::ProgSel) = progSel!(mt,a.ofs,a.cha,a.prog)

toTrack!(mt::MidiTrack, a::VolSet) = control14!(mt,a.ofs,a.cha,7,ftoi14(a.vol))

toTrack!(mt::MidiTrack, a::PitchWheel) = pitchWheel!(mt,a.ofs,a.cha,a.val)

toTrack!(mt::MidiTrack, a::ChanAfter) = chanAfter!(mt,a.ofs,a.cha,a.val)

toTrack!(mt::MidiTrack, a::Control7) = control7!(mt,a.ofs,a.cha,a.num,a.val)

toTrack!(mt::MidiTrack, a::Control14) = control14!(mt,a.ofs,a.cha,a.num,a.val)

toTrack!(mt::MidiTrack, a::Marker) = trackMarker!(mt,a.ofs,a.name)

toTrack!(mt::MidiTrack, a::TimeSignature) = timeSigSet!(mt,a.ofs,a.num,a.den,a.clocks,a.sub)

toTrack!(mt::MidiTrack, a::Tempo) = tempoSet!(mt,a.ofs,a.bpm)

function Base.isequal(x::Atom, y::Atom)
	if typeof(x) != typeof(y) ; return false ; end
	for t in fieldnames(typeof(x))
		v1 = getfield(x,t)
		v2 = getfield(y,t)
		if !isequal(v1,v2) ; return false ; end
	end
	true
end


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 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------.---------------------------------------------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------.++++++++++++++++++++++++.[-]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------.+++++++++.---------.+++++.+++++++++++++++++.++++++++++++.+++++++++++++++++++++++++++.++++++++.------------------.+++++++++++++.+.-----------------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------.----------------------------------------------------------------------.++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++.+++++++++++++.+.------.-------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++.------------------------------------------------------------------------------.++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++.[-]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.----------------------------------------.++++++++.----------.++++.+++++++++++++++++++.+++++++++++++++.+++++++++++++++++++++++++++.---------.+++++++++++..---------------.+++++++++.------------------------------------------------------------------------------.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++.-----------------------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++.---.---..+++++++++.+++.--------------.--------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.---.------.----------------------------------------------------------------------.++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++.++++++++++++..----.------------------------------------------------------.-----------..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...-------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++.---.---..+++++++++.+++.--------------.------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++.---------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++.++++.---.+++++++++++++.+++++.----------------------------------------------------------------------.+++++++++++++++.[-]>+++++++++>+++>>++++++++++[->>>+<<<]>>>[-<<<+>>+>]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[>[-]+++++++++++++++++++++++++++++++++++++++++++++<<<<[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]<+++++++++++++++++++++++++++++++++++++++++++>]<<<[>>>[-]<<<[->>>+<<<]>>>[[-<<<+>>>]<<<->>>]++++++++++++++++>[-]++++++++++++++>>>>>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>[-]>[-<<<<<<<<<<+>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<+++++>>>>]>+<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>[-]>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<++++++++++>>>]+++++++++++++++++++++++++>>[-]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>[-]>[-<<<<<<<<<+>>>>>>>>+>]<[<[->>+<<]>>[-<<+<<+>>>>]<-]<[-]<<[->>+<<]>>[-<<+<<+>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>->>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>->>>>]>++>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<----->>>>]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+>>>>>>->>>]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<<<[->>>>>+<<<<<]>>>>[-]>[-<<<<<+>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<--------------------------------.>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<+++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>[-]>>[-<<<<<<<<+>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]<<<.<<<[->>>>>>>>+<<<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<]>>>[-]<<<<<[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]>[-]<<<<<[->>>>>+<<<<<]>>>>>[-<<<<<+<<<+>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>]<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]<<<<<->>>>>]<]<<<<<+>>+>>[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]<<<[-]>+>[-]++>++++++++>[-]+>+[>>>++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>[-]>[-<<<<<<+>>>>>+>]>[-]<<<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[>[-]<<<<<[->>>>>+<<<<<]>>>>>[[-<<<<<+>>>>>]>>[-]>>>+<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>>>>[-]<<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<+>+>>]>[-]+++<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>[-]>[-<<<<<<<<<<<+>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<+>>+>]<<<[->>>+<<<]>>>[[-<<<+>>>]>[-]>>[-]<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>+>]<[<+>-]<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<[<+++>-]<<<<<<<<<<<<[->>>>>>>>>>>>>+<<<<<<<<<<<<<]>>>>>>>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>+>]<[<+++++++++>-]<[->>+<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>>>>+<<<<<<<<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>>>+<<<<<<<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>]<<[->>+<<]>>[[-<<+>>]>[-]<<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>[-]>>>>>>>[-<<<<<<<<<<<<+>>>>>+>>>>>>>]<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]<[-]>>>>>>>>>>>>[-<<<<<<<<<<<+<+>>>>>>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]<<<<[-]>>>>>>>>>>>[-<<<<<<<+<<<<+>>>>>>>>>>>]<<<<<<<<<<->[-]>+>>>>>>>]<[->+<]>[[-<+>]>[-]<<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>[-]>>>>>>>[-<<<<<<<<<<<<+>>>>>+>>>>>>>]<<<<<<<<<<<<<[->>>>>>>>>>>>>+<<<<<<<<<<<<<]>[-]>>>>>>>>>>>>[-<<<<<<<<<<<<<+>+>>>>>>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]<<<<<<[-]>>>>>>>>>>>>>[-<<<<<<<+<<<<<<+>>>>>>>>>>>>>]<<<<<<<<<<->[-]>+>>>>>>>]<<<<]>[-]++>>[-]<<<<<<<[->>>>>>>+<<<<<<<]>>>>>>[-]>[-<<<<<<<+>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>>>>[-]<<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>>>>++<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<]>+<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<]>[-]++>>[-]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<]>[-]>>[-]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>+>>>>>]<]>+<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>]<]>[-]++>>[-]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>]<]>[-]>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<[->>>>>+<<<<<]<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>[-<<<<<+<<<<<<<<<<<+>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>+<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<[->>>>>+<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>[-]++>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<[->>>>>+<<<<<]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>>[<<<<+>>>>-]<-[<<<<+>>>>-]<<<<]<<[-]>>>[<<<+>>>-]<<[>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>[-]>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>]<]>+<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>]<]>[-]++>>[-]<<<<<<<<<<<<<<[->>>>>>>>>>>>>>+<<<<<<<<<<<<<<]>>>>>>>>>>>>>[-]>[-<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>]<]<[->>>>[-]<<<<[->>>>+<<<<]>>>>>[-]+<[[-<<<<+>>>>]<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>[-<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>+>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>[-]>>>>[-<<<<<<<<+>>>>+>>>>]<<<++++++++++++++++++++++++++++++++>>-<]>[[-]<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<]>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<+>>>>>>>>>>>+>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]>>>[-]>>>>[-<<<<<<<+>>>+>>>>]<<<[-]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>]<++++++++++++++++>++++++++++++++>>>>>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>+>]<<<+>>[->>>+<<<]>>>[[-<<<+>>>]]<<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<<<<[[-]<<<<+++++>>>>]>+<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>[-]>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]]<]<<[->>+<<]>>[[-<<+>>]<<<<[-]>>>>]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<++++++++++>>>]+++++++++++++++++++++++++>>[-]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>[-]>[-<<<<<<<<<+>>>>>>>>+>]<[<[->>+<<]>>[-<<+<<+>>>>]<-]<[-]<<[->>+<<]>>[-<<+<<+>>>>]<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>->>>>]<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>->>>>]>++>>[-]<<<<<<<<<<[->>>>>>>>>>+<<<<<<<<<<]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<<[[-]<<<<----->>>>]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>->>>]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<<<[->>>>>+<<<<<]>>>>[-]>[-<<<<<+>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<--------------------------------.>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<[[-]<<<<<<<+>>>>>>>]<<]<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<<]<<<[-]>>>>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<[->>+<<]>>[-<<+<<<<->>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]>+[[-]<<<[->>>>+<<<<]>>>>>+<[[-<<<<+>>>>]<<<<++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>-<]>[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<+++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>[-]>>[-<<<<<<<<<<<+>>>>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]<<<.<<<<<<[->>>>>>>>>>>+<<<<<<<<<<<]>>>>>>>>>>>[-<<<<<<<<<<<+>>>>>>>>>+>>]<<[->>+<<]>>[[-<<+>>]<<->>]<<[<<<..>>>-]>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>[-]<<<<<<<<[->>>>>>>>+<<<<<<<<]>>>>>>>[-]>[-<<<<<<<<+>>>>>>>+>]<<[->>>+<<<]>>>[-<<<+>>+>]<<<<+>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<[-]>>>>]<<<[-]+<[[-]>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<-<]>[[-]<<<<<<.>>>>>>]<<<<<<<<<]>[-]++++++++++.[-]+>[-]+>[-]+++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>>[-]<<<[->>>+<<<]>>[-]>[-<<<+>>+>]>>>++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]++++++++++[-]++++++++++[-]>+[[-]>>+[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<--------------------------------.>>[-]<<<<[->>>>+<<<<]>>>>[-<<<<+>>>+>]>>>++++++++++<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]<<]>[->+<]>[[-<+>]<<<[->>>>+<<<<]>>>>[-<<<<+<<<+>>>>>>>]<<[->>+<<]>>[-<<+<<<<<->>>>>>>]<]<<<[-]++++++++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>+>]<<<<<<[-]>>>>>[<[->>>+<<<]>>>[-<<<+>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]]+<[->>+<<]>>[[-<<+>>]<[-]>]<<<]<[-]++++++++++>>[-]<<[-]++++++++++[-]++++++++++[-]++++++++++[-]>+[[-]>>+[[-]<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>]<<]<<<<<<+++++++++++++.<<[-]>[-]>[-]<<<<<<<]<<<<+>>>>++++>>[-]<<<<<<[->>>>>>+<<<<<<]>>>>>[-]>[-<<<<<<+>>>>>+>]>[-]<<<[->>>+<<<]>>>[-<<<+>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]<<-[->>+<<]>>[[-<<+>>]<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>[-<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[<<<<<[-]+>>>>>-[<<<<+>>>>-]<<<<]<<[->>+>+<<<]>>[-<<+>>]<[>>[->>>>+<<<<]>>]>>[->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>>>>]<<<<<<<[-]>[-]>>>>>>>++++++++[->>+<<]>>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[<<<<<<<<--------->>+>>>>>>>[-]++++++++>>[-]<<[->>+<<]>>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]>[-]++[->>+<<]>[-]>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<[<<<<<<<<--->+>>>>>>>>[-]++>>[-]<<[->>+<<]>>[-<<+>+>]<<<<<<<<<<<[->>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>>>>[-<<<<<<<<<<<<+>>>>>>>>>>>+>]<<<<[-]>>[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<[<<->->[-]<<[->>>+<<<]>>>[[-<<<+>>>]<<[->>>+<<<]>>>[[-<<<+>>>]<<+>>]<]<]<[->+<]>[[-<+>]<<<<+>>>>]<<<<]<<<<+>>>]<<]>>>>>>>>>>>>>>>>>>>>>>>>"