local a={debugger=true,version=1}local b={}local c;local d={}local e;local f;local g={}local h=term.current()local i=string.sub;local j={[colors.white]="0",[colors.orange]="1",[colors.magenta]="2",[colors.lightBlue]="3",[colors.yellow]="4",[colors.lime]="5",[colors.pink]="6",[colors.gray]="7",[colors.lightGray]="8",[colors.cyan]="9",[colors.purple]="a",[colors.blue]="b",[colors.brown]="c",[colors.green]="d",[colors.red]="e",[colors.black]="f"}local k={basaltBG=colors.lightGray,basaltFG=colors.black,FrameBG=colors.gray,FrameFG=colors.black,ButtonBG=colors.gray,ButtonFG=colors.black,CheckboxBG=colors.gray,CheckboxFG=colors.black,InputBG=colors.gray,InputFG=colors.black,textfieldBG=colors.gray,textfieldFG=colors.black,listBG=colors.gray,listFG=colors.black,dropdownBG=colors.gray,dropdownFG=colors.black,radioBG=colors.gray,radioFG=colors.black,selectionBG=colors.black,selectionFG=colors.lightGray}local l={{"\32\32\32\137\156\148\158\159\148\135\135\144\159\139\32\136\157\32\159\139\32\32\143\32\32\143\32\32\32\32\32\32\32\32\147\148\150\131\148\32\32\32\151\140\148\151\140\147","\32\32\32\149\132\149\136\156\149\144\32\133\139\159\129\143\159\133\143\159\133\138\32\133\138\32\133\32\32\32\32\32\32\150\150\129\137\156\129\32\32\32\133\131\129\133\131\132","\32\32\32\130\131\32\130\131\32\32\129\32\32\32\32\130\131\32\130\131\32\32\32\32\143\143\143\32\32\32\32\32\32\130\129\32\130\135\32\32\32\32\131\32\32\131\32\131","\139\144\32\32\143\148\135\130\144\149\32\149\150\151\149\158\140\129\32\32\32\135\130\144\135\130\144\32\149\32\32\139\32\159\148\32\32\32\32\159\32\144\32\148\32\147\131\132","\159\135\129\131\143\149\143\138\144\138\32\133\130\149\149\137\155\149\159\143\144\147\130\132\32\149\32\147\130\132\131\159\129\139\151\129\148\32\32\139\131\135\133\32\144\130\151\32","\32\32\32\32\32\32\130\135\32\130\32\129\32\129\129\131\131\32\130\131\129\140\141\132\32\129\32\32\129\32\32\32\32\32\32\32\131\131\129\32\32\32\32\32\32\32\32\32","\32\32\32\32\149\32\159\154\133\133\133\144\152\141\132\133\151\129\136\153\32\32\154\32\159\134\129\130\137\144\159\32\144\32\148\32\32\32\32\32\32\32\32\32\32\32\151\129","\32\32\32\32\133\32\32\32\32\145\145\132\141\140\132\151\129\144\150\146\129\32\32\32\138\144\32\32\159\133\136\131\132\131\151\129\32\144\32\131\131\129\32\144\32\151\129\32","\32\32\32\32\129\32\32\32\32\130\130\32\32\129\32\129\32\129\130\129\129\32\32\32\32\130\129\130\129\32\32\32\32\32\32\32\32\133\32\32\32\32\32\129\32\129\32\32","\150\156\148\136\149\32\134\131\148\134\131\148\159\134\149\136\140\129\152\131\32\135\131\149\150\131\148\150\131\148\32\148\32\32\148\32\32\152\129\143\143\144\130\155\32\134\131\148","\157\129\149\32\149\32\152\131\144\144\131\148\141\140\149\144\32\149\151\131\148\32\150\32\150\131\148\130\156\133\32\144\32\32\144\32\130\155\32\143\143\144\32\152\129\32\134\32","\130\131\32\131\131\129\131\131\129\130\131\32\32\32\129\130\131\32\130\131\32\32\129\32\130\131\32\130\129\32\32\129\32\32\133\32\32\32\129\32\32\32\130\32\32\32\129\32","\150\140\150\137\140\148\136\140\132\150\131\132\151\131\148\136\147\129\136\147\129\150\156\145\138\143\149\130\151\32\32\32\149\138\152\129\149\32\32\157\152\149\157\144\149\150\131\148","\149\143\142\149\32\149\149\32\149\149\32\144\149\32\149\149\32\32\149\32\32\149\32\149\149\32\149\32\149\32\144\32\149\149\130\148\149\32\32\149\32\149\149\130\149\149\32\149","\130\131\129\129\32\129\131\131\32\130\131\32\131\131\32\131\131\129\129\32\32\130\131\32\129\32\129\130\131\32\130\131\32\129\32\129\131\131\129\129\32\129\129\32\129\130\131\32","\136\140\132\150\131\148\136\140\132\153\140\129\131\151\129\149\32\149\149\32\149\149\32\149\137\152\129\137\152\129\131\156\133\149\131\32\150\32\32\130\148\32\152\137\144\32\32\32","\149\32\32\149\159\133\149\32\149\144\32\149\32\149\32\149\32\149\150\151\129\138\155\149\150\130\148\32\149\32\152\129\32\149\32\32\32\150\32\32\149\32\32\32\32\32\32\32","\129\32\32\130\129\129\129\32\129\130\131\32\32\129\32\130\131\32\32\129\32\129\32\129\129\32\129\32\129\32\131\131\129\130\131\32\32\32\129\130\131\32\32\32\32\140\140\132","\32\154\32\159\143\32\149\143\32\159\143\32\159\144\149\159\143\32\159\137\145\159\143\144\149\143\32\32\145\32\32\32\145\149\32\144\32\149\32\143\159\32\143\143\32\159\143\32","\32\32\32\152\140\149\151\32\149\149\32\145\149\130\149\157\140\133\32\149\32\154\143\149\151\32\149\32\149\32\144\32\149\149\153\32\32\149\32\149\133\149\149\32\149\149\32\149","\32\32\32\130\131\129\131\131\32\130\131\32\130\131\129\130\131\129\32\129\32\140\140\129\129\32\129\32\129\32\137\140\129\130\32\129\32\130\32\129\32\129\129\32\129\130\131\32","\144\143\32\159\144\144\144\143\32\159\143\144\159\138\32\144\32\144\144\32\144\144\32\144\144\32\144\144\32\144\143\143\144\32\150\129\32\149\32\130\150\32\134\137\134\134\131\148","\136\143\133\154\141\149\151\32\129\137\140\144\32\149\32\149\32\149\154\159\133\149\148\149\157\153\32\154\143\149\159\134\32\130\148\32\32\149\32\32\151\129\32\32\32\32\134\32","\133\32\32\32\32\133\129\32\32\131\131\32\32\130\32\130\131\129\32\129\32\130\131\129\129\32\129\140\140\129\131\131\129\32\130\129\32\129\32\130\129\32\32\32\32\32\129\32","\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32\32\32\32\32\149\32\32\149\32\32\32\32","\32\32\32\32\32\32\32\32\32\32\32\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\32\32\32\32\32\32\32\32\32\32\32","\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32\32\149\32","\32\32\32\32\145\32\159\139\32\151\131\132\155\143\132\134\135\145\32\149\32\158\140\129\130\130\32\152\147\155\157\134\32\32\144\144\32\32\32\32\32\32\152\131\155\131\131\129","\32\32\32\32\149\32\149\32\145\148\131\32\149\32\149\140\157\132\32\148\32\137\155\149\32\32\32\149\154\149\137\142\32\153\153\32\131\131\149\131\131\129\149\135\145\32\32\32","\32\32\32\32\129\32\130\135\32\131\131\129\134\131\132\32\129\32\32\129\32\131\131\32\32\32\32\130\131\129\32\32\32\32\129\129\32\32\32\32\32\32\130\131\129\32\32\32","\150\150\32\32\148\32\134\32\32\132\32\32\134\32\32\144\32\144\150\151\149\32\32\32\32\32\32\145\32\32\152\140\144\144\144\32\133\151\129\133\151\129\132\151\129\32\145\32","\130\129\32\131\151\129\141\32\32\142\32\32\32\32\32\149\32\149\130\149\149\32\143\32\32\32\32\142\132\32\154\143\133\157\153\132\151\150\148\151\158\132\151\150\148\144\130\148","\32\32\32\140\140\132\32\32\32\32\32\32\32\32\32\151\131\32\32\129\129\32\32\32\32\134\32\32\32\32\32\32\32\129\129\32\129\32\129\129\130\129\129\32\129\130\131\32","\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\150\151\129\150\131\132\140\143\144\143\141\145\137\140\148\141\141\144\157\142\32\159\140\32\151\134\32\157\141\32","\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\157\140\149\151\151\32\154\143\132\157\140\32\157\140\32\157\140\32\157\140\32\32\149\32\32\149\32\32\149\32\32\149\32","\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\32\129\129\131\129\32\134\32\131\131\129\131\131\129\131\131\129\131\131\129\130\131\32\130\131\32\130\131\32\130\131\32","\151\131\148\152\137\145\155\140\144\152\142\145\153\140\132\153\137\32\154\142\144\155\159\132\150\156\148\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\136\32\151\140\132","\151\32\149\151\155\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\152\137\144\157\129\149\149\32\149\149\32\149\149\32\149\149\32\149\130\150\32\32\157\129\149\32\149","\131\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\129\32\130\131\32\133\131\32","\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\159\142\32\159\159\144\152\140\144\156\143\32\159\141\129\153\140\132\157\141\32\130\145\32\32\147\32\136\153\32\130\146\32","\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\152\140\149\149\157\134\154\143\132\157\140\133\157\140\133\157\140\133\157\140\133\32\149\32\32\149\32\32\149\32\32\149\32","\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\131\129\130\130\131\32\134\32\130\131\129\130\131\129\130\131\129\130\131\129\32\129\32\32\129\32\32\129\32\32\129\32","\159\134\144\137\137\32\156\143\32\159\141\129\153\140\132\153\137\32\157\141\32\32\132\32\159\143\32\147\32\144\144\130\145\136\137\32\146\130\144\144\130\145\130\138\32\146\130\144","\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\149\32\149\131\147\129\138\134\149\149\32\149\149\32\149\149\32\149\149\32\149\154\143\149\32\157\129\154\143\149","\130\131\32\129\32\129\130\131\32\130\131\32\130\131\32\130\131\32\130\131\32\32\32\32\130\131\32\130\131\129\130\131\129\130\131\129\130\131\129\140\140\129\130\131\32\140\140\129"},{[[000110000110110000110010101000000010000000100101]],[[000000110110000000000010101000000010000000100101]],[[000000000000000000000000000000000000000000000000]],[[100010110100000010000110110000010100000100000110]],[[000000110000000010110110000110000000000000110000]],[[000000000000000000000000000000000000000000000000]],[[000000110110000010000000100000100000000000000010]],[[000000000110110100010000000010000000000000000100]],[[000000000000000000000000000000000000000000000000]],[[010000000000100110000000000000000000000110010000]],[[000000000000000000000000000010000000010110000000]],[[000000000000000000000000000000000000000000000000]],[[011110110000000100100010110000000100000000000000]],[[000000000000000000000000000000000000000000000000]],[[000000000000000000000000000000000000000000000000]],[[110000110110000000000000000000010100100010000000]],[[000010000000000000110110000000000100010010000000]],[[000000000000000000000000000000000000000000000000]],[[010110010110100110110110010000000100000110110110]],[[000000000000000000000110000000000110000000000000]],[[000000000000000000000000000000000000000000000000]],[[010100010110110000000000000000110000000010000000]],[[110110000000000000110000110110100000000010000000]],[[000000000000000000000000000000000000000000000000]],[[000100011111000100011111000100011111000100011111]],[[000000000000100100100100011011011011111111111111]],[[000000000000000000000000000000000000000000000000]],[[000100011111000100011111000100011111000100011111]],[[000000000000100100100100011011011011111111111111]],[[100100100100100100100100100100100100100100100100]],[[000000110100110110000010000011110000000000011000]],[[000000000100000000000010000011000110000000001000]],[[000000000000000000000000000000000000000000000000]],[[010000100100000000000000000100000000010010110000]],[[000000000000000000000000000000110110110110110000]],[[000000000000000000000000000000000000000000000000]],[[110110110110110110000000110110110110110110110110]],[[000000000000000000000110000000000000000000000000]],[[000000000000000000000000000000000000000000000000]],[[000000000000110110000110010000000000000000010010]],[[000010000000000000000000000000000000000000000000]],[[000000000000000000000000000000000000000000000000]],[[110110110110110110110000110110110110000000000000]],[[000000000000000000000110000000000000000000000000]],[[000000000000000000000000000000000000000000000000]],[[110110110110110110110000110000000000000000010000]],[[000000000000000000000000100000000000000110000110]],[[000000000000000000000000000000000000000000000000]]}}local m={}local n={}do local o=0;local p=#l[1]local q=#l[1][1]for r=1,p,3 do for s=1,q,3 do local t=string.char(o)local u={}u[1]=l[1][r]:sub(s,s+2)u[2]=l[1][r+1]:sub(s,s+2)u[3]=l[1][r+2]:sub(s,s+2)local v={}v[1]=l[2][r]:sub(s,s+2)v[2]=l[2][r+1]:sub(s,s+2)v[3]=l[2][r+2]:sub(s,s+2)n[t]={u,v}o=o+1 end end;m[1]=n end;local function w(x,y)local z={["0"]="1",["1"]="0"}if x<=#m then return true end;for A=#m+1,x do local B={}local C=m[A-1]for o=0,255 do local t=string.char(o)local u={}local v={}local D=C[t][1]local E=C[t][2]for r=1,#D do local F,G,H,I,J,K={},{},{},{},{},{}for s=1,#D[1]do local L=n[D[r]:sub(s,s)][1]table.insert(F,L[1])table.insert(G,L[2])table.insert(H,L[3])local M=n[D[r]:sub(s,s)][2]if E[r]:sub(s,s)=="1"then table.insert(I,M[1]:gsub("[01]",z))table.insert(J,M[2]:gsub("[01]",z))table.insert(K,M[3]:gsub("[01]",z))else table.insert(I,M[1])table.insert(J,M[2])table.insert(K,M[3])end end;table.insert(u,table.concat(F))table.insert(u,table.concat(G))table.insert(u,table.concat(H))table.insert(v,table.concat(I))table.insert(v,table.concat(J))table.insert(v,table.concat(K))end;B[t]={u,v}if y then y="Font"..A.."Yeld"..o;os.queueEvent(y)os.pullEvent(y)end end;m[A]=B end;return true end;local function N(O,P,Q,R,S)if not type(P)=="string"then error("Not a String",3)end;local T=type(Q)=="string"and Q:sub(1,1)or j[Q]or error("Wrong Front Color",3)local U=type(R)=="string"and R:sub(1,1)or j[R]or error("Wrong Back Color",3)if m[O]==nil then w(3,false)end;local V=m[O]or error("Wrong font size selected",3)if P==""then return{{""},{""},{""}}end;local W={}for r in P:gmatch('.')do table.insert(W,r)end;local X={}local p=#V[W[1]][1]for Y=1,p do local Z={}for r=1,#W do Z[r]=V[W[r]]and V[W[r]][1][Y]or""end;X[Y]=table.concat(Z)end;local _={}local a0={}local a1={["0"]=T,["1"]=U}local a2={["0"]=U,["1"]=T}for Y=1,p do local a3={}local a4={}for r=1,#W do local a5=V[W[r]]and V[W[r]][2][Y]or""a3[r]=a5:gsub("[01]",S and{["0"]=Q:sub(r,r),["1"]=R:sub(r,r)}or a1)a4[r]=a5:gsub("[01]",S and{["0"]=R:sub(r,r),["1"]=Q:sub(r,r)}or a2)end;_[Y]=table.concat(a3)a0[Y]=table.concat(a4)end;return{X,_,a0}end;local function a6(a7)local a8=a7;local a9,p=a8.getSize()local aa={}local ab={}local ac={}local ad={}local ae={}local af={}local ag;local ah={}local function ai()ag=(" "):rep(a9)for aj=0,15 do local ak=2^aj;local al=j[ak]ah[ak]=al:rep(a9)end end;ai()local function am()local an=ag;local ao=ah[colors.white]local ap=ah[colors.black]for aq=1,p do aa[aq]=i(aa[aq]==nil and an or aa[aq]..an:sub(1,a9-aa[aq]:len()),1,a9)ac[aq]=i(ac[aq]==nil and ao or ac[aq]..ao:sub(1,a9-ac[aq]:len()),1,a9)ab[aq]=i(ab[aq]==nil and ap or ab[aq]..ap:sub(1,a9-ab[aq]:len()),1,a9)end end;am()local function ar(as,at,au)if at>=1 and at<=p then if as+au:len()>0 and as<=a9 then local av=aa[at]local aw;local ax=as+#au-1;if as<1 then local ay=1-as+1;local az=a9-as+1;au=i(au,ay,az)elseif ax>a9 then local az=a9-as+1;au=i(au,1,az)end;if as>1 then local az=as-1;aw=i(av,1,az)..au else aw=au end;if ax=1 and at<=p then if as+aB:len()>0 and as<=a9 then local av=ab[at]local aw;local ax=as+#aB-1;if as<1 then aB=i(aB,1-as+1,a9-as+1)elseif ax>a9 then aB=i(aB,1,a9-as+1)end;if as>1 then aw=i(av,1,as-1)..aB else aw=aB end;if ax=1 and at<=p then if as+aB:len()>0 and as<=a9 then local av=ac[at]local aw;local ax=as+#aB-1;if as<1 then local ay=1-as+1;local az=a9-as+1;aB=i(aB,ay,az)elseif ax>a9 then local az=a9-as+1;aB=i(aB,1,az)end;if as>1 then local az=as-1;aw=i(av,1,az)..aB else aw=aB end;if ax1 then while#bj>2 do table.sort(bj,function(bt,bu)return bt[2]>bu[2]end)local bv,bw=bi(bj),#bj;local bx,by=bj[bw][1],bj[bv][1]for r=1,6 do if bn[r]==bx then bn[r]=by;bj[bv][2]=bj[bv][2]+1 end end;bj[bw]=nil end;local bz=128;for r=1,#bn-1 do if bn[r]~=bn[6]then bz=bz+2^(r-1)end end;return string.char(bz),bf[bj[1][1]==bn[6]and bj[2][1]or bj[1][1]],bf[bn[6]]else return"\128",bf[bn[1]],bf[bn[1]]end end;local bA,a9,p,aE={{},{},{}},0,#ba+#ba%3,bb or colors.black;for r=1,#ba do if#ba[r]>a9 then a9=#ba[r]end end;for at=0,p-1,3 do local bB,bC,bD,bE={},{},{},1;for as=0,a9-1,2 do local bn,bo={},{}for bF=1,3 do for bG=1,2 do bn[#bn+1]=ba[at+bF]and ba[at+bF][as+bG]and(ba[at+bF][as+bG]==0 and aE or ba[at+bF][as+bG])or aE;bo[bn[#bn]]=bo[bn[#bn]]and bo[bn[#bn]]+1 or 1 end end;bB[bE],bC[bE],bD[bE]=bm(bn,bo)bE=bE+1 end;bA[1][#bA[1]+1],bA[2][#bA[2]+1],bA[3][#bA[3]+1]=table.concat(bB),table.concat(bC),table.concat(bD)end;bA.width,bA.height=#bA[1][1],#bA[1]return bA end;local function bH(bI)local bJ="Object"local aS;local bK=1;local bL="left"local bM="top"local bN=false;local bO=false;local bP=true;local bQ=aL()local bR={x=1,y=1,width=1,height=1,bgColor=colors.black,fgColor=colors.white,name=bI or"Object",parent=nil,show=function(self)bO=true;bP=true;return self end,hide=function(self)bO=false;bP=true;return self end,isVisible=function(self)return bO end,setFocus=function(self)if self.parent~=nil then self.parent:setFocusedObject(self)end;return self end,setZIndex=function(self,aN)bK=aN;if self.parent~=nil then self.parent:removeObject(self)self.parent:addObject(self)end;return self end,getZIndex=function(self)return bK end,getType=function(self)return bJ end,getName=function(self)return self.name end,remove=function(self)if self.parent~=nil then self.parent:removeObject(self)end;return self end,setParent=function(self,bS)if bS.getType~=nil and bS:getType()=="Frame"then self:remove()bS:addObject(self)if self.draw then self:show()end end;return self end,setValue=function(self,bT)if aS~=bT then aS=bT;bP=true;self:valueChangedHandler()end;return self end,getValue=function(self)return aS end,getVisualChanged=function(self)return bP end,setVisualChanged=function(self,bU)bP=bU or true;if bU==nil then bP=true end;return self end,getEventSystem=function(self)return bQ end,getParent=function(self)return self.parent end,setPosition=function(self,bV,bW,bX)if bX then self.x,self.y=math.floor(self.x+bV),math.floor(self.y+bW)else self.x,self.y=math.floor(bV),math.floor(bW)end;bP=true;return self end,getPosition=function(self)return self.x,self.y end,getVisibility=function(self)return bO end,setVisibility=function(self,bY)bO=bY or not bO;bP=true;return self end,setSize=function(self,a9,p)self.width,self.height=a9,p;bP=true;return self end,getHeight=function(self)return self.height end,getWidth=function(self)return self.width end,getSize=function(self)return self.width,self.height end,setBackground=function(self,bZ)self.bgColor=bZ;bP=true;return self end,getBackground=function(self)return self.bgColor end,setForeground=function(self,bZ)self.fgColor=bZ;bP=true;return self end,getForeground=function(self)return self.fgColor end,draw=function(self)if bO then return true end;return false end,getAbsolutePosition=function(self,as,at)if as==nil or at==nil then as,at=self:getAnchorPosition()end;if self.parent~=nil then local b_,c0=self.parent:getAbsolutePosition(self.parent:getAnchorPosition())as=b_+as-1;at=c0+at-1 end;return as,at end,getAnchorPosition=function(self,as,at,c1)if as==nil then as=self.x end;if at==nil then at=self.y end;if bL=="right"then as=self.parent.width-as-self.width+2 end;if bM=="bottom"then at=self.parent.height-at-self.height+2 end;local c2,c3=self:getOffset()if not(bN or c1)then return as+c2,at+c3 end;return as,at end,getOffset=function(self)if self.parent~=nil then return self.parent:getFrameOffset()end;return 0,0 end,ignoreOffset=function(self,c4)bN=c4;if c4==nil then bN=true end;return self end,getBaseFrame=function(self)if self.parent~=nil then return self.parent:getBaseFrame()end;return self end,setAnchor=function(self,...)for aR,aS in pairs(table.pack(...))do if aS=="right"or aS=="left"then bL=aS end;if aS=="top"or aS=="bottom"then bM=aS end end;bP=true;return self end,getAnchor=function(self)return bL,bM end,onChange=function(self,aQ)self:registerEvent("value_changed",aQ)return self end,onClick=function(self,aQ)self:registerEvent("mouse_click",aQ)self:registerEvent("monitor_touch",aQ)return self end,onClickUp=function(self,aQ)self:registerEvent("mouse_up",aQ)return self end,onScroll=function(self,aQ)self:registerEvent("mouse_scroll",aQ)return self end,onDrag=function(self,aQ)self:registerEvent("mouse_drag",aQ)return self end,onEvent=function(self,aQ)self:registerEvent("custom_event_handler",aQ)return self end,onKey=function(self,aQ)self:registerEvent("key",aQ)self:registerEvent("char",aQ)return self end,onKeyUp=function(self,aQ)self:registerEvent("key_up",aQ)return self end,onBackgroundKey=function(self,aQ)self:registerEvent("background_key",aQ)self:registerEvent("background_char",aQ)return self end,onBackgroundKeyUp=function(self,aQ)self:registerEvent("background_key_up",aQ)return self end,isFocused=function(self)if self.parent~=nil then return self.parent:getFocusedObject()==self end;return false end,onGetFocus=function(self,aQ)self:registerEvent("get_focus",aQ)return self end,onLoseFocus=function(self,aQ)self:registerEvent("lose_focus",aQ)return self end,registerEvent=function(self,aO,aQ)return bQ:registerEvent(aO,aQ)end,removeEvent=function(self,aO,aN)return bQ:removeEvent(aO,aN)end,sendEvent=function(self,aO,...)return bQ:sendEvent(aO,self,...)end,mouseHandler=function(self,aO,c5,as,at)local c6,c7=self:getAbsolutePosition(self:getAnchorPosition())if c6<=as and c6+self.width>as and c7<=at and c7+self.height>at and bO then if self.parent~=nil then self.parent:setFocusedObject(self)end;bQ:sendEvent(aO,self,aO,c5,as,at)return true end;return false end,keyHandler=function(self,aO,bs)if self:isFocused()then bQ:sendEvent(aO,self,aO,bs)return true end;return false end,backgroundKeyHandler=function(self,aO,bs)bQ:sendEvent("background_"..aO,self,aO,bs)end,valueChangedHandler=function(self)bQ:sendEvent("value_changed",self)end,eventHandler=function(self,aO,c8,c9,ca,cb)bQ:sendEvent("custom_event_handler",self,aO,c8,c9,ca,cb)end,getFocusHandler=function(self)bQ:sendEvent("get_focus",self)end,loseFocusHandler=function(self)bQ:sendEvent("lose_focus",self)end}bR.__index=bR;return bR end;local function cc(bI)local bR={}local bJ="Animation"local cd;local ce={}local aN=1;local cf=0;local cg;local function ch()if ce[aN]~=nil then ce[aN].f(bR,aN)end;aN=aN+1;if ce[aN]~=nil then if ce[aN].t>0 then cd=os.startTimer(ce[aN].t)else ch()end end end;bR={name=bI,getType=function(self)return bJ end,getZIndex=function(self)return 1 end,getName=function(self)return self.name end,add=function(self,aQ,ci)cg=aQ;table.insert(ce,{f=aQ,t=ci or cf})return self end,wait=function(self,ci)cf=ci;return self end,rep=function(self,cj)for as=1,cj do table.insert(ce,{f=cg,t=cf})end;return self end,clear=function(self)ce={}cg=nil;cf=0;aN=1;return self end,play=function(self)aN=1;if ce[aN]~=nil then if ce[aN].t>0 then cd=os.startTimer(ce[aN].t)else ch()end end;return self end,cancel=function(self)os.cancelTimer(cd)return self end,eventHandler=function(self,aO,ck)if aO=="timer"and ck==cd then if ce[aN]~=nil then ch()end end end}bR.__index=bR;return bR end;local function cl(bI)local cm=bH(bI)local bJ="Button"cm:setValue("Button")cm:setZIndex(5)cm.width=8;cm.bgColor=k.ButtonBG;cm.fgColor=k.ButtonFG;local cn="center"local co="center"local bR={getType=function(self)return bJ end,setHorizontalAlign=function(self,cp)cn=cp end,setVerticalAlign=function(self,cp)co=cp end,setText=function(self,au)cm:setValue(au)return self end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()local cs=b5(self.height,co)self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)self.parent:drawForegroundBox(cq,cr,self.width,self.height,self.fgColor)self.parent:drawTextBox(cq,cr,self.width,self.height," ")for aj=1,self.height do if aj==cs then self.parent:setText(cq,cr+aj-1,b1(self:getValue(),self.width,cn))end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function ct(bI)local cm=bH(bI)local bJ="Checkbox"cm:setZIndex(5)cm:setValue(false)cm.width=1;cm.height=1;cm.bgColor=k.CheckboxBG;cm.fgColor=k.CheckboxFG;local bR={symbol="\42",getType=function(self)return bJ end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then if aO=="mouse_click"and c5==1 or aO=="monitor_touch"then if self:getValue()~=true and self:getValue()~=false then self:setValue(false)else self:setValue(not self:getValue())end end;return true end;return false end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()local cs=b5(self.height,"center")self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)for aj=1,self.height do if aj==cs then if self:getValue()==true then self.parent:writeText(cq,cr+aj-1,b1(self.symbol,self.width,"center"),self.bgColor,self.fgColor)else self.parent:writeText(cq,cr+aj-1,b1(" ",self.width,"center"),self.bgColor,self.fgColor)end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function cu(bI)local cm=bH(bI)local bJ="Dropdown"cm.width=12;cm.height=1;cm.bgColor=k.dropdownBG;cm.fgColor=k.dropdownFG;cm:setZIndex(6)local cv={}local cw=k.selectionBG;local cx=k.selectionFG;local cy=true;local cz="left"local cA=0;local cB=16;local cC=6;local cD="\16"local cE="\31"local cF=false;local bR={getType=function(self)return bJ end,setIndexOffset=function(self,cG)cA=cG;return self end,getIndexOffset=function(self)return cA end,addItem=function(self,au,aE,aF,...)table.insert(cv,{text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})return self end,getAll=function(self)return cv end,removeItem=function(self,aN)table.remove(cv,aN)return self end,getItem=function(self,aN)return cv[aN]end,getItemIndex=function(self)local cH=self:getValue()for bs,aS in pairs(cv)do if aS==cH then return bs end end end,clear=function(self)cv={}self:setValue({})return self end,getItemCount=function(self)return#cv end,editItem=function(self,aN,au,aE,aF,...)table.remove(cv,aN)table.insert(cv,aN,{text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})return self end,selectItem=function(self,aN)self:setValue(cv[aN]or{})return self end,setSelectedItem=function(self,aE,aF,cI)cw=aE or self.bgColor;cx=aF or self.fgColor;cy=cI;return self end,setDropdownSize=function(self,a9,p)cB,cC=a9,p;return self end,mouseHandler=function(self,aO,c5,as,at)if cF then local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if aO=="mouse_click"and c5==1 or aO=="monitor_touch"then if#cv>0 then for aj=1,cC do if cv[aj+cA]~=nil then if cq<=as and cq+cB>as and cr+aj==at then self:setValue(cv[aj+cA])return true end end end end end;if aO=="mouse_scroll"then cA=cA+c5;if cA<0 then cA=0 end;if c5==1 then if#cv>cC then if cA>#cv-cC then cA=#cv-cC end else cA=cv-1 end end;return true end;self:setVisualChanged()end;if cm.mouseHandler(self,aO,c5,as,at)then cF=true else cF=false end end,draw=function(self)if cm.draw(self)then local cq,cr=self:getAnchorPosition()if self.parent~=nil then self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)local cJ=self:getValue()local au=b1(cJ~=nil and cJ.text or"",self.width,cz):sub(1,self.width-1)..(cF and cE or cD)self.parent:writeText(cq,cr,au,self.bgColor,self.fgColor)if cF then for aj=1,cC do if cv[aj+cA]~=nil then if cv[aj+cA]==cJ then if cy then self.parent:writeText(cq,cr+aj,b1(cv[aj+cA].text,cB,cz),cw,cx)else self.parent:writeText(cq,cr+aj,b1(cv[aj+cA].text,cB,cz),cv[aj+cA].bgCol,cv[aj+cA].fgCol)end else self.parent:writeText(cq,cr+aj,b1(cv[aj+cA].text,cB,cz),cv[aj+cA].bgCol,cv[aj+cA].fgCol)end end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function cK(bI)local cm=bH(bI)local bJ="Image"cm:setZIndex(2)local cL;local cM;local cN=false;local function b9()local bc={[0]={8,4,3,6,5},{4,14,8,7},{6,10,8,7},{9,11,8,0},{1,14,8,0},{13,12,8,0},{2,10,8,0},{15,8,10,11,12,14},{0,7,1,9,2,13},{3,11,8,7},{2,6,7,15},{9,3,7,15},{13,5,7,15},{5,12,8,7},{1,4,7,15},{7,10,11,12,14}}local bd,be,bf={},{},{}for r=0,15 do be[2^r]=r end;do local bg="0123456789abcdef"for r=1,16 do bd[bg:sub(r,r)]=r-1;bd[r-1]=bg:sub(r,r)bf[bg:sub(r,r)]=2^(r-1)bf[2^(r-1)]=bg:sub(r,r)local bh=bc[r-1]for r=1,#bh do bh[r]=2^bh[r]end end end;local function bi(bj)local bk=bc[be[bj[#bj][1]]]for s=1,#bk do local bl=bk[s]for r=1,#bj-1 do if bj[r][1]==bl then return r end end end;return 1 end;local function bm(bn,bo)if not bo then local bp={}bo={}for r=1,6 do local bq=bn[r]local br=bo[bq]bo[bq],bp[r]=br and br+1 or 1,bq end;bn=bp end;local bj={}for bs,aS in pairs(bo)do bj[#bj+1]={bs,aS}end;if#bj>1 then while#bj>2 do table.sort(bj,function(bt,bu)return bt[2]>bu[2]end)local bv,bw=bi(bj),#bj;local bx,by=bj[bw][1],bj[bv][1]for r=1,6 do if bn[r]==bx then bn[r]=by;bj[bv][2]=bj[bv][2]+1 end end;bj[bw]=nil end;local bz=128;for r=1,#bn-1 do if bn[r]~=bn[6]then bz=bz+2^(r-1)end end;return string.char(bz),bf[bj[1][1]==bn[6]and bj[2][1]or bj[1][1]],bf[bn[6]]else return"\128",bf[bn[1]],bf[bn[1]]end end;local bA,a9,p,aE={{},{},{}},0,#cL+#cL%3,cm.bgColor or colors.black;for r=1,#cL do if#cL[r]>a9 then a9=#cL[r]end end;for at=0,p-1,3 do local bB,bC,bD,bE={},{},{},1;for as=0,a9-1,2 do local bn,bo={},{}for bF=1,3 do for bG=1,2 do bn[#bn+1]=cL[at+bF]and cL[at+bF][as+bG]and(cL[at+bF][as+bG]==0 and aE or cL[at+bF][as+bG])or aE;bo[bn[#bn]]=bo[bn[#bn]]and bo[bn[#bn]]+1 or 1 end end;bB[bE],bC[bE],bD[bE]=bm(bn,bo)bE=bE+1 end;bA[1][#bA[1]+1],bA[2][#bA[2]+1],bA[3][#bA[3]+1]=table.concat(bB),table.concat(bC),table.concat(bD)end;bA.width,bA.height=#bA[1][1],#bA[1]cM=bA end;local bR={getType=function(self)return bJ end,loadImage=function(self,aW)cL=paintutils.loadImage(aW)cN=false;return self end,loadBlittleImage=function(self,aW)cN=true;return self end,shrink=function(self)b9()cN=true;return self end,draw=function(self)if cm.draw(self)then if self.parent~=nil then if cL~=nil then local cq,cr=self:getAnchorPosition()if cN then local b8,cO,cP=cM[1],cM[2],cM[3]for r=1,cM.height do local cQ=b8[r]if type(cQ)=="string"then self.parent:setText(cq,cr+r-1,cQ)self.parent:setFG(cq,cr+r-1,cO[r])self.parent:setBG(cq,cr+r-1,cP[r])elseif type(cQ)=="table"then self.parent:setText(cq,cr+r-1,cQ[2])self.parent:setFG(cq,cr+r-1,cO[r])self.parent:setBG(cq,cr+r-1,cP[r])end end else for bW=1,math.min(#cL,self.height)do local cR=cL[bW]for bV=1,math.min(#cR,self.width)do if cR[bV]>0 then self.parent:drawBackgroundBox(cq+bV-1,cr+bW-1,1,1,cR[bV])end end end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function cS(bI)local cm=bH(bI)local bJ="Input"local cT="text"local cU=0;cm:setZIndex(5)cm:setValue("")cm.width=10;cm.height=1;cm.bgColor=k.InputBG;cm.fgColor=k.InputFG;local cV=1;local cW=1;local cX=""local cY;local cZ;local c_=cX;local d0=false;local bR={getType=function(self)return bJ end,setInputType=function(self,d1)if d1=="password"or d1=="number"or d1=="text"then cT=d1 end;return self end,setDefaultText=function(self,au,d2,d3)cX=au;cY=d3 or cY;cZ=d2 or cZ;if self:isFocused()then c_=""else c_=cX end;return self end,getInputType=function(self)return cT end,setValue=function(self,cJ)cm.setValue(self,tostring(cJ))if not d0 then cV=tostring(cJ):len()+1 end;return self end,getValue=function(self)local cJ=cm.getValue(self)return cT=="number"and tonumber(cJ)or cJ end,setInputLimit=function(self,d4)cU=tonumber(d4)or cU;return self end,getInputLimit=function(self)return cU end,getFocusHandler=function(self)cm.getFocusHandler(self)if self.parent~=nil then local cq,cr=self:getAnchorPosition()c_=""if self.parent~=nil then self.parent:setCursor(true,cq+cV-cW,cr,self.fgColor)end end end,loseFocusHandler=function(self)cm.loseFocusHandler(self)if self.parent~=nil then self.parent:setCursor(false)c_=cX end end,keyHandler=function(self,aO,bs)if cm.keyHandler(self,aO,bs)then d0=true;if aO=="key"then if bs==keys.backspace then local au=tostring(cm.getValue())if cV>1 then self:setValue(au:sub(1,cV-2)..au:sub(cV,au:len()))if cV>1 then cV=cV-1 end;if cW>1 then if cVd5 then cV=d5+1 end;if cV<1 then cV=1 end;if cV=self.width+cW then cW=cV-self.width+1 end;if cW<1 then cW=1 end end;if bs==keys.left then cV=cV-1;if cV>=1 then if cV=self.width+cW then cW=cV end end;if cV<1 then cV=1 end;if cW<1 then cW=1 end end end;if aO=="char"then local au=cm.getValue()if au:len()=self.width+cW then cW=cW+1 end end end;local cq,cr=self:getAnchorPosition()local cJ=tostring(cm.getValue())local d7=(cV<=cJ:len()and cV-1 or cJ:len())-(cW-1)if d7>self.x+self.width-1 then d7=self.x+self.width-1 end;if self.parent~=nil then self.parent:setCursor(true,cq+d7,cr,self.fgColor)end;d0=false end end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then if aO=="mouse_click"and c5==1 then end;return true end;return false end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()local cs=b5(self.height,"center")self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)for aj=1,self.height do if aj==cs then local cJ=tostring(cm.getValue())local d3=self.bgColor;local d2=self.fgColor;local au;if cJ:len()<=0 then au=c_;d3=cY or d3;d2=cZ or d2 end;au=c_;if cJ~=""then au=cJ end;au=au:sub(cW,self.width+cW-1)local d8=self.width-au:len()if d8<0 then d8=0 end;if cT=="password"and cJ~=""then au=string.rep("*",au:len())end;au=au..string.rep(" ",d8)self.parent:writeText(cq,cr+aj-1,au,d3,d2)end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function d9(bI)local cm=bH(bI)local bJ="Label"cm:setZIndex(3)cm.fgColor=colors.white;cm.bgcolor=colors.black;local da=true;cm:setValue("")local cn="left"local co="top"local db=0;local bR={getType=function(self)return bJ end,setText=function(self,au)au=tostring(au)cm:setValue(au)if da then self.width=au:len()end;return self end,setTextAlign=function(self,dc,dd)cn=dc or cn;co=dd or co;self:setVisualChanged()return self end,setFontSize=function(self,x)if x>0 and x<=4 then db=x-1 or 0 end;return self end,getFontSize=function(self)return db+1 end,setSize=function(self,a9,p)cm.setSize(self,a9,p)da=false;self:setVisualChanged()return self end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()local cs=b5(self.height,co)self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)self.parent:drawForegroundBox(cq,cr,self.width,self.height,self.fgColor)self.parent:drawTextBox(cq,cr,self.width,self.height," ")if db==0 then for aj=1,self.height do if aj==cs then self.parent:writeText(cq,cr+aj-1,b1(self:getValue(),self.width,cn),self.bgColor,self.fgColor)end end else local de=N(db,self:getValue(),self.fgColor,self.bgColor)if da then self.height=#de[1]-1;self.width=#de[1][1]end;for aj=1,self.height do if aj==cs then local df,dg=self.parent:getSize()local dh,di=#de[1][1],#de[1]cq=cq or math.floor((df-dh)/2)+1;cr=cr or math.floor((dg-di)/2)+1;for r=1,di do self.parent:setFG(cq,cr+r+aj-2,b1(de[2][r],self.width,cn))self.parent:setBG(cq,cr+r+aj-2,b1(de[3][r],self.width,cn,j[self.bgColor]))self.parent:setText(cq,cr+r+aj-2,b1(de[1][r],self.width,cn))end end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function dj(bI)local cm=bH(bI)local bJ="List"cm.width=16;cm.height=6;cm.bgColor=k.listBG;cm.fgColor=k.listFG;cm:setZIndex(5)local cv={}local cw=k.selectionBG;local cx=k.selectionFG;local cy=true;local cz="left"local cA=0;local dk=true;local bR={getType=function(self)return bJ end,addItem=function(self,au,aE,aF,...)table.insert(cv,{text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})if#cv==1 then self:setValue(cv[1])end;return self end,setIndexOffset=function(self,cG)cA=cG;return self end,getIndexOffset=function(self)return cA end,removeItem=function(self,aN)table.remove(cv,aN)return self end,getItem=function(self,aN)return cv[aN]end,getAll=function(self)return cv end,getItemIndex=function(self)local cH=self:getValue()for bs,aS in pairs(cv)do if aS==cH then return bs end end end,clear=function(self)cv={}self:setValue({})return self end,getItemCount=function(self)return#cv end,editItem=function(self,aN,au,aE,aF,...)table.remove(cv,aN)table.insert(cv,aN,{text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})return self end,selectItem=function(self,aN)self:setValue(cv[aN]or{})return self end,setSelectedItem=function(self,aE,aF,cI)cw=aE or self.bgColor;cx=aF or self.fgColor;cy=cI;return self end,setScrollable=function(self,dl)dk=dl;return self end,mouseHandler=function(self,aO,c5,as,at)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if cq<=as and cq+self.width>as and cr<=at and cr+self.height>at and self:isVisible()then if(aO=="mouse_click"or aO=="mouse_drag")and c5==1 or aO=="monitor_touch"then if#cv>0 then for aj=1,self.height do if cv[aj+cA]~=nil then if cq<=as and cq+self.width>as and cr+aj-1==at then self:setValue(cv[aj+cA])self:getEventSystem():sendEvent("mouse_click",self,"mouse_click",0,as,at,cv[aj+cA])end end end end end;if aO=="mouse_scroll"and dk then cA=cA+c5;if cA<0 then cA=0 end;if c5>=1 then if#cv>self.height then if cA>#cv-self.height then cA=#cv-self.height end;if cA>=#cv then cA=#cv-1 end else cA=cA-1 end end end;self:setVisualChanged()return true end end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)for aj=1,self.height do if cv[aj+cA]~=nil then if cv[aj+cA]==self:getValue()then if cy then self.parent:writeText(cq,cr+aj-1,b1(cv[aj+cA].text,self.width,cz),cw,cx)else self.parent:writeText(cq,cr+aj-1,b1(cv[aj+cA].text,self.width,cz),cv[aj+cA].bgCol,cv[aj+cA].fgCol)end else self.parent:writeText(cq,cr+aj-1,b1(cv[aj+cA].text,self.width,cz),cv[aj+cA].bgCol,cv[aj+cA].fgCol)end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function dm(bI)local cm=bH(bI)local bJ="Menubar"local bR={}cm.width=30;cm.height=1;cm.bgColor=colors.gray;cm.fgColor=colors.lightGray;cm:setZIndex(5)local cv={}local cw=k.selectionBG;local cx=k.selectionFG;local cy=true;local cz="left"local dn=0;local d8=1;local dk=false;local function dp()local dq=0;local bV=0;for aj=1,#cv do if bV+cv[aj].text:len()+d8*2>bR.width then if bVdq then dn=dq end;return self end,getPositionOffset=function(self)return dn end,setScrollable=function(self,dl)dk=dl;if dl==nil then dk=true end;return self end,removeItem=function(self,aN)table.remove(cv,aN)return self end,getItem=function(self,aN)return cv[aN]end,getItemCount=function(self)return#cv end,editItem=function(self,aN,au,aE,aF,...)table.remove(cv,aN)table.insert(cv,aN,{text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})return self end,selectItem=function(self,aN)self:setValue(cv[aN]or{})return self end,setSelectedItem=function(self,aE,aF,cI)cw=aE or self.bgColor;cx=aF or self.fgColor;cy=cI;return self end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then local c6,c7=self:getAbsolutePosition(self:getAnchorPosition())if c6<=as and c6+self.width>as and c7<=at and c7+self.height>at and self:isVisible()then if self.parent~=nil then self.parent:setFocusedObject(self)end;if aO=="mouse_click"or aO=="monitor_touch"then local bV=0;for aj=1,#cv do if cv[aj]~=nil then if c6+bV<=as+dn and c6+bV+cv[aj].text:len()+d8*2>as+dn and c7==at then self:setValue(cv[aj])self:getEventSystem():sendEvent(aO,self,aO,0,as,at,cv[aj])end;bV=bV+cv[aj].text:len()+d8*2 end end end;if aO=="mouse_scroll"and dk then dn=dn+c5;if dn<0 then dn=0 end;local dq=dp()if dn>dq then dn=dq end end;self:setVisualChanged(true)return true end end;return false end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)local au=""local ds=""local dt=""for aR,du in pairs(cv)do local dv=(" "):rep(d8)..du.text..(" "):rep(d8)au=au..dv;if du==self:getValue()then ds=ds..j[cw or du.bgCol or self.bgColor]:rep(dv:len())dt=dt..j[cx or du.FgCol or self.fgColor]:rep(dv:len())else ds=ds..j[du.bgCol or self.bgColor]:rep(dv:len())dt=dt..j[du.FgCol or self.fgColor]:rep(dv:len())end end;self.parent:setText(cq,cr,au:sub(dn+1,self.width+dn))self.parent:setBG(cq,cr,ds:sub(dn+1,self.width+dn))self.parent:setFG(cq,cr,dt:sub(dn+1,self.width+dn))end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function dw(bI)local cm=bH(bI)local bJ="Pane"local bR={getType=function(self)return bJ end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)self.parent:drawForegroundBox(cq,cr,self.width,self.height,self.bgColor)end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function dx(bI)local cm=bH(bI)local bJ="Program"cm:setZIndex(5)local bR;local function dy(as,at,a9,p)local dz,dA=1,1;local bb,dB=colors.black,colors.white;local dC=false;local dD=false;local aa={}local ab={}local ac={}local dE={}local ag;local ah={}for r=0,15 do local dF=2^r;dE[dF]={h.getPaletteColour(dF)}end;local function ai()ag=(" "):rep(a9)for aj=0,15 do local ak=2^aj;local al=j[ak]ah[ak]=al:rep(a9)end end;local function am()ai()local an=ag;local ao=ah[colors.white]local ap=ah[colors.black]for aj=1,p do aa[aj]=i(aa[aj]==nil and an or aa[aj]..an:sub(1,a9-aa[aj]:len()),1,a9)ac[aj]=i(ac[aj]==nil and ao or ac[aj]..ao:sub(1,a9-ac[aj]:len()),1,a9)ab[aj]=i(ab[aj]==nil and ap or ab[aj]..ap:sub(1,a9-ab[aj]:len()),1,a9)end end;am()local function dG()if dz>=1 and dA>=1 and dz<=a9 and dA<=p then else end end;local function dH(dI,dJ,dK)local dL=dz;local ax=dL+#dI-1;if dA>=1 and dA<=p then if dL<=a9 and ax>=1 then if dL==1 and ax==a9 then aa[dA]=dI;ac[dA]=dJ;ab[dA]=dK else local dM,dN,dO;if dL<1 then local dP=1-dL+1;local dQ=a9-dL+1;dM=i(dI,dP,dQ)dN=i(dJ,dP,dQ)dO=i(dK,dP,dQ)elseif ax>a9 then local dQ=a9-dL+1;dM=i(dI,1,dQ)dN=i(dJ,1,dQ)dO=i(dK,1,dQ)else dM=dI;dN=dJ;dO=dK end;local dR=aa[dA]local dS=ac[dA]local dT=ab[dA]local dU,dV,dW;if dL>1 then local dX=dL-1;dU=i(dR,1,dX)..dM;dV=i(dS,1,dX)..dN;dW=i(dT,1,dX)..dO else dU=dM;dV=dN;dW=dO end;if ax=1 and at<=p then aa[ej]=aa[at]ab[ej]=ab[at]ac[ej]=ac[at]else aa[ej]=eg;ac[ej]=eh;ab[ej]=ei end end end;if dD then dG()end end,isColor=function()return h.isColor()end,isColour=function()return h.isColor()end,write=function(au)au=tostring(au)if dD then dH(au,j[dB]:rep(au:len()),j[bb]:rep(au:len()))end end,clearLine=function()if dD then ar(1,dA,(" "):rep(a9))aA(1,dA,j[bb]:rep(a9))aC(1,dA,j[dB]:rep(a9))end;if dD then dG()end end,clear=function()for aj=1,p do ar(1,aj,(" "):rep(a9))aA(1,aj,j[bb]:rep(a9))aC(1,aj,j[dB]:rep(a9))end;if dD then dG()end end,blit=function(au,ek,el)if type(au)~="string"then error("bad argument #1 (expected string, got "..type(au)..")",2)end;if type(ek)~="string"then error("bad argument #2 (expected string, got "..type(ek)..")",2)end;if type(el)~="string"then error("bad argument #3 (expected string, got "..type(el)..")",2)end;if#ek~=#au or#el~=#au then error("Arguments must be the same length",2)end;if dD then dH(au,ek,el)end end}return eb end;cm.width=30;cm.height=12;local em=dy(1,1,cm.width,cm.height)local en;local eo=false;local ep={}bR={getType=function(self)return bJ end,show=function(self)cm.show(self)em.setBackgroundColor(self.bgColor)em.setTextColor(self.fgColor)em.basalt_setVisible(true)return self end,hide=function(self)cm.hide(self)em.basalt_setVisible(false)return self end,setPosition=function(self,as,at,bX)cm.setPosition(self,as,at,bX)em.basalt_reposition(self:getAnchorPosition())return self end,getBasaltWindow=function()return em end,getBasaltProcess=function()return en end,setSize=function(self,a9,p)cm.setSize(self,a9,p)em.basalt_resize(self.width,self.height)return self end,getStatus=function(self)if en~=nil then return en:getStatus()end;return"inactive"end,execute=function(self,aW,...)en=aU:new(aW,em,...)em.setBackgroundColor(colors.black)em.setTextColor(colors.white)em.clear()em.setCursorPos(1,1)en:resume()eo=false;return self end,stop=function(self)if en~=nil then if not en:isDead()then en:resume("terminate")if en:isDead()then if self.parent~=nil then self.parent:setCursor(false)end end end end;return self end,pause=function(self,eq)eo=eq or not eo;if en~=nil then if not en:isDead()then if not eo then self:injectEvents(ep)ep={}end end end;return self end,isPaused=function(self)return eo end,injectEvent=function(self,aO,c8,c9,ca,cb,er)if en~=nil then if not en:isDead()then if eo==false or er then en:resume(aO,c8,c9,ca,cb)else table.insert(ep,{event=aO,args={c8,c9,ca,cb}})end end end;return self end,getQueuedEvents=function(self)return ep end,updateQueuedEvents=function(self,aM)ep=aM or ep;return self end,injectEvents=function(self,aM)if en~=nil then if not en:isDead()then for aR,aS in pairs(aM)do en:resume(aS.event,table.unpack(aS.args))end end end;return self end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then if en==nil then return false end;if not en:isDead()then if not eo then local es,et=self:getAbsolutePosition(self:getAnchorPosition(nil,nil,true))en:resume(aO,c5,as-(es-1),at-(et-1))end end;return true end end,keyHandler=function(self,aO,bs)cm.keyHandler(self,aO,bs)if self:isFocused()then if en==nil then return false end;if not en:isDead()then if not eo then if self.draw then en:resume(aO,bs)end end end end end,getFocusHandler=function(self)cm.getFocusHandler(self)if en~=nil then if not en:isDead()then if not eo then if self.parent~=nil then local eu,ev=em.getCursorPos()local cq,cr=self:getAnchorPosition()if self.parent~=nil then if cq+eu-1>=1 and cq+eu-1<=cq+self.width-1 and ev+cr-1>=1 and ev+cr-1<=cr+self.height-1 then self.parent:setCursor(em.getCursorBlink(),cq+eu-1,ev+cr-1,em.getTextColor())end end end end end end end,loseFocusHandler=function(self)cm.loseFocusHandler(self)if en~=nil then if not en:isDead()then if self.parent~=nil then self.parent:setCursor(false)end end end end,eventHandler=function(self,aO,c8,c9,ca,cb)if en==nil then return end;if not en:isDead()then if not eo then if aO~="mouse_click"and aO~="monitor_touch"and aO~="mouse_up"and aO~="mouse_scroll"and aO~="mouse_drag"and aO~="key_up"and aO~="key"and aO~="char"and aO~="terminate"then en:resume(aO,c8,c9,ca,cb)end;if self:isFocused()then local cq,cr=self:getAnchorPosition()local eu,ev=em.getCursorPos()if self.parent~=nil then if cq+eu-1>=1 and cq+eu-1<=cq+self.width-1 and ev+cr-1>=1 and ev+cr-1<=cr+self.height-1 then self.parent:setCursor(em.getCursorBlink(),cq+eu-1,ev+cr-1,em.getTextColor())end end;if aO=="terminate"and self:isFocused()then self:stop()end end else if aO~="mouse_click"and aO~="monitor_touch"and aO~="mouse_up"and aO~="mouse_scroll"and aO~="mouse_drag"and aO~="key_up"and aO~="key"and aO~="char"and aO~="terminate"then table.insert(ep,{event=aO,args={c8,c9,ca,cb}})end end end end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()em.basalt_reposition(cq,cr)self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)em.basalt_update()end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function ew(bI)local cm=bH(bI)local bJ="Progressbar"local ex=0;cm:setZIndex(5)cm:setValue(false)cm.width=25;cm.height=1;cm.bgColor=k.CheckboxBG;cm.fgColor=k.CheckboxFG;local ey=colors.black;local ez=""local eA=colors.white;local eB=""local eC=0;local bR={getType=function(self)return bJ end,setDirection=function(self,eD)eC=eD;return self end,setProgressBar=function(self,bZ,aG,eE)ey=bZ or ey;ez=aG or ez;eA=eE or eA;return self end,setBackgroundSymbol=function(self,aG)eB=aG:sub(1,1)return self end,setProgress=function(self,aS)if aS>=0 and aS<=100 and ex~=aS then ex=aS;self:setValue(ex)if ex==100 then self:progressDoneHandler()end end;return self end,getProgress=function(self)return ex end,onProgressDone=function(self,A)self:registerEvent("progress_done",A)return self end,progressDoneHandler=function(self)self:sendEvent("progress_done")end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)self.parent:drawForegroundBox(cq,cr,self.width,self.height,self.fgColor)self.parent:drawTextBox(cq,cr,self.width,self.height,eB)if eC==1 then self.parent:drawBackgroundBox(cq,cr,self.width,self.height/100*ex,ey)self.parent:drawForegroundBox(cq,cr,self.width,self.height/100*ex,eA)self.parent:drawTextBox(cq,cr,self.width,self.height/100*ex,ez)elseif eC==2 then self.parent:drawBackgroundBox(cq,cr+math.ceil(self.height-self.height/100*ex),self.width,self.height/100*ex,ey)self.parent:drawForegroundBox(cq,cr+math.ceil(self.height-self.height/100*ex),self.width,self.height/100*ex,eA)self.parent:drawTextBox(cq,cr+math.ceil(self.height-self.height/100*ex),self.width,self.height/100*ex,ez)elseif eC==3 then self.parent:drawBackgroundBox(cq+math.ceil(self.width-self.width/100*ex),cr,self.width/100*ex,self.height,ey)self.parent:drawForegroundBox(cq+math.ceil(self.width-self.width/100*ex),cr,self.width/100*ex,self.height,eA)self.parent:drawTextBox(cq+math.ceil(self.width-self.width/100*ex),cr,self.width/100*ex,self.height,ez)else self.parent:drawBackgroundBox(cq,cr,self.width/100*ex,self.height,ey)self.parent:drawForegroundBox(cq,cr,self.width/100*ex,self.height,eA)self.parent:drawTextBox(cq,cr,self.width/100*ex,self.height,ez)end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function eF(bI)local cm=bH(bI)local bJ="Radio"cm.width=8;cm.bgColor=k.listBG;cm.fgColor=k.listFG;cm:setZIndex(5)local cv={}local cw=k.selectionBG;local cx=k.selectionFG;local eG=cm.bgColor;local eH=cm.fgColor;local cy=true;local aG="\7"local cz="left"local bR={getType=function(self)return bJ end,addItem=function(self,au,as,at,aE,aF,...)table.insert(cv,{x=as or 1,y=at or 1,text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})if#cv==1 then self:setValue(cv[1])end;return self end,getAll=function(self)return cv end,removeItem=function(self,aN)table.remove(cv,aN)return self end,getItem=function(self,aN)return cv[aN]end,getItemIndex=function(self)local cH=self:getValue()for bs,aS in pairs(cv)do if aS==cH then return bs end end end,clear=function(self)cv={}self:setValue({})return self end,getItemCount=function(self)return#cv end,editItem=function(self,aN,au,as,at,aE,aF,...)table.remove(cv,aN)table.insert(cv,aN,{x=as or 1,y=at or 1,text=au,bgCol=aE or self.bgColor,fgCol=aF or self.fgColor,args={...}})return self end,selectItem=function(self,aN)self:setValue(cv[aN]or{})return self end,setSelectedItem=function(self,aE,aF,eI,eJ,cI)cw=aE or cw;cx=aF or cx;eG=eI or eG;eH=eJ or eH;cy=cI;return self end,mouseHandler=function(self,aO,c5,as,at)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if aO=="mouse_click"and c5==1 or aO=="monitor_touch"then if#cv>0 then for aR,aS in pairs(cv)do if cq+aS.x-1<=as and cq+aS.x-1+aS.text:len()+2>=as and cr+aS.y-1==at then self:setValue(aS)if self.parent~=nil then self.parent:setFocusedObject(self)end;self:setVisualChanged()return true end end end end;return false end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()for aR,aS in pairs(cv)do if aS==self:getValue()then if cz=="left"then self.parent:writeText(aS.x+cq-1,aS.y+cr-1,aG,eG,eH)self.parent:writeText(aS.x+2+cq-1,aS.y+cr-1,aS.text,cw,cx)end else self.parent:drawBackgroundBox(aS.x+cq-1,aS.y+cr-1,1,1,self.bgColor)self.parent:writeText(aS.x+2+cq-1,aS.y+cr-1,aS.text,aS.bgCol,aS.fgCol)end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function eK(bI)local cm=bH(bI)local bJ="Scrollbar"cm.width=1;cm.height=8;cm.bgColor=colors.lightGray;cm.fgColor=colors.gray;cm:setValue(1)cm:setZIndex(2)local eL="vertical"local aG=" "local eM=colors.black;local eN="\127"local eO=cm.height;local aN=1;local eP=1;local bR={getType=function(self)return bJ end,setSymbol=function(self,eQ)aG=eQ:sub(1,1)self:setVisualChanged()return self end,setSymbolSize=function(self,x)eP=tonumber(x)or 1;if eL=="vertical"then self:setValue(aN-1*eO/(self.height-(eP-1))-eO/(self.height-(eP-1)))elseif eL=="horizontal"then self:setValue(aN-1*eO/(self.width-(eP-1))-eO/(self.width-(eP-1)))end;self:setVisualChanged()return self end,setMaxValue=function(self,cJ)eO=cJ;return self end,setBackgroundSymbol=function(self,eR)eN=string.sub(eR,1,1)self:setVisualChanged()return self end,setSymbolColor=function(self,eS)eM=eS;self:setVisualChanged()return self end,setBarType=function(self,eT)eL=eT:lower()return self end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if(aO=="mouse_click"or aO=="mouse_drag")and c5==1 or aO=="monitor_touch"then if eL=="horizontal"then for eU=0,self.width do if cq+eU==as and cr<=at and cr+self.height>at then aN=math.min(eU+1,self.width-(eP-1))self:setValue(eO/self.width*aN)self:setVisualChanged()end end end;if eL=="vertical"then for eU=0,self.height do if cr+eU==at and cq<=as and cq+self.width>as then aN=math.min(eU+1,self.height-(eP-1))self:setValue(eO/self.height*aN)self:setVisualChanged()end end end end;if aO=="mouse_scroll"then aN=aN+c5;if aN<1 then aN=1 end;aN=math.min(aN,(eL=="vertical"and self.height or self.width)-(eP-1))self:setValue(eO/(eL=="vertical"and self.height or self.width)*aN)end;return true end end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()if eL=="horizontal"then self.parent:writeText(cq,cr,eN:rep(aN-1),self.bgColor,self.fgColor)self.parent:writeText(cq+aN-1,cr,aG:rep(eP),eM,eM)self.parent:writeText(cq+aN+eP-1,cr,eN:rep(self.width-(aN+eP-1)),self.bgColor,self.fgColor)end;if eL=="vertical"then for aj=0,self.height-1 do if aN==aj+1 then for eV=0,math.min(eP-1,self.height)do self.parent:writeText(cq,cr+aj+eV,aG,eM,eM)end else if aj+1aN-1+eP then self.parent:writeText(cq,cr+aj,eN,self.bgColor,self.fgColor)end end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function eW(bI)local cm=bH(bI)local bJ="Slider"cm.width=8;cm.height=1;cm.bgColor=colors.lightGray;cm.fgColor=colors.gray;cm:setValue(1)local eL="horizontal"local aG=" "local eM=colors.black;local eN="\140"local eO=cm.width;local aN=1;local eP=1;local bR={getType=function(self)return bJ end,setSymbol=function(self,eQ)aG=eQ:sub(1,1)self:setVisualChanged()return self end,setSymbolSize=function(self,x)eP=tonumber(x)or 1;if eL=="vertical"then self:setValue(aN-1*eO/(self.height-(eP-1))-eO/(self.height-(eP-1)))elseif eL=="horizontal"then self:setValue(aN-1*eO/(self.width-(eP-1))-eO/(self.width-(eP-1)))end;self:setVisualChanged()return self end,setMaxValue=function(self,cJ)eO=cJ;return self end,setBackgroundSymbol=function(self,eR)eN=string.sub(eR,1,1)self:setVisualChanged()return self end,setSymbolColor=function(self,eS)eM=eS;self:setVisualChanged()return self end,setBarType=function(self,eT)eL=eT:lower()return self end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if(aO=="mouse_click"or aO=="mouse_drag")and c5==1 or aO=="monitor_touch"then if eL=="horizontal"then for eU=0,self.width do if cq+eU==as and cr<=at and cr+self.height>at then aN=math.min(eU+1,self.width-(eP-1))self:setValue(eO/self.width*aN)self:setVisualChanged()end end end;if eL=="vertical"then for eU=0,self.height do if cr+eU==at and cq<=as and cq+self.width>as then aN=math.min(eU+1,self.height-(eP-1))self:setValue(eO/self.height*aN)self:setVisualChanged()end end end end;if aO=="mouse_scroll"then aN=aN+c5;if aN<1 then aN=1 end;aN=math.min(aN,(eL=="vertical"and self.height or self.width)-(eP-1))self:setValue(eO/(eL=="vertical"and self.height or self.width)*aN)end;return true end end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()if eL=="horizontal"then self.parent:writeText(cq,cr,eN:rep(aN-1),self.bgColor,self.fgColor)self.parent:writeText(cq+aN-1,cr,aG:rep(eP),eM,eM)self.parent:writeText(cq+aN+eP-1,cr,eN:rep(self.width-(aN+eP-1)),self.bgColor,self.fgColor)end;if eL=="vertical"then for aj=0,self.height-1 do if aN==aj+1 then for eV=0,math.min(eP-1,self.height)do self.parent:writeText(cq,cr+aj+eV,aG,eM,eM)end else if aj+1aN-1+eP then self.parent:writeText(cq,cr+aj,eN,self.bgColor,self.fgColor)end end end end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function eX(bI)local cm=bH(bI)local bJ="Switch"cm.width=2;cm.height=1;cm.bgColor=colors.lightGray;cm.fgColor=colors.gray;cm:setValue(false)cm:setZIndex(5)local eN=colors.black;local eY=colors.red;local eZ=colors.green;local bR={getType=function(self)return bJ end,setSymbolColor=function(self,eM)eN=eM;self:setVisualChanged()return self end,setActiveBackground=function(self,el)eZ=el;self:setVisualChanged()return self end,setInactiveBackground=function(self,el)eY=el;self:setVisualChanged()return self end,mouseHandler=function(self,aO,c5,as,at)if cm.mouseHandler(self,aO,c5,as,at)then local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if aO=="mouse_click"and c5==1 or aO=="monitor_touch"then self:setValue(not self:getValue())end;return true end end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)if self:getValue()then self.parent:drawBackgroundBox(cq,cr,1,self.height,eZ)self.parent:drawBackgroundBox(cq+1,cr,1,self.height,eN)else self.parent:drawBackgroundBox(cq,cr,1,self.height,eN)self.parent:drawBackgroundBox(cq+1,cr,1,self.height,eY)end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function e_(bI)local cm=bH(bI)local bJ="Textfield"local f0,cW,cV,f1=1,1,1,1;local f2={""}local f3={[colors.purple]={"break"}}cm.width=20;cm.height=8;cm.bgColor=k.textfieldBG;cm.fgColor=k.textfieldFG;cm:setZIndex(5)local bR={getType=function(self)return bJ end,getLines=function(self)return f2 end,getLine=function(self,aN)return f2[aN]or""end,editLine=function(self,aN,au)f2[aN]=au or f2[aN]return self end,addLine=function(self,au,aN)if aN~=nil then table.insert(f2,aN,au)else table.insert(f2,au)end;return self end,addKeyword=function(self,f4,bZ)end,removeLine=function(self,aN)table.remove(f2,aN or#f2)if#f2<=0 then table.insert(f2,"")end;return self end,getTextCursor=function(self)return cV,f1 end,getFocusHandler=function(self)cm.getFocusHandler(self)if self.parent~=nil then local cq,cr=self:getAnchorPosition()if self.parent~=nil then self.parent:setCursor(true,cq+cV-cW,cr+f1-f0,self.fgColor)end end end,loseFocusHandler=function(self)cm.loseFocusHandler(self)if self.parent~=nil then self.parent:setCursor(false)end end,keyHandler=function(self,aO,bs)if cm.keyHandler(self,aO,bs)then local cq,cr=self:getAnchorPosition()if aO=="key"then if bs==keys.backspace then if f2[f1]==""then if f1>1 then table.remove(f2,f1)cV=f2[f1-1]:len()+1;cW=cV-self.width+1;if cW<1 then cW=1 end;f1=f1-1 end elseif cV<=1 then if f1>1 then cV=f2[f1-1]:len()+1;cW=cV-self.width+1;if cW<1 then cW=1 end;f2[f1-1]=f2[f1-1]..f2[f1]table.remove(f2,f1)f1=f1-1 end else f2[f1]=f2[f1]:sub(1,cV-2)..f2[f1]:sub(cV,f2[f1]:len())if cV>1 then cV=cV-1 end;if cW>1 then if cVf2[f1]:len()then if f2[f1+1]~=nil then f2[f1]=f2[f1]..f2[f1+1]table.remove(f2,f1+1)end else f2[f1]=f2[f1]:sub(1,cV-1)..f2[f1]:sub(cV+1,f2[f1]:len())end end;if bs==keys.enter then table.insert(f2,f1+1,f2[f1]:sub(cV,f2[f1]:len()))f2[f1]=f2[f1]:sub(1,cV-1)f1=f1+1;cV=1;cW=1;if f1-f0>=self.height then f0=f0+1 end;self:setValue("")end;if bs==keys.up then if f1>1 then f1=f1-1;if cV>f2[f1]:len()+1 then cV=f2[f1]:len()+1 end;if cW>1 then if cV1 then if f1f2[f1]:len()+1 then cV=f2[f1]:len()+1 end;if f1>=f0+self.height then f0=f0+1 end end end;if bs==keys.right then cV=cV+1;if f1<#f2 then if cV>f2[f1]:len()+1 then cV=1;f1=f1+1 end elseif cV>f2[f1]:len()then cV=f2[f1]:len()+1 end;if cV<1 then cV=1 end;if cV=self.width+cW then cW=cV-self.width+1 end;if cW<1 then cW=1 end end;if bs==keys.left then cV=cV-1;if cV>=1 then if cV=self.width+cW then cW=cV end end;if f1>1 then if cV<1 then f1=f1-1;cV=f2[f1]:len()+1;cW=cV-self.width+1 end end;if cV<1 then cV=1 end;if cW<1 then cW=1 end end end;if aO=="char"then f2[f1]=f2[f1]:sub(1,cV-1)..bs..f2[f1]:sub(cV,f2[f1]:len())cV=cV+1;if cV>=self.width+cW then cW=cW+1 end;self:setValue("")end;local d7=(cV<=f2[f1]:len()and cV-1 or f2[f1]:len())-(cW-1)if d7>self.x+self.width-1 then d7=self.x+self.width-1 end;local f5=f1-f0f2[f1]:len()then cV=f2[f1]:len()+1 end;if cVf2[f1]:len()then cV=f2[f1]:len()+1 end;if cV#f2-(self.height-1)then f0=#f2-(self.height-1)end;if f0<1 then f0=1 end;if self.parent~=nil then if cq+cV-cW>=cq and cq+cV-cW<=cq+self.width and(cr+f1-f0>=cr and cr+f1-f0<=cr+self.height)then self.parent:setCursor(true,f6+cV-cW,f7+f1-f0,self.fgColor)else self.parent:setCursor(false)end end end;self:setVisualChanged()return true end end,draw=function(self)if cm.draw(self)then if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)self.parent:drawForegroundBox(cq,cr,self.width,self.height,self.fgColor)for aj=1,self.height do local au=""if f2[aj+f0-1]~=nil then au=f2[aj+f0-1]end;au=au:sub(cW,self.width+cW-1)local d8=self.width-au:len()if d8<0 then d8=0 end;au=au..string.rep(" ",d8)self.parent:setText(cq,cr+aj-1,au)end end;self:setVisualChanged(false)end end}return setmetatable(bR,cm)end;local function f8(bI)local bR;local bJ="Thread"local aQ;local f9;local fa=false;bR={name=bI,getType=function(self)return bJ end,getZIndex=function(self)return 1 end,getName=function(self)return self.name end,start=function(self,A)if A==nil then error("Function provided to thread is nil")end;aQ=A;f9=coroutine.create(aQ)fa=true;local a_,b0=coroutine.resume(f9)if not a_ then if b0~="Terminated"then error("Thread Error Occurred - "..b0)end end;return self end,getStatus=function(self,A)if f9~=nil then return coroutine.status(f9)end;return nil end,stop=function(self,A)fa=false;return self end,eventHandler=function(self,aO,c8,c9,ca)if fa then if coroutine.status(f9)~="dead"then local a_,b0=coroutine.resume(f9,aO,c8,c9,ca)if not a_ then if b0~="Terminated"then error("Thread Error Occurred - "..b0)end end else fa=false end end end}bR.__index=bR;return bR end;local function fb(bI)local bJ="Timer"local fc=0;local fd=0;local fe=0;local cd;local bQ=aL()local ff=false;local bR={name=bI,getType=function(self)return bJ end,getZIndex=function(self)return 1 end,getName=function(self)return self.name end,setTime=function(self,fg,fh)fc=fg or 0;fd=fh or 1;return self end,start=function(self)if ff then os.cancelTimer(cd)end;fe=fd;cd=os.startTimer(fc)ff=true;return self end,isActive=function(self)return ff end,cancel=function(self)if cd~=nil then os.cancelTimer(cd)end;ff=false;return self end,onCall=function(self,aQ)bQ:registerEvent("timed_event",aQ)return self end,eventHandler=function(self,aO,ck)if aO=="timer"and ck==cd and ff then bQ:sendEvent("timed_event",self)if fe>=1 then fe=fe-1;if fe>=1 then cd=os.startTimer(fc)end elseif fe==-1 then cd=os.startTimer(fc)end end end}bR.__index=bR;return bR end;local function fi(bI,fj)local cm=bH(bI)local bJ="Frame"local fk={}local fl={}local bR={}local fm=h;local fn=""local fo=false;local fp=false;local fq=0;cm:setZIndex(10)local aD=a6(fm)local dC=false;local dz=1;local dA=1;local fr=colors.white;local fs,cA=0,0;if fj~=nil then cm.parent=fj;cm.width,cm.height=fj:getSize()cm.bgColor=k.FrameBG;cm.fgColor=k.FrameFG else cm.width,cm.height=fm.getSize()cm.bgColor=k.basaltBG;cm.fgColor=k.basaltFG end;local function ft(bI)for aR,aS in pairs(fk)do for aR,bu in pairs(aS)do if bu.name==bI then return aS end end end end;local function fu(fv)local bK=fv:getZIndex()if ft(fv.name)~=nil then return nil end;if fk[bK]==nil then for as=1,#fl+1 do if fl[as]~=nil then if bK==fl[as]then break end;if bK>fl[as]then table.insert(fl,as,bK)break end else table.insert(fl,bK)end end;if#fl<=0 then table.insert(fl,bK)end;fk[bK]={}end;fv.parent=bR;table.insert(fk[bK],fv)return fv end;local function fw(fv)for bt,bu in pairs(fk)do for bs,aS in pairs(bu)do if aS==fv then table.remove(fk[bt],bs)return true end end end;return false end;bR={barActive=false,barBackground=colors.gray,barTextcolor=colors.black,barText="New Frame",barTextAlign="left",isMoveable=false,getType=function(self)return bJ end,setFocusedObject=function(self,fv)if c~=nil then c:loseFocusHandler()c=nil end;if fv~=nil then c=fv;fv:getFocusHandler()end;return self end,setOffset=function(self,c2,c3)fs=c2~=nil and math.floor(c2<0 and math.abs(c2)or-c2)or fs;cA=c3~=nil and math.floor(c3<0 and math.abs(c3)or-c3)or cA;return self end,getFrameOffset=function(self)return fs,cA end,removeFocusedObject=function(self)if c~=nil then c:loseFocusHandler()end;c=nil;return self end,getFocusedObject=function(self)return c end,setCursor=function(self,fx,fy,fz,bZ)if self.parent~=nil then local cq,cr=self:getAnchorPosition()self.parent:setCursor(fx or false,(fy or 0)+cq-1,(fz or 0)+cr-1,bZ or fr)else local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())dC=fx or false;if fy~=nil then dz=cq+fy-1 end;if fz~=nil then dA=cr+fz-1 end;fr=bZ or fr;self:setVisualChanged()end;return self end,setMoveable=function(self,fA)self.isMoveable=fA or not self.isMoveable;self:setVisualChanged()return self end,show=function(self)cm.show(self)if self.parent==nil then e=self;if fo then g[fn]=self else f=self end end;return self end,hide=function(self)cm.hide(self)if self.parent==nil then if e==self then e=nil end;if fo then if g[fn]==self then g[fn]=nil end else if f==self then f=nil end end end;return self end,showBar=function(self,fB)self.barActive=fB or not self.barActive;self:setVisualChanged()return self end,setBar=function(self,au,aE,aF)self.barText=au or""self.barBackground=aE or self.barBackground;self.barTextcolor=aF or self.barTextcolor;self:setVisualChanged()return self end,setBarTextAlign=function(self,cz)self.barTextAlign=cz or"left"self:setVisualChanged()return self end,setMonitor=function(self,fC)if fC~=nil or fC~=false then if peripheral.getType(fC)=="monitor"then fm=peripheral.wrap(fC)fp=true end;fo=true else fm=h;fo=false;if g[fn]==self then g[fn]=nil end end;aD=a6(fm)fn=fC or nil;return self end,getVisualChanged=function(self)local fD=cm.getVisualChanged(self)for aR,aN in pairs(fl)do if fk[aN]~=nil then for aR,aS in pairs(fk[aN])do if aS.getVisualChanged~=nil and aS:getVisualChanged()then fD=true end end end end;return fD end,loseFocusHandler=function(self)cm.loseFocusHandler(self)end,getFocusHandler=function(self)cm.getFocusHandler(self)if self.parent~=nil then self.parent:removeObject(self)self.parent:addObject(self)end end,keyHandler=function(self,aO,bs)if c~=nil then if c~=self then if c.keyHandler~=nil then if c:keyHandler(aO,bs)then return true end end else cm.keyHandler(self,aO,bs)end end;return false end,backgroundKeyHandler=function(self,aO,bs)cm.backgroundKeyHandler(self,aO,bs)for aR,aN in pairs(fl)do if fk[aN]~=nil then for aR,aS in pairs(fk[aN])do if aS.backgroundKeyHandler~=nil then aS:backgroundKeyHandler(aO,bs)end end end end end,eventHandler=function(self,aO,c8,c9,ca,cb)cm.eventHandler(self,aO,c8,c9,ca,cb)for aR,aN in pairs(fl)do if fk[aN]~=nil then for aR,aS in pairs(fk[aN])do if aS.eventHandler~=nil then aS:eventHandler(aO,c8,c9,ca,cb)end end end end;if fo then if aO=="peripheral"and c8==fn then if peripheral.getType(fn)=="monitor"then fp=true;fm=peripheral.wrap(fn)aD=a6(fm)end end;if aO=="peripheral_detach"and c8==fn then fp=false end end;if aO=="terminate"then fm.clear()fm.setCursorPos(1,1)a.stop()end end,mouseHandler=function(self,aO,c5,as,at)local c2,c3=self:getOffset()c2=c2<0 and math.abs(c2)or-c2;c3=c3<0 and math.abs(c3)or-c3;if self.drag then if aO=="mouse_drag"then local fE=1;local fF=1;if self.parent~=nil then fE,fF=self.parent:getAbsolutePosition(self.parent:getAnchorPosition())end;self:setPosition(as+fq-(fE-1)+c2,at-(fF-1)+c3)end;if aO=="mouse_up"then self.drag=false end;return true end;if cm.mouseHandler(self,aO,c5,as,at)then local b_,c0=self:getAbsolutePosition(self:getAnchorPosition())b_=b_+fs;c0=c0+cA;for aR,aN in pairs(fl)do if fk[aN]~=nil then for aR,aS in b7(fk[aN])do if aS.mouseHandler~=nil then if aS:mouseHandler(aO,c5,as,at)then return true end end end end end;if self.isMoveable then if as>=b_ and as<=b_+self.width-1 and at==c0 and aO=="mouse_click"then self.drag=true;fq=b_-as end end;if c~=nil then c:loseFocusHandler()c=nil end;return true end;return false end,setText=function(self,as,at,au)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if at>=1 and at<=self.height then if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:setText(math.max(as+cq-1,cq)-(fE-1),cr+at-1-(fF-1),i(au,math.max(1-as+1,1),self.width-as+1))else aD.setText(math.max(as+cq-1,cq),cr+at-1,i(au,math.max(1-as+1,1),self.width-as+1))end end end,setBG=function(self,as,at,aE)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if at>=1 and at<=self.height then if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:setBG(math.max(as+cq-1,cq)-(fE-1),cr+at-1-(fF-1),i(aE,math.max(1-as+1,1),self.width-as+1))else aD.setBG(math.max(as+cq-1,cq),cr+at-1,i(aE,math.max(1-as+1,1),self.width-as+1))end end end,setFG=function(self,as,at,aF)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if at>=1 and at<=self.height then if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:setFG(math.max(as+cq-1,cq)-(fE-1),cr+at-1-(fF-1),i(aF,math.max(1-as+1,1),self.width-as+1))else aD.setFG(math.max(as+cq-1,cq),cr+at-1,i(aF,math.max(1-as+1,1),self.width-as+1))end end end,writeText=function(self,as,at,au,aE,aF)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())if at>=1 and at<=self.height then if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:writeText(math.max(as+cq-1,cq)-(fE-1),cr+at-1-(fF-1),i(au,math.max(1-as+1,1),self.width-as+1),aE,aF)else aD.writeText(math.max(as+cq-1,cq),cr+at-1,i(au,math.max(1-as+1,1),self.width-as+1),aE,aF)end end end,drawBackgroundBox=function(self,as,at,a9,p,aE)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())p=at<1 and(p+at>self.height and self.height or p+at-1)or(p+at>self.height and self.height-at+1 or p)a9=as<1 and(a9+as>self.width and self.width or a9+as-1)or(a9+as>self.width and self.width-as+1 or a9)if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:drawBackgroundBox(math.max(as+cq-1,cq)-(fE-1),math.max(at+cr-1,cr)-(fF-1),a9,p,aE)else aD.drawBackgroundBox(math.max(as+cq-1,cq),math.max(at+cr-1,cr),a9,p,aE)end end,drawTextBox=function(self,as,at,a9,p,aG)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())p=at<1 and(p+at>self.height and self.height or p+at-1)or(p+at>self.height and self.height-at+1 or p)a9=as<1 and(a9+as>self.width and self.width or a9+as-1)or(a9+as>self.width and self.width-as+1 or a9)if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:drawTextBox(math.max(as+cq-1,cq)-(fE-1),math.max(at+cr-1,cr)-(fF-1),a9,p,aG:sub(1,1))else aD.drawTextBox(math.max(as+cq-1,cq),math.max(at+cr-1,cr),a9,p,aG:sub(1,1))end end,drawForegroundBox=function(self,as,at,a9,p,aF)local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())p=at<1 and(p+at>self.height and self.height or p+at-1)or(p+at>self.height and self.height-at+1 or p)a9=as<1 and(a9+as>self.width and self.width or a9+as-1)or(a9+as>self.width and self.width-as+1 or a9)if self.parent~=nil then local fE,fF=self.parent:getAnchorPosition()self.parent:drawForegroundBox(math.max(as+cq-1,cq)-(fE-1),math.max(at+cr-1,cr)-(fF-1),a9,p,aF)else aD.drawForegroundBox(math.max(as+cq-1,cq),math.max(at+cr-1,cr),a9,p,aF)end end,draw=function(self)if fo and not fp then return false end;if self:getVisualChanged()then if cm.draw(self)then local cq,cr=self:getAbsolutePosition(self:getAnchorPosition())local f6,f7=self:getAnchorPosition()if self.parent~=nil then self.parent:drawBackgroundBox(f6,f7,self.width,self.height,self.bgColor)self.parent:drawForegroundBox(f6,f7,self.width,self.height,self.fgColor)self.parent:drawTextBox(f6,f7,self.width,self.height," ")else aD.drawBackgroundBox(cq,cr,self.width,self.height,self.bgColor)aD.drawForegroundBox(cq,cr,self.width,self.height,self.fgColor)aD.drawTextBox(cq,cr,self.width,self.height," ")end;fm.setCursorBlink(false)if self.barActive then if self.parent~=nil then self.parent:writeText(f6,f7,b1(self.barText,self.width,self.barTextAlign),self.barBackground,self.barTextcolor)else aD.writeText(cq,cr,b1(self.barText,self.width,self.barTextAlign),self.barBackground,self.barTextcolor)end end;for aR,aN in b7(fl)do if fk[aN]~=nil then for aR,aS in pairs(fk[aN])do if aS.draw~=nil then aS:draw()end end end end;if dC then fm.setTextColor(fr)fm.setCursorPos(dz,dA)if self.parent~=nil then fm.setCursorBlink(self:isFocused())else fm.setCursorBlink(dC)end end;self:setVisualChanged(false)end end end,drawUpdate=function(self)if fo and not fp then return false end;aD.update()end,addObject=function(self,fv)return fu(fv)end,removeObject=function(self,fv)return fw(fv)end,getObject=function(self,fv)return ft(fv)end,addButton=function(self,bI)local fv=cl(bI)fv.name=bI;return fu(fv)end,addLabel=function(self,bI)local fv=d9(bI)fv.bgColor=self.bgColor;fv.fgColor=self.fgColor;return fu(fv)end,addCheckbox=function(self,bI)local fv=ct(bI)return fu(fv)end,addInput=function(self,bI)local fv=cS(bI)return fu(fv)end,addProgram=function(self,bI)local fv=dx(bI)return fu(fv)end,addTextfield=function(self,bI)local fv=e_(bI)return fu(fv)end,addList=function(self,bI)local fv=dj(bI)fv.name=nam;return fu(fv)end,addDropdown=function(self,bI)local fv=cu(bI)return fu(fv)end,addRadio=function(self,bI)local fv=eF(bI)return fu(fv)end,addTimer=function(self,bI)local fv=fb(bI)return fu(fv)end,addAnimation=function(self,bI)local fv=cc(bI)return fu(fv)end,addSlider=function(self,bI)local fv=eW(bI)return fu(fv)end,addScrollbar=function(self,bI)local fv=eK(bI)return fu(fv)end,addMenubar=function(self,bI)local fv=dm(bI)return fu(fv)end,addThread=function(self,bI)local fv=f8(bI)return fu(fv)end,addPane=function(self,bI)local fv=dw(bI)return fu(fv)end,addImage=function(self,bI)local fv=cK(bI)return fu(fv)end,addProgressbar=function(self,bI)local fv=ew(bI)return fu(fv)end,addSwitch=function(self,bI)local fv=eX(bI)return fu(fv)end,addFrame=function(self,bI)local fv=fi(bI,self)return fu(fv)end}setmetatable(bR,cm)return bR end;local function fG()f:draw()f:drawUpdate()for aR,du in pairs(g)do du:draw()du:drawUpdate()end end;local fH=false;local function fI(aO,c8,c9,ca,cb)if f~=nil then if aO=="mouse_click"then f:mouseHandler(aO,c8,c9,ca,cb)e=f elseif aO=="mouse_drag"then f:mouseHandler(aO,c8,c9,ca,cb)e=f elseif aO=="mouse_up"then f:mouseHandler(aO,c8,c9,ca,cb)e=f elseif aO=="mouse_scroll"then f:mouseHandler(aO,c8,c9,ca,cb)e=f elseif aO=="monitor_touch"then if g[c8]~=nil then g[c8]:mouseHandler(aO,c8,c9,ca,cb)e=g[c8]end end end;if aO=="key"or aO=="char"then e:keyHandler(aO,c8)e:backgroundKeyHandler(aO,c8)end;if aO=="key"then b[c8]=true end;if aO=="key_up"then b[c8]=false end;for aR,du in pairs(d)do du:eventHandler(aO,c8,c9,ca,cb)end;if fH then fG()end end;function a.autoUpdate(fa)fH=fa;if fa==nil then fH=true end;fG()while fH do local aO,c8,c9,ca,cb=os.pullEventRaw()fI(aO,c8,c9,ca,cb)end end;function a.update(aO,c8,c9,ca,cb)if aO~=nil then fI(aO,c8,c9,ca,cb)else fG()end end;function a.stop()fH=false end;function a.isKeyDown(bs)if b[bs]==nil then return false end;return b[bs]end;function a.getFrame(bI)for aR,aS in pairs(d)do if aS.name==bI then return aS end end end;function a.getActiveFrame()return e end;function a.setActiveFrame(bS)if bS:getType()=="Frame"then e=bS;return true end;return false end;function a.createFrame(bI)for aR,du in pairs(d)do if du.name==bI then return nil end end;local fJ=fi(bI)table.insert(d,fJ)return fJ end;function a.removeFrame(bI)d[bI]=nil end;if a.debugger then a.debugFrame=a.createFrame("basaltDebuggingFrame"):showBar():setBackground(colors.lightGray):setBar("Debug",colors.black,colors.gray)a.debugList=a.debugFrame:addList("debugList"):setSize(a.debugFrame.width-2,a.debugFrame.height-3):setPosition(2,3):setScrollable(true):show()a.debugFrame:addButton("back"):setAnchor("right"):setSize(1,1):setText("\22"):onClick(function()a.oldFrame:show()end):setBackground(colors.red):show()a.debugLabel=a.debugFrame:addLabel("debugLabel"):onClick(function()a.oldFrame=f;a.debugFrame:show()end):setBackground(colors.black):setForeground(colors.white):setAnchor("bottom"):ignoreOffset():setZIndex(20):show()end;if a.debugger then function a.debug(...)local aY={...}if f.name~="basaltDebuggingFrame"then if f~=a.debugFrame then a.debugLabel:setParent(f)end end;local fK=""for bs,aS in pairs(aY)do fK=fK..tostring(aS)..(#aY~=bs and", "or"")end;a.debugLabel:setText("[Debug] "..fK)a.debugList:addItem(fK)if a.debugList:getItemCount()>50 then a.debugList:removeItem(1)end;a.debugList:setValue(a.debugList:getItem(a.debugList:getItemCount()))if a.debugList.getItemCount()>a.debugList:getHeight()then a.debugList:setIndexOffset(a.debugList:getItemCount()-a.debugList:getHeight())end;a.debugLabel:show()end end;return a