local q={}local y=0 local K={}function filteringWorkspace()if explorerFilter.Text~=""and explorerFilter.Text~="\070\105\108\116\101\114 \119\111\114\107\115\112\097\099\101\046\046\046"then return true end return false end function lookForAName(q,y)for q,K in pairs(q:GetChildren())do if string.find(string.lower(K.Name),string.lower(y))then nameScanned=true end lookForAName(K,y)end end function scanName(q)nameScanned=false if string.find(string.lower(q.Name),string.lower(explorerFilter.Text))then nameScanned=true else lookForAName(q,explorerFilter.Text)end return nameScanned end function updateActions()for q,y in pairs(K)do if y.Cond()then y.Toggle(true)else y.Toggle(false)end end end local b,d,c,E do local function K(q)for b=1,#q,1 do if not filteringWorkspace()or scanName(q[b].Object)then if q.Object==game then if childrenGame[q[b].Object]then TreeList[#TreeList+1]=q[b]local d=((((q[b].Depth*((2+ENTRY_PADDING)+GUI_SIZE)+2)+ENTRY_SIZE)+4)+getTextWidth(q[b].Object.Name))+4 if d>y then y=d end if q[b].Expanded or filteringWorkspace()then K(q[b])end end else TreeList[#TreeList+1]=q[b]local d=((((q[b].Depth*((2+ENTRY_PADDING)+GUI_SIZE)+2)+ENTRY_SIZE)+4)+getTextWidth(q[b].Object.Name))+4 if d>y then y=d end if q[b].Expanded or filteringWorkspace()then K(q[b])end end end end end function E()scrollBarH.TotalSpace=y scrollBarH.VisibleSpace=listFrame.AbsoluteSize.x scrollBarH:Update()local q=scrollBarH:CanScrollDown()or scrollBarH:CanScrollUp()scrollBarH.GUI.Visible=q listFrame.Size=UDim2_new(1,-GUI_SIZE,1,-GUI_SIZE*(q and 1 or 0)-HEADER_SIZE)scrollBar.VisibleSpace=math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)scrollBar.GUI.Size=UDim2_new(0,GUI_SIZE,1,-GUI_SIZE*(q and 1 or 0)-HEADER_SIZE)scrollBar.TotalSpace=#TreeList+1 scrollBar:Update()end function d()TreeList={}y=0 K(q[game])K(q[DexOutput])K(q[HiddenEntries])K(q[HiddenGame])E()updateActions()end local j=false function b()if j then return end j=true wait(.25)j=false d()end local z=false function c()if z then return end z=true wait(.25)z=false scrollBar:Update()end end local j do local y=explorerPanel:FindFirstChild("\071\101\116\083\101\108\101\099\116\105\111\110")if not y then y=Create("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110",{Name="\071\101\116\083\101\108\101\099\116\105\111\110"})y.Parent=explorerPanel end local K=explorerPanel:FindFirstChild("\083\101\116\083\101\108\101\099\116\105\111\110")if not K then K=Create("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110",{Name="\083\101\116\083\101\108\101\099\116\105\111\110"})K.Parent=explorerPanel end local b=explorerPanel:FindFirstChild("\083\101\108\101\099\116\105\111\110\067\104\097\110\103\101\100")if not b then b=Create("\066\105\110\100\097\098\108\101\069\118\101\110\116",{Name="\083\101\108\101\099\116\105\111\110\067\104\097\110\103\101\100"})b.Parent=explorerPanel end local c={}local E={}local z=true j={Selected=E,List=c}local function m(y)local K=false local b=false if not E[y]then local d=q[y]if d then table.insert(c,y)E[y]=true d.Selected=true d=d.Parent while d do if not d.Expanded then d.Expanded=true K=true end d=d.Parent end b=true end end return K,b end j.Finding=false j.Found={}function j.Set(K,y)if j.Finding then j.Found=y end local z=false local p=false if#c>0 then for y=1,#c,1 do local K=c[y]local b=q[K]if b then b.Selected=false E[K]=nil end end c={}j.List=c p=true end for q=1,#y,1 do local K,b=m(y[q])z=K or z p=b or p end if z then d()p=true elseif p then scrollBar:Update()end if p then b:Fire()updateActions()end end function j.Add(y,q)local K,c=m(q)if K then d()if z then b:Fire()updateActions()end elseif c then scrollBar:Update()if z then b:Fire()updateActions()end end end function j.StopUpdates(q)z=false end function j.ResumeUpdates(q)z=true b:Fire()updateActions()end function j.Remove(d,y,K)if E[y]then local d=q[y]if d then d.Selected=false E[y]=nil for q=1,#c,1 do if c[q]==y then table.remove(c,q)break end end if not K then scrollBar:Update()end b:Fire()updateActions()end end end function j.Get(q)local y={}for q=1,#c,1 do if c[q]~=HiddenEntriesMain and c[q]~=DexOutputMain then table.insert(y,c[q])end end return y end K.OnInvoke=function(...)j:Set(...)end y.OnInvoke=function()return j:Get()end end function CreateCaution(q,y)local K=CautionWindow K.Visible=true K.Title.Text=q K.MainWindow.Desc.Text=y K.MainWindow.Ok.MouseButton1Up:connect(function()K.Visible=false end)end function CreateTableCaution(q,y)if type(y)~="\116\097\098\108\101"then return CreateCaution(q,tostring(y))end local K=TableCautionWindow:Clone()K.Title.Text=q local b=K.MainWindow.TableResults local d=K.MainWindow.TableTemplate for q,y in pairs(y)do local K=d:Clone()K.Type.Text=type(y)K.Value.Text=tostring(y)K.Position=UDim2_new(0,0,0,#b:GetChildren()*20)K.Parent=b b.CanvasSize=UDim2_new(0,0,0,#b:GetChildren()*20)K.Visible=true end K.Parent=explorerPanel.Parent K.Visible=true K.MainWindow.Ok.MouseButton1Up:connect(function()K:Destroy()end)end local function z(q,y)local K=1 local b={}while true do local d=string.find(q,y,K,true)if not d then break end table.insert(b,string.sub(q,K,d-1))K=d+string.len(y)end table.insert(b,string.sub(q,K))return b end local function m(q,y)if y=="\086\101\099\116\111\114\050"then local y=z(q,"\044")if#y<2 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 return Vector2_new(K,b)elseif y=="\086\101\099\116\111\114\051"then local y=z(q,"\044")if#y<3 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 local d=tonumber(y[3])or 0 return Vector3_new(K,b,d)elseif y=="\067\111\108\111\114\051"then local y=z(q,"\044")if#y<3 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 local d=tonumber(y[3])or 0 return Color3_new(K/255,b/255,d/255)elseif y=="\085\068\105\109\050"then local y=z(string.gsub(string.gsub(q,"\123",""),"\125",""),"\044")if#y<4 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 local d=tonumber(y[3])or 0 local c=tonumber(y[4])or 0 return UDim2_new(K,b,d,c)elseif y=="\078\117\109\098\101\114"then return tonumber(q)elseif y=="\083\116\114\105\110\103"then return q elseif y=="\078\117\109\098\101\114\082\097\110\103\101"then local y=z(q,"\044")if#y==1 then if tonumber(y[1])==nil then return nil end local q=tonumber(y[1])or 0 return NumberRange.new(q)end if#y<2 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 return NumberRange.new(K,b)elseif y=="\083\099\114\105\112\116"then local q,y=pcall(function() end)if y then return nil end else return nil end end local function p(q,y)if y=="\086\101\099\116\111\114\050"then local y=z(q,"\044")if#y<2 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 return Vector2_new(K,b)elseif y=="\086\101\099\116\111\114\051"then local y=z(q,"\044")if#y<3 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 local d=tonumber(y[3])or 0 return Vector3_new(K,b,d)elseif y=="\067\111\108\111\114\051"then local y=z(q,"\044")if#y<3 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 local d=tonumber(y[3])or 0 return Color3_new(K/255,b/255,d/255)elseif y=="\085\068\105\109\050"then local y=z(string.gsub(string.gsub(q,"\123",""),"\125",""),"\044")if#y<4 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 local d=tonumber(y[3])or 0 local c=tonumber(y[4])or 0 return UDim2_new(K,b,d,c)elseif y=="\067\111\110\116\101\110\116"then return q elseif y=="\102\108\111\097\116"or y=="\105\110\116"or y=="\100\111\117\098\108\101"then return tonumber(q)elseif y=="\115\116\114\105\110\103"then return q elseif y=="\078\117\109\098\101\114\082\097\110\103\101"then local y=z(q,"\044")if#y==1 then if tonumber(y[1])==nil then return nil end local q=tonumber(y[1])or 0 return NumberRange.new(q)end if#y<2 then return nil end local K=tonumber(y[1])or 0 local b=tonumber(y[2])or 0 return NumberRange.new(K,b)elseif string.sub(q,1,4)=="\069\110\117\109"then local y=q while true do local q,K=string.find(y,"\046")if K then y=string.sub(y,K+1)else break end end print(y)return y else return nil end end function PromptCaller(q)if CurrentRemoteWindow then CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end CurrentRemoteWindow=RemoteWindow:Clone()CurrentRemoteWindow.Parent=explorerPanel.Parent CurrentRemoteWindow.Visible=true local y=false local K=CurrentRemoteWindow.MainWindow.Arguments local b=CurrentRemoteWindow.MainWindow.ArgumentTemplate if q:IsA("\082\101\109\111\116\101\069\118\101\110\116")or q:IsA("\066\105\110\100\097\098\108\101\069\118\101\110\116")then CurrentRemoteWindow.Title.Text="\070\105\114\101 \069\118\101\110\116"CurrentRemoteWindow.MainWindow.Ok.Text="\070\105\114\101"CurrentRemoteWindow.MainWindow.DisplayReturned.Visible=false CurrentRemoteWindow.MainWindow.Desc2.Visible=false end if q:IsA("\082\101\109\111\116\101\069\118\101\110\116")or q:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")then local q=b:Clone()q.Parent=K q.Visible=true q.Type.Text="\085\115\101\114\078\097\109\101\084\111\070\105\114\101"end local d=b:Clone()if q:IsA("\082\101\109\111\116\101\069\118\101\110\116")or q:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")then d.Position=UDim2_new(0,0,0,20)K.CanvasSize=UDim2_new(0,0,0,40)end d.Parent=K d.Visible=true d.Type.MouseButton1Down:connect(function()createDDown(d.Type,function(q)d.Type.Text=q end,"\083\099\114\105\112\116","\078\117\109\098\101\114","\083\116\114\105\110\103","\067\111\108\111\114\051","\086\101\099\116\111\114\051","\086\101\099\116\111\114\050","\085\068\105\109\050","\078\117\109\098\101\114\082\097\110\103\101")end)CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()if CurrentRemoteWindow and q.Parent~=nil then local b={}for y,K in pairs(K:GetChildren())do if q:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or q:IsA("\082\101\109\111\116\101\069\118\101\110\116")and y==1 then local q=game:GetService("\080\108\097\121\101\114\115")if q:FindFirstChild(K.Value.Text)then table.insert(b,q[K.Value.Text])else CreateCaution("\082\101\109\111\116\101 \067\097\108\108\101\114","\084\104\101 \117\115\101\114\110\097\109\101 \100\101\102\105\110\101\100 \105\115 \110\111\116 \105\110-\103\097\109\101\046")return end end table.insert(b,m(K.Value.Text,K.Type.Text))end if q:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or q:IsA("\082\101\109\111\116\101\069\118\101\110\116")then if y then spawn(function()local y=RemoteEvent:InvokeServer("\067\097\108\108\082\101\109\111\116\101",q,b)if y then CreateTableCaution("\082\101\109\111\116\101 \067\097\108\108\101\114",y)else CreateCaution("\082\101\109\111\116\101 \067\097\108\108\101\114","\084\104\105\115 \114\101\109\111\116\101 \100\105\100 \110\111\116 \114\101\116\117\114\110 \097\110\121\116\104\105\110\103\046")end end)else spawn(function()RemoteEvent:InvokeServer("\067\097\108\108\082\101\109\111\116\101",q,b)end)end else RemoteEvent:InvokeServer("\067\097\108\108\082\101\109\111\116\101",q,b)end CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end end)CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()if CurrentRemoteWindow then local q=b:Clone()q.Position=UDim2_new(0,0,0,#K:GetChildren()*20)q.Parent=K K.CanvasSize=UDim2_new(0,0,0,#K:GetChildren()*20)q.Visible=true q.Type.MouseButton1Down:connect(function()createDDown(q.Type,function(y)q.Type.Text=y end,"\083\099\114\105\112\116","\078\117\109\098\101\114","\083\116\114\105\110\103","\067\111\108\111\114\051","\086\101\099\116\111\114\051","\086\101\099\116\111\114\050","\085\068\105\109\050","\078\117\109\098\101\114\082\097\110\103\101")end)end end)CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()if CurrentRemoteWindow then if(q:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or q:IsA("\082\101\109\111\116\101\069\118\101\110\116"))and#K:GetChildren()>2 then(K:GetChildren())[#K:GetChildren()]:Destroy()K.CanvasSize=UDim2_new(0,0,0,#K:GetChildren()*20)elseif q:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")==false and(q:IsA("\082\101\109\111\116\101\069\118\101\110\116")==false and#K:GetChildren()>1)then(K:GetChildren())[#K:GetChildren()]:Destroy()K.CanvasSize=UDim2_new(0,0,0,#K:GetChildren()*20)end end end)CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()if CurrentRemoteWindow then CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end end)CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()if y then y=false CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible=false else y=true CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible=true end end)end function DestroyRightClick()if currentRightClickMenu then currentRightClickMenu:Destroy()currentRightClickMenu=nil end if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then CurrentInsertObjectWindow.Visible=false end end function rightClickMenu(q)local y=(game:GetService("\080\108\097\121\101\114\115")).LocalPlayer:GetMouse()currentRightClickMenu=CreateRightClickMenu({"\067\117\116";"\067\111\112\121";"\080\097\115\116\101 \073\110\116\111","\068\117\112\108\105\099\097\116\101","\068\101\108\101\116\101";false,"\071\114\111\117\112";"\085\110\103\114\111\117\112";"\083\101\108\101\099\116 \067\104\105\108\100\114\101\110";false;"\084\101\108\101\112\111\114\116 \084\111","\067\097\108\108 \070\117\110\099\116\105\111\110";"\067\097\108\108 \082\101\109\111\116\101\047\066\105\110\100\097\098\108\101",false;"\073\110\115\101\114\116 \080\097\114\116";"\073\110\115\101\114\116 \079\098\106\101\099\116";false},"",false,function(q)if q=="\067\117\116"then if not Option.Modifiable then return end clipboard={}RemoteEvent:InvokeServer("\067\108\101\097\114\067\108\105\112\098\111\097\114\100")local q=j.List local y={}for K=1,#q,1 do local b,d=pcall(function()return q[K]:Clone()end)if d then table.insert(clipboard,d)table.insert(y,q[K])RemoteEvent:InvokeServer("\067\111\112\121",q[K])end end for q=1,#y,1 do pcall(delete,y[q])end updateActions()elseif q=="\067\111\112\121"then if not Option.Modifiable then return end clipboard={}RemoteEvent:InvokeServer("\067\108\101\097\114\067\108\105\112\098\111\097\114\100")local q=j.List for y=1,#q,1 do local K,b=pcall(function()return q[y]:Clone()end)if b then table.insert(clipboard,b)end RemoteEvent:InvokeServer("\067\111\112\121",q[y])end updateActions()elseif q=="\080\097\115\116\101 \073\110\116\111"then if not Option.Modifiable then return end local q=j.List[1]or workspace if not RemoteEvent:InvokeServer("\080\097\115\116\101",q)then for y=1,#clipboard,1 do if clipboard[y]then pcall(function()(clipboard[y]:Clone()).Parent=q end)end end end elseif q=="\068\117\112\108\105\099\097\116\101"then if not Option.Modifiable then return end local q=j:Get()local y=j.List[1].Parent or workspace for K=1,#q,1 do if not RemoteEvent:InvokeServer("\068\117\112\108\105\099\097\116\101",q[K],y)then local b,d=pcall(function()return q[K]:Clone()end)if d then d.Parent=y end end end elseif q=="\068\101\108\101\116\101"then if not Option.Modifiable then return end local q=j:Get()for y=1,#q,1 do pcall(delete,q[y])end j:Set({})elseif q=="\071\114\111\117\112"then if not Option.Modifiable then return end local q=j.List[1].Parent or workspace local y=RemoteEvent:InvokeServer("\073\110\115\116\097\110\099\101\078\101\119","\077\111\100\101\108",{Parent=q})or Instance_new("\077\111\100\101\108")local K=j:Get()y.Parent=q for q=1,#K,1 do K[q].Parent=y RemoteEvent:InvokeServer("\083\101\116\080\114\111\112\101\114\116\121",K[q],"\080\097\114\101\110\116",y)end j:Set({})elseif q=="\085\110\103\114\111\117\112"then if not Option.Modifiable then return end local q={}local y=j:Get()for K=1,#y,1 do if y[K]:IsA("\077\111\100\101\108")then for b,d in pairs(y[K]:GetChildren())do d.Parent=y[K].Parent or workspace table.insert(q,d)RemoteEvent:InvokeServer("\083\101\116\080\114\111\112\101\114\116\121",d,"\080\097\114\101\110\116",y[K].Parent or workspace)end pcall(delete,y[K])end end j:Set({})if SettingsRemote:Invoke("\083\101\108\101\099\116\085\110\103\114\111\117\112\101\100")then for q,y in pairs(q)do j:Add(y)end end elseif q=="\083\101\108\101\099\116 \067\104\105\108\100\114\101\110"then if not Option.Modifiable then return end local q=j:Get()j:Set({})j:StopUpdates()for y=1,#q,1 do for q,y in pairs(q[y]:GetChildren())do j:Add(y)end end j:ResumeUpdates()elseif q=="\084\101\108\101\112\111\114\116 \084\111"then if not Option.Modifiable then return end local q=j:Get()for y=1,#q,1 do if q[y]:IsA("\066\097\115\101\080\097\114\116")then pcall(function()(game:GetService("\080\108\097\121\101\114\115")).LocalPlayer.Character.HumanoidRootPart.CFrame=q[y].CFrame end)break end end elseif q=="\073\110\115\101\114\116 \080\097\114\116"then if not Option.Modifiable then return end local q={}local y=j:Get()for K=1,#y,1 do pcall(function()local b={}b.Parent=y[K]b.CFrame=CFrame_new((game:GetService("\080\108\097\121\101\114\115")).LocalPlayer.Character.Head.Position)+Vector3_new(0,3,0)local d=RemoteEvent:InvokeServer("\073\110\115\116\097\110\099\101\078\101\119","\080\097\114\116",b)or Instance_new("\080\097\114\116")d.Parent=b.Parent d.CFrame=b.CFrame table.insert(q,d)end)end elseif q=="\067\097\108\108 \082\101\109\111\116\101\047\066\105\110\100\097\098\108\101"then if not Option.Modifiable then return end local q=j:Get()for y=1,#q,1 do if q[y]:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or q[y]:IsA("\082\101\109\111\116\101\069\118\101\110\116")or q[y]:IsA("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110")or q[y]:IsA("\066\105\110\100\097\098\108\101\069\118\101\110\116")then PromptCaller(q[y])break end end end end)currentRightClickMenu.Parent=explorerPanel.Parent currentRightClickMenu.Position=UDim2_new(0,y.X,0,y.Y)if currentRightClickMenu.AbsolutePosition.X+currentRightClickMenu.AbsoluteSize.X>explorerPanel.AbsolutePosition.X+explorerPanel.AbsoluteSize.X then currentRightClickMenu.Position=UDim2_new(0,(explorerPanel.AbsolutePosition.X+explorerPanel.AbsoluteSize.X)-currentRightClickMenu.AbsoluteSize.X,0,y.Y)end end local function P() end local function i() end do local K={}local b={}local c=Create("\073\109\097\103\101\066\117\116\116\111\110",{Name="\077\111\117\115\101\068\114\097\103",Position=UDim2_new(-0.25,0,-0.25,0);Size=UDim2_new(1.5,0,1.5,0);Transparency=1,AutoButtonColor=false,Active=true;ZIndex=10})local function z(q,y,K)local b local d conDrag=c.MouseMoved:connect(function(K,b)local d=Vector2_new(K,b)-listFrame.AbsolutePosition local c=listFrame.AbsoluteSize if d.x<0 or d.x>c.x or d.y<0 or d.y>c.y then return end local E=math.ceil(d.y/ENTRY_BOUND)+scrollBar.ScrollIndex for q=E<q and E or q,E>q and E or q,1 do local K=TreeList[q]if K then if y then j:Add(K.Object)else j:Remove(K.Object)end end end q=E end)function i()c.Parent=nil conDrag:disconnect()d:disconnect()function i() end end d=c[K]:connect(i)c.Parent=GetScreen(listFrame)end local function m(q,y,b,d)local E local z local m local p=nil local i=false local O=Create("\070\114\097\109\101",{Transparency=1;Visible=false,Create("\070\114\097\109\101",{BorderSizePixel=0,BackgroundColor3=Color3_new(0,0,0);BackgroundTransparency=.1,Position=UDim2_new(0,0,0,0);Size=UDim2_new(1,0,0,1)}),Create("\070\114\097\109\101",{BorderSizePixel=0;BackgroundColor3=Color3_new(0,0,0);BackgroundTransparency=.1,Position=UDim2_new(1,0,0,0);Size=UDim2_new(0,1,1,0)});Create("\070\114\097\109\101",{BorderSizePixel=0;BackgroundColor3=Color3_new(0,0,0);BackgroundTransparency=.1;Position=UDim2_new(0,0,1,0);Size=UDim2_new(1,0,0,1)});Create("\070\114\097\109\101",{BorderSizePixel=0,BackgroundColor3=Color3_new(0,0,0),BackgroundTransparency=.1;Position=UDim2_new(0,0,0,0);Size=UDim2_new(0,1,1,0)})})SetZIndex(O,9)conDrag=c.MouseMoved:connect(function(c,E)local j=Vector2_new(c,E)if i then local b=j-listFrame.AbsolutePosition local c=listFrame.AbsoluteSize p=nil O.Visible=false if b.x>=0 and(b.x<=c.x and(b.y>=0 and b.y<=c.y+ENTRY_SIZE*2))then local y=math.ceil(b.y/ENTRY_BOUND-2)local d=TreeList[y+scrollBar.ScrollIndex]if d and(d.Object~=q and not q:IsAncestorOf(d.Object))then p=y local q=K[y]if q then O.Visible=true O.Position=UDim2_new(0,1,0,q.AbsolutePosition.y-listFrame.AbsolutePosition.y)O.Size=UDim2_new(0,c.x-4,0,q.AbsoluteSize.y)end end end y.Position=UDim2_new(0,j.x+d.x,0,j.y+d.y)elseif(b-j).magnitude>8 then i=true SetZIndex(y,9)y.IndentFrame.Transparency=.25 y.IndentFrame.EntryText.TextColor3=GuiColor.TextSelected y.Position=UDim2_new(0,j.x+d.x,0,j.y+d.y)y.Parent=GetScreen(listFrame)O.Parent=listFrame end end)function P()c.Parent=nil conDrag:disconnect()z:disconnect()m:disconnect()y:Destroy()O:Destroy()function P() end end local a=j.Selected[q]if not a and Option.Selectable then j:Set({q})end z=c.MouseButton1Up:connect(function()P()if i then if p then local y=TreeList[p+scrollBar.ScrollIndex]if y then y.Expanded=true local K=y.Object local function b(q,y)q.Parent=y end if Option.Selectable then local q=j.List for y=1,#q,1 do pcall(b,q[y],K)end else pcall(b,q,K)end end end else if a and Option.Selectable then j:Set({})end end end)m=c.MouseButton2Down:connect(function()P()end)c.Parent=GetScreen(listFrame)end local p=Create("\073\109\097\103\101\066\117\116\116\111\110",{Name="\069\110\116\114\121";Transparency=1;AutoButtonColor=false;Position=UDim2_new(0,0,0,0);Size=UDim2_new(1,0,0,ENTRY_SIZE);Create("\070\114\097\109\101",{Name="\073\110\100\101\110\116\070\114\097\109\101",BackgroundTransparency=1;BackgroundColor3=GuiColor.Selected;BorderColor3=GuiColor.BorderSelected;Position=UDim2_new(0,0,0,0);Size=UDim2_new(1,0,1,0),Create(Icon("\073\109\097\103\101\066\117\116\116\111\110",0),{Name="\069\120\112\097\110\100";AutoButtonColor=false;Position=UDim2_new(0,-GUI_SIZE,.5,-GUI_SIZE/2);Size=UDim2_new(0,GUI_SIZE,0,GUI_SIZE)}),Create(ClassIcon(nil,0),{Name="\069\120\112\108\111\114\101\114\073\099\111\110",Position=UDim2_new(0,2+ENTRY_PADDING,.5,-GUI_SIZE/2);Size=UDim2_new(0,GUI_SIZE,0,GUI_SIZE)}),Create("\084\101\120\116\076\097\098\101\108",{Name="\069\110\116\114\121\084\101\120\116";BackgroundTransparency=1;TextColor3=GuiColor.Text;TextXAlignment="\076\101\102\116",TextYAlignment="\067\101\110\116\101\114",Font=FONT;FontSize=FONT_SIZE;Text="",Position=UDim2_new(0,(2+ENTRY_SIZE)+4,0,0);Size=UDim2_new(1,-2,1,0)})})})function scrollBar.UpdateCallback(c)for E=1,c.VisibleSpace,1 do local P=TreeList[E+c.ScrollIndex]if P then local i=K[E]if not i then i=Create(p:Clone(),{Position=UDim2_new(0,2,0,ENTRY_BOUND*(E-1)+2),Size=UDim2_new(0,y,0,ENTRY_SIZE),ZIndex=listFrame.ZIndex})K[E]=i local b=i.IndentFrame.Expand b.MouseEnter:connect(function()local q=TreeList[E+c.ScrollIndex]if#q>0 then if q.Object~=HiddenEntriesMain then if q.Expanded then Icon(b,NODE_EXPANDED_OVER)else Icon(b,NODE_COLLAPSED_OVER)end else if q.HiddenExpanded then Icon(b,NODE_EXPANDED_OVER)else Icon(b,NODE_COLLAPSED_OVER)end end end end)b.MouseLeave:connect(function()pcall(function()local q=TreeList[E+c.ScrollIndex]if q.Object==HiddenEntriesMain then if q.HiddenExpanded then Icon(b,NODE_EXPANDED)else Icon(b,NODE_COLLAPSED)end return end if#q>0 then if q.Expanded then Icon(b,NODE_EXPANDED)else Icon(b,NODE_COLLAPSED)end end end)end)local function P(q,y,K)addObject(q,y,K)local b,d=pcall(function()return q:GetChildren()end,q)if b then for K=1,#d,1 do P(d[K],y,q)end end end b.MouseButton1Down:connect(function()local y=TreeList[E+c.ScrollIndex]if#y>0 then if y.Object~=HiddenEntriesMain then y.Expanded=not y.Expanded else if not MuteHiddenItems then q[HiddenGame]={Object=HiddenGame;Parent=nil;Index=0,Expanded=true}else for q,y in pairs(game:GetChildren())do if not childrenGame[y]then P(y,true,HiddenGame)end end end MuteHiddenItems=not MuteHiddenItems y.HiddenExpanded=not y.HiddenExpanded end if y.Object==explorerPanel.Parent and y.Expanded then CreateCaution("\087\097\114\110\105\110\103","\077\111\100\105\102\121\105\110\103 \116\104\101 \099\111\110\116\101\110\116\115 \111\102 \116\104\105\115 \073\110\115\116\097\110\099\101 \099\111\117\108\100 \099\097\117\115\101 \101\114\114\097\116\105\099 \111\114 \117\110\115\116\097\098\108\101 \098\101\104\097\118\105\111\114\046 \080\114\111\099\101\101\100 \119\105\116\104 \099\097\117\116\105\111\110\046")end d()end end)i.MouseButton1Down:connect(function(q,y)local K=TreeList[E+c.ScrollIndex]DestroyRightClick()if GetAwaitRemote:Invoke()then bindSetAwaiting:Fire(K.Object)return end if K.Object==HiddenEntriesMain then return end if not HoldingShift then lastSelectedNode=E+c.ScrollIndex end if HoldingShift and not filteringWorkspace()then if lastSelectedNode then if(E+c.ScrollIndex)-lastSelectedNode>0 then j:StopUpdates()for q=1,(E+c.ScrollIndex)-lastSelectedNode,1 do local y=TreeList[lastSelectedNode+q]if y then j:Add(y.Object)end end j:ResumeUpdates()else j:StopUpdates()for q=(E+c.ScrollIndex)-lastSelectedNode,1,1 do local y=TreeList[lastSelectedNode+q]if y then j:Add(y.Object)end end j:ResumeUpdates()end end return end if HoldingCtrl then if j.Selected[K.Object]then j:Remove(K.Object)else j:Add(K.Object)end return end if Option.Modifiable then local b=Vector2_new(q,y)m(K.Object,i:Clone(),b,i.AbsolutePosition-b)elseif Option.Selectable then if j.Selected[K.Object]then j:Set({})else j:Set({K.Object})end z(E+c.ScrollIndex,true,"\077\111\117\115\101\066\117\116\116\111\110\049\085\112")end end)local O i.MouseButton2Down:connect(function()if not Option.Selectable then return end DestroyRightClick()O=i local q=TreeList[E+c.ScrollIndex]if q.Object==HiddenEntriesMain then return end if GetAwaitRemote:Invoke()then bindSetAwaiting:Fire(q.Object)return end if not j.Selected[q.Object]then j:Set({q.Object})end end)i.MouseButton2Up:connect(function()if not Option.Selectable then return end local q=TreeList[E+c.ScrollIndex]if q.Object==HiddenEntriesMain then return end if checkMouseInGui(O)then rightClickMenu(q.Object)end end)i.Parent=listFrame end i.Visible=true local O=P.Object if P.Object~=HiddenEntriesMain then if#P==0 then i.IndentFrame.Expand.Visible=false elseif P.Expanded then Icon(i.IndentFrame.Expand,NODE_EXPANDED)i.IndentFrame.Expand.Visible=true else Icon(i.IndentFrame.Expand,NODE_COLLAPSED)i.IndentFrame.Expand.Visible=true end else if P.HiddenExpanded then Icon(i.IndentFrame.Expand,NODE_EXPANDED)i.IndentFrame.Expand.Visible=true else Icon(i.IndentFrame.Expand,NODE_COLLAPSED)i.IndentFrame.Expand.Visible=true end end if O~=HiddenEntriesMain then i.IndentFrame.EntryText.Position=UDim2_new(0,(2+ENTRY_SIZE)+4,0,0)i.IndentFrame.ExplorerIcon.Visible=true ClassIcon(i.IndentFrame.ExplorerIcon,ClassIndex[O.ClassName]or 0)else i.IndentFrame.EntryText.Position=UDim2_new(0,0,0,0)i.IndentFrame.ExplorerIcon.Visible=false end local a=P.Depth*((2+ENTRY_PADDING)+GUI_SIZE)i.IndentFrame.Position=UDim2_new(0,a,0,0)i.IndentFrame.Size=UDim2_new(1,-a,1,0)NameHiddenEntries()if b[i]then b[i]:disconnect()end local I=i.IndentFrame.EntryText I.Text=O.Name b[i]=P.Object.Changed:connect(function(q)if q=="\078\097\109\101"then I.Text=O.Name end end)i.IndentFrame.Transparency=P.Selected and 0 or 1 I.TextColor3=GuiColor[P.Selected and"\084\101\120\116\083\101\108\101\099\116\101\100"or"\084\101\120\116"]i.Size=UDim2_new(0,y,0,ENTRY_SIZE)elseif K[E]then K[E].Visible=false end end for q=c.VisibleSpace+1,c.TotalSpace,1 do local y=K[q]if y then K[q]=nil y:Destroy()end end end function scrollBarH.UpdateCallback(q)for q=1,scrollBar.VisibleSpace,1 do local y=TreeList[q+scrollBar.ScrollIndex]if y then local y=K[q]if y then y.Position=UDim2_new(0,2-scrollBarH.ScrollIndex,0,ENTRY_BOUND*(q-1)+2)end end end end Connect(listFrame.Changed,function(q)if q=="\065\098\115\111\108\117\116\101\083\105\122\101"then E()end end)local O=6 explorerPanel.MouseWheelForward:connect(function()if scrollBar.VisibleSpace-1>O then scrollBar:ScrollTo(scrollBar.ScrollIndex-O)else scrollBar:ScrollTo(scrollBar.ScrollIndex-scrollBar.VisibleSpace)end end)explorerPanel.MouseWheelBackward:connect(function()if scrollBar.VisibleSpace-1>O then scrollBar:ScrollTo(scrollBar.ScrollIndex+O)else scrollBar:ScrollTo(scrollBar.ScrollIndex+scrollBar.VisibleSpace)end end)end

local NodeLookup = {}

local nodeWidth = 0

local QuickButtons = {}

function filteringWorkspace()
	if explorerFilter.Text ~= "" and explorerFilter.Text ~= "Filter workspace..." then
		return true
	end
	return false
end

function lookForAName(obj,name)
	for i,v in pairs(obj:GetChildren()) do
		if string.find(string.lower(v.Name),string.lower(name)) then nameScanned = true end
		lookForAName(v,name)
	end
end

function scanName(obj)
	nameScanned = false
	if string.find(string.lower(obj.Name),string.lower(explorerFilter.Text)) then
		nameScanned = true
	else
		lookForAName(obj,explorerFilter.Text)
	end
	return nameScanned
end

function updateActions()
	for i,v in pairs(QuickButtons) do
		if v.Cond() then
			v.Toggle(true)
		else
			v.Toggle(false)
		end
	end
end

local updateList,rawUpdateList,updateScroll,rawUpdateSize do
	local function r(t)
		for i = 1,#t do
			if not filteringWorkspace() or scanName(t[i].Object) then
				if t.Object == game then
					if childrenGame[t[i].Object] then
						TreeList[#TreeList+1] = t[i]

						local w = (t[i].Depth)*(2+ENTRY_PADDING+GUI_SIZE) + 2 + ENTRY_SIZE + 4 + getTextWidth(t[i].Object.Name) + 4
						if w > nodeWidth then
							nodeWidth = w
						end
						if t[i].Expanded or filteringWorkspace() then
							r(t[i])
						end
					end
				else
					TreeList[#TreeList+1] = t[i]

					local w = (t[i].Depth)*(2+ENTRY_PADDING+GUI_SIZE) + 2 + ENTRY_SIZE + 4 + getTextWidth(t[i].Object.Name) + 4
					if w > nodeWidth then
						nodeWidth = w
					end
					if t[i].Expanded or filteringWorkspace() then
						r(t[i])
					end
				end
			end
		end
	end

	function rawUpdateSize()
		scrollBarH.TotalSpace = nodeWidth
		scrollBarH.VisibleSpace = listFrame.AbsoluteSize.x
		scrollBarH:Update()
		local visible = scrollBarH:CanScrollDown() or scrollBarH:CanScrollUp()
		scrollBarH.GUI.Visible = visible

		listFrame.Size = UDim2_new(1,-GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)

		scrollBar.VisibleSpace = math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)
		scrollBar.GUI.Size = UDim2_new(0,GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)

		scrollBar.TotalSpace = #TreeList+1
		scrollBar:Update()
	end

	function rawUpdateList()
		-- Clear then repopulate the entire list. It appears to be fast enough.
		TreeList = {}
		nodeWidth = 0
		r(NodeLookup[game])
		r(NodeLookup[DexOutput])
		r(NodeLookup[HiddenEntries])
		r(NodeLookup[HiddenGame])
		rawUpdateSize()
		updateActions()
	end

	-- Adding or removing large models will cause many updates to occur. We
	-- can reduce the number of updates by creating a delay, then dropping any
	-- updates that occur during the delay.
	local updatingList = false
	function updateList()
		if updatingList then return end
		updatingList = true
		wait(0.25)
		updatingList = false
		rawUpdateList()
	end

	local updatingScroll = false
	function updateScroll()
		if updatingScroll then return end
		updatingScroll = true
		wait(0.25)
		updatingScroll = false
		scrollBar:Update()
	end
end

local Selection do
	local bindGetSelection = explorerPanel:FindFirstChild("GetSelection")
	if not bindGetSelection then
		bindGetSelection = Create('BindableFunction',{Name = "GetSelection"})
		bindGetSelection.Parent = explorerPanel
	end

	local bindSetSelection = explorerPanel:FindFirstChild("SetSelection")
	if not bindSetSelection then
		bindSetSelection = Create('BindableFunction',{Name = "SetSelection"})
		bindSetSelection.Parent = explorerPanel
	end

	local bindSelectionChanged = explorerPanel:FindFirstChild("SelectionChanged")
	if not bindSelectionChanged then
		bindSelectionChanged = Create('BindableEvent',{Name = "SelectionChanged"})
		bindSelectionChanged.Parent = explorerPanel
	end

	local SelectionList = {}
	local SelectionSet = {}
	local Updates = true
	Selection = {
		Selected = SelectionSet;
		List = SelectionList;
	}

	local function addObject(object)
		-- list update
		local lupdate = false
		-- scroll update
		local supdate = false

		if not SelectionSet[object] then
			local node = NodeLookup[object]
			if node then
				table.insert(SelectionList,object)
				SelectionSet[object] = true
				node.Selected = true

				-- expand all ancestors so that selected node becomes visible
				node = node.Parent
				while node do
					if not node.Expanded then
						node.Expanded = true
						lupdate = true
					end
					node = node.Parent
				end
				supdate = true
			end
		end
		return lupdate,supdate
	end

	Selection.Finding = false
	Selection.Found = {}

	function Selection:Set(objects)
		if Selection.Finding then
			Selection.Found = objects	
		end

		local lupdate = false
		local supdate = false

		if #SelectionList > 0 then
			for i = 1,#SelectionList do
				local object = SelectionList[i]
				local node = NodeLookup[object]
				if node then
					node.Selected = false
					SelectionSet[object] = nil
				end
			end

			SelectionList = {}
			Selection.List = SelectionList
			supdate = true
		end

		for i = 1,#objects do
			local l,s = addObject(objects[i])
			lupdate = l or lupdate
			supdate = s or supdate
		end

		if lupdate then
			rawUpdateList()
			supdate = true
		elseif supdate then
			scrollBar:Update()
		end

		if supdate then
			bindSelectionChanged:Fire()
			updateActions()
		end
	end

	function Selection:Add(object)
		local l,s = addObject(object)
		if l then
			rawUpdateList()
			if Updates then
				bindSelectionChanged:Fire()
				updateActions()
			end
		elseif s then
			scrollBar:Update()
			if Updates then
				bindSelectionChanged:Fire()
				updateActions()
			end
		end
	end

	function Selection:StopUpdates()
		Updates = false
	end

	function Selection:ResumeUpdates()
		Updates = true
		bindSelectionChanged:Fire()
		updateActions()
	end

	function Selection:Remove(object,noupdate)
		if SelectionSet[object] then
			local node = NodeLookup[object]
			if node then
				node.Selected = false
				SelectionSet[object] = nil
				for i = 1,#SelectionList do
					if SelectionList[i] == object then
						table.remove(SelectionList,i)
						break
					end
				end

				if not noupdate then
					scrollBar:Update()
				end
				bindSelectionChanged:Fire()
				updateActions()
			end
		end
	end

	function Selection:Get()
		local list = {}
		for i = 1,#SelectionList do
			if SelectionList[i] ~= HiddenEntriesMain and SelectionList[i] ~= DexOutputMain then
				table.insert(list, SelectionList[i])
			end
		end
		return list
	end

	bindSetSelection.OnInvoke = function(...)
		Selection:Set(...)
	end

	bindGetSelection.OnInvoke = function()
		return Selection:Get()
	end
end

function CreateCaution(title,msg)
	local newCaution = CautionWindow
	newCaution.Visible = true
	newCaution.Title.Text = title
	newCaution.MainWindow.Desc.Text = msg
	newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
		newCaution.Visible = false
	end)
end

function CreateTableCaution(title,msg)
	if type(msg) ~= "table" then return CreateCaution(title,tostring(msg)) end
	local newCaution = TableCautionWindow:Clone()
	newCaution.Title.Text = title

	local TableList = newCaution.MainWindow.TableResults
	local TableTemplate = newCaution.MainWindow.TableTemplate

	for i,v in pairs(msg) do
		local newResult = TableTemplate:Clone()
		newResult.Type.Text = type(v)
		newResult.Value.Text = tostring(v)
		newResult.Position = UDim2_new(0,0,0,#TableList:GetChildren() * 20)
		newResult.Parent = TableList
		TableList.CanvasSize = UDim2_new(0,0,0,#TableList:GetChildren() * 20)
		newResult.Visible = true
	end
	newCaution.Parent = explorerPanel.Parent
	newCaution.Visible = true
	newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
		newCaution:Destroy()
	end)
end

local function Split(str, delimiter)
	local start = 1
	local t = {}
	while true do
		local pos = string.find (str, delimiter, start, true)
		if not pos then
			break
		end
		table.insert (t, string.sub (str, start, pos - 1))
		start = pos + string.len (delimiter)
	end
	table.insert (t, string.sub (str, start))
	return t
end

local function ToValue(value,type)
	if type == "Vector2" then
		local list = Split(value,",")
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return Vector2_new(x,y)
	elseif type == "Vector3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		local z = tonumber(list[3]) or 0
		return Vector3_new(x,y,z)
	elseif type == "Color3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local r = tonumber(list[1]) or 0
		local g = tonumber(list[2]) or 0
		local b = tonumber(list[3]) or 0
		return Color3_new(r/255,g/255, b/255)
	elseif type == "UDim2" then
		local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
		if #list < 4 then return nil end
		local xScale = tonumber(list[1]) or 0
		local xOffset = tonumber(list[2]) or 0
		local yScale = tonumber(list[3]) or 0
		local yOffset = tonumber(list[4]) or 0
		return UDim2_new(xScale, xOffset, yScale, yOffset)
	elseif type == "Number" then
		return tonumber(value)
	elseif type == "String" then
		return value
	elseif type == "NumberRange" then
		local list = Split(value,",")
		if #list == 1 then
			if tonumber(list[1]) == nil then return nil end
			local newVal = tonumber(list[1]) or 0
			return NumberRange.new(newVal)
		end
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return NumberRange.new(x,y)
	elseif type == "Script" then
		local success,err = pcall(function()
			--return loadstring("return "..tostring(value), "?")()
		end)
		if err then
			return nil
		end
	else
		return nil
	end
end

local function ToPropValue(value,type)
	if type == "Vector2" then
		local list = Split(value,",")
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return Vector2_new(x,y)
	elseif type == "Vector3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		local z = tonumber(list[3]) or 0
		return Vector3_new(x,y,z)
	elseif type == "Color3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local r = tonumber(list[1]) or 0
		local g = tonumber(list[2]) or 0
		local b = tonumber(list[3]) or 0
		return Color3_new(r/255,g/255, b/255)
	elseif type == "UDim2" then
		local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
		if #list < 4 then return nil end
		local xScale = tonumber(list[1]) or 0
		local xOffset = tonumber(list[2]) or 0
		local yScale = tonumber(list[3]) or 0
		local yOffset = tonumber(list[4]) or 0
		return UDim2_new(xScale, xOffset, yScale, yOffset)
	elseif type == "Content" then
		return value
	elseif type == "float" or type == "int" or type == "double" then
		return tonumber(value)
	elseif type == "string" then
		return value
	elseif type == "NumberRange" then
		local list = Split(value,",")
		if #list == 1 then
			if tonumber(list[1]) == nil then return nil end
			local newVal = tonumber(list[1]) or 0
			return NumberRange.new(newVal)
		end
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return NumberRange.new(x,y)
	elseif string.sub(value,1,4) == "Enum" then
		local getEnum = value
		while true do
			local x,y = string.find(getEnum,".")
			if y then
				getEnum = string.sub(getEnum,y+1)
			else
				break
			end
		end
		print(getEnum)
		return getEnum
	else
		return nil
	end
end

function PromptCaller(inst)
	if CurrentRemoteWindow then
		CurrentRemoteWindow:Destroy()
		CurrentRemoteWindow = nil
	end
	CurrentRemoteWindow = RemoteWindow:Clone()
	CurrentRemoteWindow.Parent = explorerPanel.Parent
	CurrentRemoteWindow.Visible = true

	local displayValues = false

	local ArgumentList = CurrentRemoteWindow.MainWindow.Arguments
	local ArgumentTemplate = CurrentRemoteWindow.MainWindow.ArgumentTemplate

	if inst:IsA("RemoteEvent") or inst:IsA("BindableEvent") then
		CurrentRemoteWindow.Title.Text = "Fire Event"
		CurrentRemoteWindow.MainWindow.Ok.Text = "Fire"
		CurrentRemoteWindow.MainWindow.DisplayReturned.Visible = false
		CurrentRemoteWindow.MainWindow.Desc2.Visible = false
	end

	if inst:IsA("RemoteEvent") or inst:IsA("RemoteFunction") then
		local newArgument = ArgumentTemplate:Clone()
		newArgument.Parent = ArgumentList
		newArgument.Visible = true
		newArgument.Type.Text = "UserNameToFire"
	end

	local newArgument = ArgumentTemplate:Clone()
	if inst:IsA("RemoteEvent") or inst:IsA("RemoteFunction") then
		newArgument.Position = UDim2_new(0,0,0,20)
		ArgumentList.CanvasSize = UDim2_new(0,0,0,40)
	end
	newArgument.Parent = ArgumentList
	newArgument.Visible = true
	newArgument.Type.MouseButton1Down:connect(function()
		createDDown(newArgument.Type,function(choice)
			newArgument.Type.Text = choice
		end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
	end)

	CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()
		if CurrentRemoteWindow and inst.Parent ~= nil then
			local MyArguments = {}
			for i,v in pairs(ArgumentList:GetChildren()) do
				if inst:IsA("RemoteFunction") or inst:IsA("RemoteEvent") and i == 1 then
					local Players = game:GetService("Players")
					if Players:FindFirstChild(v.Value.Text) then
						table.insert(MyArguments,Players[v.Value.Text])
					else
						CreateCaution("Remote Caller","The username defined is not in-game.")
						return
					end
				end
				table.insert(MyArguments,ToValue(v.Value.Text,v.Type.Text))
			end
			if inst:IsA("RemoteFunction") or inst:IsA("RemoteEvent") then
				if displayValues then
					spawn(function()
						local myResults = RemoteEvent:InvokeServer("CallRemote",inst,MyArguments)
						if myResults then
							CreateTableCaution("Remote Caller",myResults)
						else
							CreateCaution("Remote Caller","This remote did not return anything.")
						end
					end)
				else
					spawn(function()
						RemoteEvent:InvokeServer("CallRemote",inst,MyArguments)
					end)
				end
			else
				RemoteEvent:InvokeServer("CallRemote",inst,MyArguments)
			end
			CurrentRemoteWindow:Destroy()
			CurrentRemoteWindow = nil
		end
	end)

	CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			local newArgument = ArgumentTemplate:Clone()
			newArgument.Position = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			newArgument.Parent = ArgumentList
			ArgumentList.CanvasSize = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			newArgument.Visible = true
			newArgument.Type.MouseButton1Down:connect(function()
				createDDown(newArgument.Type,function(choice)
					newArgument.Type.Text = choice
				end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
			end)
		end
	end)

	CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			if (inst:IsA("RemoteFunction") or inst:IsA("RemoteEvent")) and #ArgumentList:GetChildren() > 2 then
				ArgumentList:GetChildren()[#ArgumentList:GetChildren()]:Destroy()
				ArgumentList.CanvasSize = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			elseif inst:IsA("RemoteFunction") == false and inst:IsA("RemoteEvent") == false and #ArgumentList:GetChildren() > 1 then
				ArgumentList:GetChildren()[#ArgumentList:GetChildren()]:Destroy()
				ArgumentList.CanvasSize = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			end
		end
	end)

	CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			CurrentRemoteWindow:Destroy()
			CurrentRemoteWindow = nil
		end
	end)

	CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()
		if displayValues then
			displayValues = false
			CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = false
		else
			displayValues = true
			CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = true
		end
	end)
end

function DestroyRightClick()
	if currentRightClickMenu then
		currentRightClickMenu:Destroy()
		currentRightClickMenu = nil
	end
	if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then
		CurrentInsertObjectWindow.Visible = false
	end
end

function rightClickMenu(sObj)
	local mouse = game:GetService("Players").LocalPlayer:GetMouse()

	currentRightClickMenu = CreateRightClickMenu(
		{"Cut","Copy","Paste Into","Duplicate","Delete",false,"Group","Ungroup","Select Children",false,"Teleport To","Call Function","Call Remote/Bindable",false,"Insert Part","Insert Object",false},
		"",
		false,
		function(option)
			if option == "Cut" then
				if not Option.Modifiable then return end
				clipboard = {}
				RemoteEvent:InvokeServer("ClearClipboard")
				local list = Selection.List
				local cut = {}
				for i = 1,#list do
					local _, obj = pcall(function() return list[i]:Clone() end)
					if obj then
						table.insert(clipboard,obj)
						table.insert(cut,list[i])
						RemoteEvent:InvokeServer("Copy", list[i])
					end
				end
				for i = 1,#cut do
					pcall(delete,cut[i])
				end
				updateActions()
			elseif option == "Copy" then
				if not Option.Modifiable then return end
				clipboard = {}
				RemoteEvent:InvokeServer("ClearClipboard")
				local list = Selection.List
				for i = 1,#list do
					local _, obj = pcall(function() return list[i]:Clone() end)
					if obj then
						table.insert(clipboard,obj)
					end

					RemoteEvent:InvokeServer("Copy", list[i])
				end
				updateActions()
			elseif option == "Paste Into" then
				if not Option.Modifiable then return end
				local parent = Selection.List[1] or workspace
				if not RemoteEvent:InvokeServer("Paste", parent) then
					for i = 1,#clipboard do
						if (clipboard[i]) then
							pcall(function()
								clipboard[i]:Clone().Parent = parent
							end)
						end
					end
				end
			elseif option == "Duplicate" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				local parent = Selection.List[1].Parent or workspace;
				for i = 1,#list do
					if not RemoteEvent:InvokeServer("Duplicate", list[i], parent) then -- scel was here again hi
						local _, obj = pcall(function() return list[i]:Clone() end)

						if obj then
							obj.Parent = parent;
						end
					end
				end
			elseif option == "Delete" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					pcall(delete,list[i])
				end
				Selection:Set({})
			elseif option == "Group" then
				if not Option.Modifiable then return end
				local parent = Selection.List[1].Parent or workspace
				local newModel = RemoteEvent:InvokeServer("InstanceNew", "Model", {Parent = parent}) or Instance_new("Model")
				local list = Selection:Get()
				newModel.Parent = parent
				for i = 1,#list do
					list[i].Parent = newModel
					RemoteEvent:InvokeServer("SetProperty", list[i], "Parent", newModel)
				end
				Selection:Set({})
			elseif option == "Ungroup" then
				if not Option.Modifiable then return end
				local ungrouped = {}
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("Model") then
						for i2,v2 in pairs(list[i]:GetChildren()) do
							v2.Parent = list[i].Parent or workspace
							table.insert(ungrouped,v2)
							RemoteEvent:InvokeServer("SetProperty", v2, "Parent", list[i].Parent or workspace)
						end		
						pcall(delete,list[i])			
					end
				end
				Selection:Set({})
				if SettingsRemote:Invoke("SelectUngrouped") then
					for i,v in pairs(ungrouped) do
						Selection:Add(v)
					end
				end
			elseif option == "Select Children" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				Selection:Set({})
				Selection:StopUpdates()
				for i = 1,#list do
					for i2,v2 in pairs(list[i]:GetChildren()) do
						Selection:Add(v2)
					end
				end
				Selection:ResumeUpdates()
			elseif option == "Teleport To" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("BasePart") then
						pcall(function()
							game:GetService("Players").LocalPlayer.Character.HumanoidRootPart.CFrame = list[i].CFrame
						end)
						break
					end
				end
			elseif option == "Insert Part" then
				if not Option.Modifiable then return end
				local insertedParts = {}
				local list = Selection:Get()
				for i = 1,#list do
					pcall(function()
						local props = {}
						props.Parent = list[i]
						props.CFrame = CFrame_new(game:GetService("Players").LocalPlayer.Character.Head.Position) + Vector3_new(0,3,0)

						local newPart = RemoteEvent:InvokeServer("InstanceNew", "Part", props) or Instance_new("Part")
						newPart.Parent = props.Parent;
						newPart.CFrame = props.CFrame;
						table.insert(insertedParts,newPart)
					end)
				end
			elseif option == "Call Remote/Bindable" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("RemoteFunction") or list[i]:IsA("RemoteEvent") or list[i]:IsA("BindableFunction") or list[i]:IsA("BindableEvent") then
						PromptCaller(list[i])
						break
					end
				end
			end
		end)
	currentRightClickMenu.Parent = explorerPanel.Parent
	currentRightClickMenu.Position = UDim2_new(0,mouse.X,0,mouse.Y)
	if currentRightClickMenu.AbsolutePosition.X + currentRightClickMenu.AbsoluteSize.X > explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X then
		currentRightClickMenu.Position = UDim2_new(0, explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X - currentRightClickMenu.AbsoluteSize.X, 0, mouse.Y)
	end
end

local function cancelReparentDrag()end
local function cancelSelectDrag()end
do
	local listEntries = {}
	local nameConnLookup = {}

	local mouseDrag = Create('ImageButton',{
		Name = "MouseDrag";
		Position = UDim2_new(-0.25,0,-0.25,0);
		Size = UDim2_new(1.5,0,1.5,0);
		Transparency = 1;
		AutoButtonColor = false;
		Active = true;
		ZIndex = 10;
	})
	local function dragSelect(last,add,button)
		local connDrag
		local conUp

		conDrag = mouseDrag.MouseMoved:connect(function(x,y)
			local pos = Vector2_new(x,y) - listFrame.AbsolutePosition
			local size = listFrame.AbsoluteSize
			if pos.x < 0 or pos.x > size.x or pos.y < 0 or pos.y > size.y then return end

			local i = math.ceil(pos.y/ENTRY_BOUND) + scrollBar.ScrollIndex
			-- Mouse may have made a large step, so interpolate between the
			-- last index and the current.
			for n = i<last and i or last, i>last and i or last do
				local node = TreeList[n]
				if node then
					if add then
						Selection:Add(node.Object)
					else
						Selection:Remove(node.Object)
					end
				end
			end
			last = i
		end)

		function cancelSelectDrag()
			mouseDrag.Parent = nil
			conDrag:disconnect()
			conUp:disconnect()
			function cancelSelectDrag()end
		end

		conUp = mouseDrag[button]:connect(cancelSelectDrag)

		mouseDrag.Parent = GetScreen(listFrame)
	end

	local function dragReparent(object,dragGhost,clickPos,ghostOffset)
		local connDrag
		local conUp
		local conUp2

		local parentIndex = nil
		local dragged = false

		local parentHighlight = Create('Frame',{
			Transparency = 1;
			Visible = false;
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(0,0,0,0);
				Size = UDim2_new(1,0,0,1);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(1,0,0,0);
				Size = UDim2_new(0,1,1,0);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(0,0,1,0);
				Size = UDim2_new(1,0,0,1);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(0,0,0,0);
				Size = UDim2_new(0,1,1,0);
			});
		})
		SetZIndex(parentHighlight,9)

		conDrag = mouseDrag.MouseMoved:connect(function(x,y)
			local dragPos = Vector2_new(x,y)
			if dragged then
				local pos = dragPos - listFrame.AbsolutePosition
				local size = listFrame.AbsoluteSize

				parentIndex = nil
				parentHighlight.Visible = false
				if pos.x >= 0 and pos.x <= size.x and pos.y >= 0 and pos.y <= size.y + ENTRY_SIZE*2 then
					local i = math.ceil(pos.y/ENTRY_BOUND-2)
					local node = TreeList[i + scrollBar.ScrollIndex]
					if node and node.Object ~= object and not object:IsAncestorOf(node.Object) then
						parentIndex = i
						local entry = listEntries[i]
						if entry then
							parentHighlight.Visible = true
							parentHighlight.Position = UDim2_new(0,1,0,entry.AbsolutePosition.y-listFrame.AbsolutePosition.y)
							parentHighlight.Size = UDim2_new(0,size.x-4,0,entry.AbsoluteSize.y)
						end
					end
				end

				dragGhost.Position = UDim2_new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
			elseif (clickPos-dragPos).magnitude > 8 then
				dragged = true
				SetZIndex(dragGhost,9)
				dragGhost.IndentFrame.Transparency = 0.25
				dragGhost.IndentFrame.EntryText.TextColor3 = GuiColor.TextSelected
				dragGhost.Position = UDim2_new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
				dragGhost.Parent = GetScreen(listFrame)
				parentHighlight.Parent = listFrame
			end
		end)

		function cancelReparentDrag()
			mouseDrag.Parent = nil
			conDrag:disconnect()
			conUp:disconnect()
			conUp2:disconnect()
			dragGhost:Destroy()
			parentHighlight:Destroy()
			function cancelReparentDrag()end
		end

		local wasSelected = Selection.Selected[object]
		if not wasSelected and Option.Selectable then
			Selection:Set({object})
		end

		conUp = mouseDrag.MouseButton1Up:connect(function()
			cancelReparentDrag()
			if dragged then
				if parentIndex then
					local parentNode = TreeList[parentIndex + scrollBar.ScrollIndex]
					if parentNode then
						parentNode.Expanded = true

						local parentObj = parentNode.Object
						local function parent(a,b)
							a.Parent = b
						end
						if Option.Selectable then
							local list = Selection.List
							for i = 1,#list do
								pcall(parent,list[i],parentObj)
							end
						else
							pcall(parent,object,parentObj)
						end
					end
				end
			else
				-- do selection click
				if wasSelected and Option.Selectable then
					Selection:Set({})
				end
			end
		end)
		conUp2 = mouseDrag.MouseButton2Down:connect(function()
			cancelReparentDrag()
		end)

		mouseDrag.Parent = GetScreen(listFrame)
	end

	local entryTemplate = Create('ImageButton',{
		Name = "Entry";
		Transparency = 1;
		AutoButtonColor = false;
		Position = UDim2_new(0,0,0,0);
		Size = UDim2_new(1,0,0,ENTRY_SIZE);
		Create('Frame',{
			Name = "IndentFrame";
			BackgroundTransparency = 1;
			BackgroundColor3 = GuiColor.Selected;
			BorderColor3 = GuiColor.BorderSelected;
			Position = UDim2_new(0,0,0,0);
			Size = UDim2_new(1,0,1,0);
			Create(Icon('ImageButton',0),{
				Name = "Expand";
				AutoButtonColor = false;
				Position = UDim2_new(0,-GUI_SIZE,0.5,-GUI_SIZE/2);
				Size = UDim2_new(0,GUI_SIZE,0,GUI_SIZE);
			});
			Create(ClassIcon(nil,0),{
				Name = "ExplorerIcon";
				Position = UDim2_new(0,2+ENTRY_PADDING,0.5,-GUI_SIZE/2);
				Size = UDim2_new(0,GUI_SIZE,0,GUI_SIZE);
			});
			Create('TextLabel',{
				Name = "EntryText";
				BackgroundTransparency = 1;
				TextColor3 = GuiColor.Text;
				TextXAlignment = 'Left';
				TextYAlignment = 'Center';
				Font = FONT;
				FontSize = FONT_SIZE;
				Text = "";
				Position = UDim2_new(0,2+ENTRY_SIZE+4,0,0);
				Size = UDim2_new(1,-2,1,0);
			});
		});
	})

	function scrollBar.UpdateCallback(self)
		for i = 1,self.VisibleSpace do
			local node = TreeList[i + self.ScrollIndex]
			if node then
				local entry = listEntries[i]
				if not entry then
					entry = Create(entryTemplate:Clone(),{
						Position = UDim2_new(0,2,0,ENTRY_BOUND*(i-1)+2);
						Size = UDim2_new(0,nodeWidth,0,ENTRY_SIZE);
						ZIndex = listFrame.ZIndex;
					})
					listEntries[i] = entry

					local expand = entry.IndentFrame.Expand
					expand.MouseEnter:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							if node.Object ~= HiddenEntriesMain then
								if node.Expanded then
									Icon(expand,NODE_EXPANDED_OVER)
								else
									Icon(expand,NODE_COLLAPSED_OVER)
								end
							else
								if node.HiddenExpanded then
									Icon(expand,NODE_EXPANDED_OVER)
								else
									Icon(expand,NODE_COLLAPSED_OVER)
								end								
							end
						end
					end)
					expand.MouseLeave:connect(function()
						pcall(function()
							local node = TreeList[i + self.ScrollIndex]
							if node.Object == HiddenEntriesMain then
								if node.HiddenExpanded then
									Icon(expand,NODE_EXPANDED)
								else
									Icon(expand,NODE_COLLAPSED)
								end
								return
							end
							if #node > 0 then
								if node.Expanded then
									Icon(expand,NODE_EXPANDED)
								else
									Icon(expand,NODE_COLLAPSED)
								end
							end
						end)
					end)

					local function radd(o,refresh,parent)	
						addObject(o,refresh,parent)					
						local s,children = pcall(function() return o:GetChildren() end, o)
						if s then
							for i = 1,#children do								
								radd(children[i],refresh,o)
							end
						end
					end

					expand.MouseButton1Down:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							if node.Object ~= HiddenEntriesMain then				
								node.Expanded = not node.Expanded
							else	
								if not MuteHiddenItems then
									NodeLookup[HiddenGame] = {
										Object = HiddenGame;
										Parent = nil;
										Index = 0;
										Expanded = true;
									}
								else
									for i,v in pairs(game:GetChildren()) do
										if not childrenGame[v] then
											radd(v, true, HiddenGame)
										end
									end									
								end

								MuteHiddenItems = not MuteHiddenItems
								node.HiddenExpanded = not node.HiddenExpanded
							end
							if node.Object == explorerPanel.Parent and node.Expanded then
								CreateCaution("Warning", "Modifying the contents of this Instance could cause erratic or unstable behavior. Proceed with caution.")
							end
							-- use raw update so the list updates instantly
							rawUpdateList()
						end
					end)

					entry.MouseButton1Down:connect(function(x,y)
						local node = TreeList[i + self.ScrollIndex]
						DestroyRightClick()
						if GetAwaitRemote:Invoke() then
							bindSetAwaiting:Fire(node.Object)
							return
						end

						if node.Object == HiddenEntriesMain then
							return
						end

						if not HoldingShift then
							lastSelectedNode = i + self.ScrollIndex
						end

						if HoldingShift and not filteringWorkspace() then
							if lastSelectedNode then
								if i + self.ScrollIndex - lastSelectedNode > 0 then
									Selection:StopUpdates()
									for i2 = 1, i + self.ScrollIndex - lastSelectedNode do
										local newNode = TreeList[lastSelectedNode + i2]
										if newNode then
											Selection:Add(newNode.Object)
										end
									end
									Selection:ResumeUpdates()
								else
									Selection:StopUpdates()
									for i2 = i + self.ScrollIndex - lastSelectedNode, 1 do
										local newNode = TreeList[lastSelectedNode + i2]
										if newNode then
											Selection:Add(newNode.Object)
										end
									end
									Selection:ResumeUpdates()
								end
							end
							return
						end

						if HoldingCtrl then
							if Selection.Selected[node.Object] then
								Selection:Remove(node.Object)
							else
								Selection:Add(node.Object)
							end
							return
						end
						if Option.Modifiable then
							local pos = Vector2_new(x,y)
							dragReparent(node.Object,entry:Clone(),pos,entry.AbsolutePosition-pos)
						elseif Option.Selectable then
							if Selection.Selected[node.Object] then
								Selection:Set({})
							else
								Selection:Set({node.Object})
							end
							dragSelect(i+self.ScrollIndex,true,'MouseButton1Up')
						end
					end)

					local curSelect
					entry.MouseButton2Down:connect(function()
						if not Option.Selectable then return end

						DestroyRightClick()

						curSelect = entry

						local node = TreeList[i + self.ScrollIndex]

						if node.Object == HiddenEntriesMain then
							return
						end

						if GetAwaitRemote:Invoke() then
							bindSetAwaiting:Fire(node.Object)
							return
						end

						if not Selection.Selected[node.Object] then
							Selection:Set({node.Object})
						end
					end)


					entry.MouseButton2Up:connect(function()
						if not Option.Selectable then return end

						local node = TreeList[i + self.ScrollIndex]

						if node.Object == HiddenEntriesMain then
							return
						end

						if checkMouseInGui(curSelect) then
							rightClickMenu(node.Object)
						end
					end)

					entry.Parent = listFrame
				end

				entry.Visible = true

				local object = node.Object

				-- update expand icon
				if node.Object ~= HiddenEntriesMain then
					if #node == 0 then
						entry.IndentFrame.Expand.Visible = false
					elseif node.Expanded then
						Icon(entry.IndentFrame.Expand,NODE_EXPANDED)
						entry.IndentFrame.Expand.Visible = true
					else
						Icon(entry.IndentFrame.Expand,NODE_COLLAPSED)
						entry.IndentFrame.Expand.Visible = true
					end
				else
					if node.HiddenExpanded then
						Icon(entry.IndentFrame.Expand,NODE_EXPANDED)
						entry.IndentFrame.Expand.Visible = true
					else
						Icon(entry.IndentFrame.Expand,NODE_COLLAPSED)
						entry.IndentFrame.Expand.Visible = true
					end
				end

				-- update explorer icon
				if object ~= HiddenEntriesMain then
					entry.IndentFrame.EntryText.Position = UDim2_new(0,2+ENTRY_SIZE+4,0,0);
					entry.IndentFrame.ExplorerIcon.Visible = true
					ClassIcon(entry.IndentFrame.ExplorerIcon,ClassIndex[object.ClassName] or 0)
				else
					entry.IndentFrame.EntryText.Position = UDim2_new(0,0,0,0);
					entry.IndentFrame.ExplorerIcon.Visible = false
				end

				-- update indentation
				local w = (node.Depth)*(2+ENTRY_PADDING+GUI_SIZE)
				entry.IndentFrame.Position = UDim2_new(0,w,0,0)
				entry.IndentFrame.Size = UDim2_new(1,-w,1,0)

				-- update hidden entries name
				NameHiddenEntries()

				-- update name change detection
				if nameConnLookup[entry] then
					nameConnLookup[entry]:disconnect()
				end
				local text = entry.IndentFrame.EntryText
				text.Text = object.Name
				nameConnLookup[entry] = node.Object.Changed:connect(function(p)
					if p == 'Name' then
						text.Text = object.Name
					end
				end)

				-- update selection
				entry.IndentFrame.Transparency = node.Selected and 0 or 1
				text.TextColor3 = GuiColor[node.Selected and 'TextSelected' or 'Text']

				entry.Size = UDim2_new(0,nodeWidth,0,ENTRY_SIZE)
			elseif listEntries[i] then
				listEntries[i].Visible = false
			end
		end
		for i = self.VisibleSpace+1,self.TotalSpace do
			local entry = listEntries[i]
			if entry then
				listEntries[i] = nil
				entry:Destroy()
			end
		end
	end

	function scrollBarH.UpdateCallback(self)
		for i = 1,scrollBar.VisibleSpace do
			local node = TreeList[i + scrollBar.ScrollIndex]
			if node then
				local entry = listEntries[i]
				if entry then
					entry.Position = UDim2_new(0,2 - scrollBarH.ScrollIndex,0,ENTRY_BOUND*(i-1)+2)
				end
			end
		end
	end

	Connect(listFrame.Changed,function(p)
		if p == 'AbsoluteSize' then
			rawUpdateSize()
		end
	end)

	local wheelAmount = 6
	explorerPanel.MouseWheelForward:connect(function()
		if scrollBar.VisibleSpace - 1 > wheelAmount then
			scrollBar:ScrollTo(scrollBar.ScrollIndex - wheelAmount)
		else
			scrollBar:ScrollTo(scrollBar.ScrollIndex - scrollBar.VisibleSpace)
		end
	end)
	explorerPanel.MouseWheelBackward:connect(function()
		if scrollBar.VisibleSpace - 1 > wheelAmount then
			scrollBar:ScrollTo(scrollBar.ScrollIndex + wheelAmount)
		else
			scrollBar:ScrollTo(scrollBar.ScrollIndex + scrollBar.VisibleSpace)
		end
	end)
end
