local function J(J)local M=J.tags for J,M in pairs(M)do if M=="\100\101\112\114\101\099\097\116\101\100"or M=="\104\105\100\100\101\110"or M=="\119\114\105\116\101\111\110\108\121"then return true end end return false end function Set(J,M,o)local G=M.Name local A=M.ValueType if o==nil then return end for J,A in pairs(GetSelection())do if CanEditProperty(A,M)then pcall(function()A[G]=o end)end end end function CreateRow(J,M,o)local G=M.Name local A=M.ValueType local R=J[G]local w=Row.BackgroundColor if o then w=Row.BackgroundColorAlternate end local d=not CanEditProperty(J,M)if A=="\073\110\115\116\097\110\099\101"or G=="\080\097\114\101\110\116"then d=true end local K=Instance.new("\070\114\097\109\101")K.Size=UDim2.new(1,0,0,Row.Height)K.BackgroundTransparency=1 K.Name="\082\111\119"local I=CreateCell()I.Parent=K I.ClipsDescendants=true local h=CreateLabel(d)h.Text=G h.Size=UDim2.new(1,-1*Row.TitleMarginLeft,1,0)h.Position=UDim2.new(0,Row.TitleMarginLeft,0,0)h.Parent=I local B=CreateCell()B.Size=UDim2.new(.5,-1,1,0)B.Position=UDim2.new(.5,0,0,0)B.Parent=K local Q=GetControl(J,M,d)Q.Parent=B K.MouseEnter:connect(function()I.BackgroundColor3=Row.BackgroundColorMouseover B.BackgroundColor3=Row.BackgroundColorMouseover end)K.MouseLeave:connect(function()I.BackgroundColor3=w B.BackgroundColor3=w end)I.BackgroundColor3=w B.BackgroundColor3=w return K end function ClearPropertiesList()for J,M in pairs(ContentFrame:GetChildren())do M:Destroy()end end local M=Gui:FindFirstChild("\083\101\108\101\099\116\105\111\110",1)print(M)function displayProperties(J)for J,M in pairs(J)do pcall(function()local J=CreateRow(M.object,M.propertyData,numRows%2==0)J.Position=UDim2.new(0,0,0,numRows*Row.Height)J.Parent=ContentFrame numRows=numRows+1 end)end end function checkForDupe(J,M)for M,o in pairs(M)do if o.propertyData.Name==J.Name and o.propertyData.ValueType==J.ValueType then return true end end return false end function sortProps(J)table.sort(J,function(J,M)return J.propertyData.Name<M.propertyData.Name end)end function showProperties(M)ClearPropertiesList()if M==nil then return end local o={}local G={}numRows=0 for M,A in pairs(M)do if not G[A.className]then G[A.className]=true for M,G in pairs(RbxApi.GetProperties(A.className))do local R,w=pcall(function()if not J(G)and not checkForDupe(G,o)then if string.find(string.lower(G.Name),string.lower(propertiesSearch.Text))or not searchingProperties()then table.insert(o,{propertyData=G;object=A})end end end)end end end sortProps(o)displayProperties(o)ContentFrame.Size=UDim2.new(1,0,0,numRows*Row.Height)scrollBar.ScrollIndex=0 scrollBar.TotalSpace=numRows*Row.Height scrollBar.Update()end
--RbxApi
local function PropertyIsHidden(propertyData)
	local tags = propertyData["tags"]
	for _, name in pairs(tags) do
		if name == "deprecated" or name == "hidden" or name == "writeonly" then
			return true
		end
	end
	return false
end

function Set(object, propertyData, value)
	local propertyName = propertyData["Name"]
	local propertyType = propertyData["ValueType"]

	if value == nil then
		return
	end

	for i, v in pairs(GetSelection()) do
		if CanEditProperty(v, propertyData) then
			pcall(function()
				--print("Setting " .. propertyName .. " to " .. tostring(value))
				v[propertyName] = value
			end)
		end
	end
end

function CreateRow(object, propertyData, isAlternateRow)
	local propertyName = propertyData["Name"]
	local propertyType = propertyData["ValueType"]
	local propertyValue = object[propertyName]
	--rowValue, rowValueType, isAlternate
	local backColor = Row.BackgroundColor
	if isAlternateRow then
		backColor = Row.BackgroundColorAlternate
	end

	local readOnly = not CanEditProperty(object, propertyData)
	if propertyType == "Instance" or propertyName == "Parent" then
		readOnly = true
	end

	local rowFrame = Instance.new("Frame")
	rowFrame.Size = UDim2.new(1, 0, 0, Row.Height)
	rowFrame.BackgroundTransparency = 1
	rowFrame.Name = "Row"

	local propertyLabelFrame = CreateCell()
	propertyLabelFrame.Parent = rowFrame
	propertyLabelFrame.ClipsDescendants = true

	local propertyLabel = CreateLabel(readOnly)
	propertyLabel.Text = propertyName
	propertyLabel.Size = UDim2.new(1, -1 * Row.TitleMarginLeft, 1, 0)
	propertyLabel.Position = UDim2.new(0, Row.TitleMarginLeft, 0, 0)
	propertyLabel.Parent = propertyLabelFrame

	local propertyValueFrame = CreateCell()
	propertyValueFrame.Size = UDim2.new(0.5, -1, 1, 0)
	propertyValueFrame.Position = UDim2.new(0.5, 0, 0, 0)
	propertyValueFrame.Parent = rowFrame

	local control = GetControl(object, propertyData, readOnly)
	control.Parent = propertyValueFrame

	rowFrame.MouseEnter:connect(function()
		propertyLabelFrame.BackgroundColor3 = Row.BackgroundColorMouseover
		propertyValueFrame.BackgroundColor3 = Row.BackgroundColorMouseover
	end)
	rowFrame.MouseLeave:connect(function()
		propertyLabelFrame.BackgroundColor3 = backColor
		propertyValueFrame.BackgroundColor3 = backColor
	end)

	propertyLabelFrame.BackgroundColor3 = backColor
	propertyValueFrame.BackgroundColor3 = backColor

	return rowFrame
end

function ClearPropertiesList()
	for _, instance in pairs(ContentFrame:GetChildren()) do
		instance:Destroy()
	end
end

local selection = Gui:FindFirstChild("Selection", 1)
print(selection)

function displayProperties(props)
	for i, v in pairs(props) do
		pcall(function()
			local a = CreateRow(v.object, v.propertyData, ((numRows % 2) == 0))
			a.Position = UDim2.new(0, 0, 0, numRows * Row.Height)
			a.Parent = ContentFrame
			numRows = numRows + 1
		end)
	end
end

function checkForDupe(prop, props)
	for i, v in pairs(props) do
		if v.propertyData.Name == prop.Name and v.propertyData.ValueType == prop.ValueType then
			return true
		end
	end
	return false
end

function sortProps(t)
	table.sort(t, function(x, y)
		return x.propertyData.Name < y.propertyData.Name
	end)
end

function showProperties(obj)
	ClearPropertiesList()
	if obj == nil then
		return
	end
	local propHolder = {}
	local foundProps = {}
	numRows = 0
	for _, nextObj in pairs(obj) do
		if not foundProps[nextObj.className] then
			foundProps[nextObj.className] = true
			for i, v in pairs(RbxApi.GetProperties(nextObj.className)) do
				local suc, err = pcall(function()
					if not (PropertyIsHidden(v)) and not checkForDupe(v, propHolder) then
						if
							string.find(string.lower(v.Name), string.lower(propertiesSearch.Text))
							or not searchingProperties()
						then
							table.insert(propHolder, { propertyData = v, object = nextObj })
						end
					end
				end)
				--[[if not suc then 
					warn("Problem getting the value of property " .. v.Name .. " | " .. err)
				end	--]]
			end
		end
	end
	sortProps(propHolder)
	displayProperties(propHolder)
	ContentFrame.Size = UDim2.new(1, 0, 0, numRows * Row.Height)
	scrollBar.ScrollIndex = 0
	scrollBar.TotalSpace = numRows * Row.Height
	scrollBar.Update()
end
