Roblox/luau_corpus huggingface dataset:
-- Used to set the Notification Modal's text and behavior when actions are selected
local function getText(
	state: UserActions.State,
	action: UserActions.Action,
	setNotificationText: ((string) -> ())?
): string?
	-- Prevents notifications from being shown for opening submenus
	if action.actions then
		return
	end

	-- Handles selection of default subactions
	if action.isDefault and action.parent then
		for _, activeAction in ipairs(state.activeActions) do
			if activeAction.parent and activeAction.parent.name == action.parent.name then
				if callback then
					callback()
					callback = nil
				end

				return activeAction.name .. ": Off"
			end
		end
		return
	end

	-- Handles when notifications for poses are shown
	if action.parent and action.parent.name == UserActions.actions.pose.name then
		local player = Players.LocalPlayer
		local character = if player then player.Character else nil
		local humanoid = if character then character:FindFirstChildOfClass("Humanoid") else nil

		if humanoid then
			if humanoid.MoveDirection ~= Vector3.zero or isJumping(humanoid) then
				-- Prevents notification from being shown while player is moving
				-- and attempting to select a pose
				return
			else
				if callback then
					callback()
					callback = nil
				end

				callback = Emotes.onNextMove(humanoid, function()
					-- Shows the notification modal when player moves after
					-- selecting a pose
					if setNotificationText then
						setNotificationText(action.name .. ": Off")
					end
				end)
			end
		end
	end

	return action.name .. ": " .. if UserActions.isActionActive(state, action) then "On" else "Off"
end

return getText
--Brakes--
local rb = carSeat.Parent.Parent.RWD
local lfb = carSeat.Parent.Parent.LW
local rfb = carSeat.Parent.Parent.RW
carSeat.MaxSpeed = 0
carSeat.TurnSpeed = 0
carSeat.Torque = 0
-- // Connections
playersService.PlayerAdded:Connect(function(player)
    player.CharacterAdded:Connect(function(character)
        
        local rootPart = character:WaitForChild("HumanoidRootPart")
        
        local humanoid = character:WaitForChild("Humanoid")
        local oldHealth = humanoid.Health
        
        local particlesClone = bloodParticles:Clone()
        particlesClone.Parent = rootPart
        
        humanoid.HealthChanged:Connect(function(health)
            if health < oldHealth then
                
                oldHealth = health
                
                spawn(function()
                    for i = 1, blood_parts_per_hit do
                        
                        local raycastOrigin = rootPart.Position + Vector3.new(math.random(-20, 20) / 10, 0, math.random(-20, 20) / 10)
                        local raycastDirection = Vector3.new(0, -8, 0)
                        
                        local raycastResult = raycast(character, raycastOrigin, raycastDirection)
                        
                        if raycastResult then
                            particlesClone:Emit(2)
                            
                            delay(0.5, function()
                                local newBlood = createBlood(raycastResult.Position)
                                expandBlood(newBlood)
                                
                                delay(blood_destroy_delay, function()
                                    deleteBlood(newBlood)
                                end)
                            end)
                        end
                        
                        wait(math.random(0.5, 2) / 10)
                    end
                end)
            else
                oldHealth = health
            end
        end)
        
    end)
end)
-- создание трассы
local rnd=Random.new()

local function Rebuild()	-- пересоздание мира
	for i=0, PartWorld - 1 do
		local index = rnd:NextInteger(1,#models)	-- случайная моделька  
		local model = models[index]:Clone()			-- берём клон
		local posit = CFrame.new(0,0,-180*i)		-- расчёт позиции
		model:SetPrimaryPartCFrame(posit)			-- размещение
		model.Parent = game.Workspace.GameZone		-- привязка к пространству
	end
end
-- double rd_dbl_be(string src, int s)
-- @src - Source binary string
-- @s - Start index of big endian double
local function rd_dbl_be(src, s)
	local f1, f2, f3, f4, f5, f6, f7, f8 = src:byte(s, s + 7) -- same
	return rd_dbl_basic(f8, f7, f6, f5, f4, f3, f2, f1)
end
-- all configurations can be found in the "configurations" model

local configs = script.Parent.Parent.Configurations

script.Parent.Touched:connect(function(hit) -- this is the main function that is called whenever the fire is touched
	if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") and hit.Parent.Humanoid.Health > 0 then -- if we have a player or an AI then	
		if configs.CanKill.Value == true and configs.CanCatchFire.Value == true then -- if the fire sets players alight and gives them damamge then
			local fire = script.Parent.Parent.FirePart.Fire:Clone() -- gatting some fire
			fire.Parent = hit -- putting the fire in the part of the person that touched the fire
			fire.Size = configs.FireSize.Value
			for i = 1, configs.FireDuration.Value do -- this deals with giving damamge to the player
				if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") and hit.Parent.Humanoid.Health > 0 then
					hit.Parent.Humanoid.Health = hit.Parent.Humanoid.Health - 1 -- reduce health
					wait(configs.HarmSpeed.Value) -- this is the time between giving damamge to the player	
				end
			end
			if fire and hit then -- removing unneeded fire
				fire:Destroy()
			end			
		elseif configs.CanKill.Value == true then -- else if we can only kill
			hit.Parent:BreakJoints() -- kill instantly
		elseif configs.CanCatchFire.Value == true then -- else if we can only set alight
			local fire = script.Parent.Parent.FirePart.Fire:Clone() -- getting some fire
			fire.Parent = hit -- making its parent the part that touched the fire
			fire.Size = configs.FireSize.Value
			wait(configs.FireDuration.Value) -- waiting before removing fire
			fire:Destroy() -- removing fire
		end
	end
end)
-- free faces
	["Smile"] = {
		free  = true,
		id = "rbxassetid://144080495",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=144080495&width=420&height=420&format=png"
	},
	["Cunning"] = {
		free  = true,
		id = "rbxassetid://21635489",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=21635489&width=420&height=420&format=png"
	},
	["Laughing"] = {
		free  = true,
		id = "rbxassetid://26424652",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=26424652&width=420&height=420&format=png"
	},
	["Chill"] = {
		free  = true,
		id = "rbxassetid://7074749",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=7074749&width=420&height=420&format=png"
	},
	["Unamused"] = {
		free  = true,
		id = "rbxassetid://20418518",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=20418518&width=420&height=420&format=png"
	},
	["Freckles"] = {
		free  = true,
		id = "rbxassetid://12145059",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=12145059&width=420&height=420&format=png"
	},
	["Beardy"] = {
		free  = true,
		id = "rbxassetid://110287880",
		legacy = true,
		image = "https://www.roblox.com/asset-thumbnail/image?assetId=110287880&width=420&height=420&format=png"
	},
}

return module
-- parent attachments to Terrain 
beam.Parent = workspace.Terrain
attachment0.Parent = workspace.Terrain
attachment1.Parent = workspace.Terrain
--/Recoil Modification
module.camRecoil = {
	RecoilUp 		= .9
	,RecoilTilt 	= 1
	,RecoilLeft 	= 1.05
	,RecoilRight 	= 1.05
}

module.gunRecoil = {
	RecoilUp 		= .9
	,RecoilTilt 	= 1
	,RecoilLeft 	= 1.1
	,RecoilRight 	= 1.1
}

module.AimRecoilReduction = 1
module.AimSpreadReduction = 1

module.MinRecoilPower 			= 1
module.MaxRecoilPower 			= 1
module.RecoilPowerStepAmount 	= 1

module.MinSpread 				= 1
module.MaxSpread 				= 1					
module.AimInaccuracyStepAmount 	= 1
module.AimInaccuracyDecrease 	= 1
module.WalkMult 				= 1

module.MuzzleVelocityMod	 	= 1

return module
-- Variables
local player = game.Players.LocalPlayer
local humanoid = player.Character:WaitForChild("Humanoid")
-- declarations
local toolAnim = "None"
local toolAnimTime = 0

local jumpAnimTime = 0
local jumpAnimDuration = 0.3

local toolTransitionTime = 0.1
local fallTransitionTime = 0.3
--[=[
	Cancels this promise, preventing the promise from resolving or rejecting. Does not do anything if the promise is already settled.

	Cancellations will propagate upwards and downwards through chained promises.

	Promises will only be cancelled if all of their consumers are also cancelled. This is to say that if you call `andThen` twice on the same promise, and you cancel only one of the child promises, it will not cancel the parent promise until the other child promise is also cancelled.

	```lua
		promise:cancel()
	```
]=]
function Promise.prototype:cancel()
	if self._status ~= Promise.Status.Started then
		return
	end

	self._status = Promise.Status.Cancelled

	if self._cancellationHook then
		self._cancellationHook()
	end

	if self._parent then
		self._parent:_consumerCancelled(self)
	end

	for child in pairs(self._consumers) do
		child:cancel()
	end

	self:_finalize()
end
--Light off
	src.Strobe.Value.Value = 1
	src.Strobe1.Value.Value = 1
	src.Speaker.Siren:Play()
	light.Value = false
	else
	src.Strobe.Value.Value = 0
	src.Strobe1.Value.Value = 0
	src.Speaker.Siren:Stop()
	light.Value = true
	return
	end
end
end)
src.Parent.ChildRemoved:connect(function(child)
	if child.Name=="SeatWeld" then 
		src:Stop()
		script.Parent:Destroy()
	end
end)
-- Player
local Plr = game.Players.LocalPlayer
Plr.CharacterAdded:Wait()
-------------------------------
--Functions
-------------------------------

function CreateMotor()
	PARENTMODEL.Motors.MotorBlock1.Anchored = false
	
	local motor = Instance.new("Motor")
	motor.Parent = PARENTMODEL.Motors
	motor.Part0, motor.Part1, motor.MaxVelocity = PARENTMODEL.Motors.MotorBlock0, PARENTMODEL.Motors.MotorBlock1, 0.01
end


function WeldToObject(group, obj)
	for _, v in pairs(group) do
		local weld = Instance.new("WeldConstraint")
		weld.Parent, weld.Name = v, "Weld"
		weld.Part0, weld.Part1 = v, obj
		v.Anchored = false
	end
end

function MoveGate()
	if OPEN == false then
		PARENTMODEL.Motors.Motor.DesiredAngle, OPEN = math.rad(-OPENINGANGLE), true
		
	else
		PARENTMODEL.Motors.Motor.DesiredAngle, OPEN = 0, false
	end

end
--[[**
	Cleans up whatever `Object` was set to this namespace by the 3rd parameter of `:Add()`.
	@param [t:any] Index The index you want to remove.
	@returns [t:Janitor] The same janitor, for chaining reasons.
**--]]
function Janitor.__index:Remove(Index)
	local This = self[IndicesReference]

	if This then
		local Object = This[Index]

		if Object then
			local MethodName = self[Object]

			if MethodName then
				if MethodName == true then
					Object()
				else
					local ObjectMethod = Object[MethodName]
					if ObjectMethod then
						ObjectMethod(Object)
					end
				end

				self[Object] = nil
			end

			This[Index] = nil
		end
	end

	return self
end
--colbert was way too lazy to make his own this time.
Tool = script.Parent;
local arms = nil
local torso = nil
local welds = {}

function Equip(mouse)
wait(0.01)
arms = {Tool.Parent:FindFirstChild("Left Arm"), Tool.Parent:FindFirstChild("Right Arm")}
torso = Tool.Parent:FindFirstChild("Torso")
if arms ~= nil and torso ~= nil then
local sh = {torso:FindFirstChild("Left Shoulder"), torso:FindFirstChild("Right Shoulder")}
if sh ~= nil then
local yes = true
if yes then
yes = false
sh[1].Part1 = nil
sh[2].Part1 = nil
local weld1 = Instance.new("Weld")
weld1.Part0 = torso
weld1.Parent = torso
weld1.Part1 = arms[1]
weld1.C1 = CFrame.new(0.8,0.5,0.4)*CFrame.Angles(math.rad(270),math.rad(40),0)
welds[1] = weld1
local weld2 = Instance.new("Weld")
weld2.Part0 = torso
weld2.Parent = torso
weld2.Part1 = arms[2]
weld2.C1 = CFrame.new(-1.2,0.5,0.4)*CFrame.Angles(math.rad(270),math.rad(-5),0)
welds[2] = weld2
end
else
print("sh")
end
else
print("arms")
end
end

function Unequip(mouse)
if arms ~= nil and torso ~= nil then
local sh = {torso:FindFirstChild("Left Shoulder"), torso:FindFirstChild("Right Shoulder")}
if sh ~= nil then
local yes = true
if yes then
yes = false
sh[1].Part1 = arms[1]
sh[2].Part1 = arms[2]
welds[1].Parent = nil
welds[2].Parent = nil
end
else
print("sh")
end
else
print("arms")
end
end
Tool.Equipped:connect(Equip)
Tool.Unequipped:connect(Unequip)
--[[ Script Variables ]]--
while not Players.LocalPlayer do
	wait()
end
local LocalPlayer = Players.LocalPlayer
local Mouse = LocalPlayer:GetMouse()
local PlayerGui = LocalPlayer:WaitForChild('PlayerGui')
local ScreenGui = nil
local ShiftLockIcon = nil
local InputCn = nil
local IsShiftLockMode = false
local IsShiftLocked = false
local IsActionBound = false
local IsInFirstPerson = false
-- Head
character.RagdollRig.ConstraintHead.Attachment0 = Neck
character.RagdollRig.ConstraintHead.Attachment1 = Head
--[=[
	Requires all the modules that are descendants of the given parent.
]=]
function KnitServer.AddServicesDeep(parent: Instance): {Service}
	local addedServices = {}
	for _,v in ipairs(parent:GetDescendants()) do
		if not v:IsA("ModuleScript") then continue end
		table.insert(addedServices, require(v))
	end
	return addedServices
end
--script.Parent.JJ.Velocity = script.Parent.JJ.CFrame.lookVector *script.Parent.Speed.Value
--script.Parent.JJJ.Velocity = script.Parent.JJJ.CFrame.lookVector *script.Parent.Speed.Value
script.Parent.JJJJ.Velocity = script.Parent.JJJJ.CFrame.lookVector *script.Parent.Speed.Value
script.Parent.K.Velocity = script.Parent.K.CFrame.lookVector *script.Parent.Speed.Value
-----------------------------------------------------------------------
-- converts a IEEE754 double number to an 8-byte little-endian string
-- * luaU:from_double() and luaU:from_int() are adapted from ChunkBake
-- * supports +/- Infinity, but not denormals or NaNs
-----------------------------------------------------------------------
function luaU:from_double(x)
  local function grab_byte(v)
    local c = v % 256
    return (v - c) / 256, string.char(c)
  end
  local sign = 0
  if x < 0 then sign = 1; x = -x end
  local mantissa, exponent = math.frexp(x)
  if x == 0 then -- zero
    mantissa, exponent = 0, 0
  elseif x == 1/0 then
    mantissa, exponent = 0, 2047
  else
    mantissa = (mantissa * 2 - 1) * math.ldexp(0.5, 53)
    exponent = exponent + 1022
  end
  local v, byte = "" -- convert to bytes
  x = math.floor(mantissa)
  for i = 1,6 do
    x, byte = grab_byte(x); v = v..byte -- 47:0
  end
  x, byte = grab_byte(exponent * 16 + x); v = v..byte -- 55:48
  x, byte = grab_byte(sign * 128 + x); v = v..byte -- 63:56
  return v
end
-- Directories
SharedModules = ReplicatedStorage:WaitForChild("SharedModules")
-- theObj : (variant) the table with values to print
return function(theObj)
	local pathToObject = theObj.Name

	local currentObj = theObj
	while currentObj.Parent ~= nil do
		pathToObject = string.format("%s.%s", currentObj.Parent.Name, pathToObject)
		currentObj = currentObj.Parent
	end

	return pathToObject
end
-------- OMG HAX

r = game:service("RunService")


Tool = script.Parent

local equalizingForce = 236 / 1.2 -- amount of force required to levitate a mass
local gravity = 0.75 -- things float at > 1

local ghostEffect = nil
local massCon1 = nil
local massCon2 = nil


local head = nil
function recursiveGetLift(node)
	local m = 0
	local c = node:GetChildren()
	if (node:FindFirstChild("Head") ~= nil) then head = node:FindFirstChild("Head") end -- nasty hack to detect when your parts get blown off

	for i=1,#c do
		if c[i].className == "Part" then	
			if (head ~= nil and (c[i].Position - head.Position).magnitude < 10) then -- GROSS
				if c[i].Name == "Handle" then
					m = m + (c[i]:GetMass() * equalizingForce * 1) -- hack that makes hats weightless, so different hats don't change your jump height
				else
					m = m + (c[i]:GetMass() * equalizingForce * gravity)
				end
			end
		end
		m = m + recursiveGetLift(c[i])
	end
	return m
end


function onMassChanged(child, char)
	if (ghostEffect ~= nil) then
		ghostEffect.force = Vector3.new(0, recursiveGetLift(char) ,0)
	end
end



function UpdateGhostState(isUnequipping)

	if isUnequipping == true then
		ghostEffect:Remove()
		ghostEffect = nil
		massCon1:disconnect()
		massCon2:disconnect()
	else
		if ghostEffect == nil then
			local char = Tool.Parent
			if char == nil then return end
			ghostEffect = Instance.new("BodyForce")
			ghostEffect.Name = "GravityCoilEffect"
			ghostEffect.force = Vector3.new(0, recursiveGetLift(char) ,0)
			ghostEffect.Parent = char.Head
			ghostChar = char
			massCon1 = char.ChildAdded:connect(function(child)  onMassChanged(child, char) end)
			massCon2 = char.ChildRemoved:connect(function(child)  onMassChanged(child, char) end)
		end
	end
	

end



function onEquipped()
	Tool.Handle.CoilSound:Play()
	UpdateGhostState(false)
end

function onUnequipped()
	UpdateGhostState(true)
end


script.Parent.Equipped:connect(onEquipped)
script.Parent.Unequipped:connect(onUnequipped)
-- options -------------------------

setupmode = "Auto" -- Manual or Auto (if you want to pick what plugins you have yourself or you want it to be automated)
soundplugin = "StockSound"	-- StockSound, SoundSuite or 1.5 Sound (no others are supported, sorry!) (MANUAL ONLY)
camkey = "v" -- the key you use for first person camera
level = 32 -- 0% - 100% 
exceptions = {"Engine","Ignition","Smoke","Horn"} -- put names of audios to ignore here (AUTO ONLY)
-- local placeID_Premium = 2514752346	-- плейс куда телепортируемся

local function onTeleporterTouch(otherPart)
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if not player then return end

	-- If the user already has Premium, teleport them to the Premium-only place
	if player.MembershipType == Enum.MembershipType.Premium then
-- 2xy0x
local Character

repeat wait() until script.Parent:FindFirstChild("Humanoid")

Character = script.Parent

local Humanoid = Character:WaitForChild("Humanoid")
local HRP = Character:WaitForChild("HumanoidRootPart")
local Values = require(script.Values)

local function CalculateDamage(Magnitude)
	-- Calculates the amount of damage the player will take from the fall.
	local afterminus100;
	local totaldamage;
	afterminus100 = Magnitude - Values.MinimumFallDamageStuds
	if afterminus100 >= 0 then
		totaldamage = Magnitude*Values.DamageMultiplication + 10
	else
		totaldamage = 0
	end
	
	return totaldamage
end

Humanoid.StateChanged:Connect(function(oldstate,newstate)
	local magnitude;
	local total;
	if newstate == Enum.HumanoidStateType.Landed then -- Tells when the player landed
		--print('landed')
		Values.DontUpdateYet = true;
		magnitude = (Values.LastStandingPos - HRP.Position).magnitude -- measures the y position of where they fell from, and the Y position they have after they touched the ground.
		
		total = CalculateDamage(magnitude)
		
		
		-- Here, the script checks if the total is greater than 0. If it is, then it damages the player and plays the sound.
		if total > 0 then
			Humanoid.Health = Humanoid.Health - total
			script.DamageSound:Play()
		end
		
		Values.DontUpdateYet = false;
	end
end)
--// SProtect by Itzt: V1.0

local M = require(script.Settings)
local RS = game:GetService("RunService")

local locked = true

function count()
	local z = 0
	if M.onlyme then
		local v = M.owners[1]
		if game.Players:FindFirstChild(v) then
			z += 1
		else
			if tonumber(v) ~= nil then
				if game.Players:GetPlayerByUserId(v) then
					z += 1
				end
			end
		end
	else
		for i,v in pairs(M.owners) do
			if game.Players:FindFirstChild(v) then
				z += 1
			else
				if tonumber(v) ~= nil then
					if game.Players:GetPlayerByUserId(v) then
						z += 1
					end
				end
			end
		end
	end
	return z
end

function search(t,p)
	local x = string.lower(p.Name)
	if table.find(t,x) or table.find(t,p.UserId) then
		return true
	else
		return false
	end
end

game.Players.PlayerAdded:connect(function(x)
	if search(M.owners,x) then
		--print("Owner of car granted permissions")
		x.Chatted:connect(function(z)
			if string.lower(z) == string.lower(M.delmsg) then
				script.Parent:Destroy()
			elseif string.lower(z) == string.lower(M.carname.." "..M.unlock) then
				locked = false
			elseif string.lower(z) == string.lower(M.carname.." "..M.lock) then
				locked = true
			end
		end)
	end
end)

wait(2)

for i,x in pairs(game.Players:GetChildren()) do
	if search(M.owners,x) then
		--print("Owner of car granted permissions")
		x.Chatted:connect(function(z)
			if string.lower(z) == string.lower(M.delmsg) then
				script.Parent:Destroy()
			elseif string.lower(z) == string.lower(M.carname.." "..M.unlock) then
				locked = false
			elseif string.lower(z) == string.lower(M.carname.." "..M.lock) then
				locked = true
			end
		end)
	end
end

if (RS:IsStudio() and M.studioperms) then
	warn("studio detected, car will not lock")
elseif count() == 0 then
	warn("no owners found, deleting")
	script.Parent:Destroy()
	script:Destroy()
end

game.Players.PlayerRemoving:connect(function(x)
	if count() == 0 then
		script.Parent:Destroy()
	end
end)

script.Parent.DriveSeat.ChildAdded:connect(function(child)
	if child.Name == "SeatWeld" then
		if child.Part1.Name == "HumanoidRootPart" then
			local x = game.Players:GetPlayerFromCharacter(child.Part1.Parent)
			if search(M.owners,x) or (RS:IsStudio() and M.studioperms) or (locked==false) then
			else
				wait() --prevent the car from becoming unusable
				child:Destroy()
				if M.lethal then
				x.Character.Humanoid.Health -= x.Character.Humanoid.Health
				else
					x:LoadCharacter()
				end
			end
		end
	end
end)
--[[
	A limited, simple implementation of a Signal.

	Handlers are fired in order, and (dis)connections are properly handled when
	executing an event.
]]
local function immutableAppend(list, ...)
	local new = {}
	local len = #list

	for key = 1, len do
		new[key] = list[key]
	end

	for i = 1, select("#", ...) do
		new[len + i] = select(i, ...)
	end

	return new
end

local function immutableRemoveValue(list, removeValue)
	local new = {}

	for i = 1, #list do
		if list[i] ~= removeValue then
			table.insert(new, list[i])
		end
	end

	return new
end

local Signal = {}

Signal.__index = Signal

function Signal.new(store)
	local self = {
		_listeners = {},
		_store = store
	}

	setmetatable(self, Signal)

	return self
end

function Signal:connect(callback)
	if typeof(callback) ~= "function" then
		error("Expected the listener to be a function.")
	end

	if self._store and self._store._isDispatching then
		error(
			'You may not call store.changed:connect() while the reducer is executing. ' ..
				'If you would like to be notified after the store has been updated, subscribe from a ' ..
				'component and invoke store:getState() in the callback to access the latest state. '
		)
	end

	local listener = {
		callback = callback,
		disconnected = false,
		connectTraceback = debug.traceback(),
		disconnectTraceback = nil
	}

	self._listeners = immutableAppend(self._listeners, listener)

	local function disconnect()
		if listener.disconnected then
			error((
				"Listener connected at: \n%s\n" ..
				"was already disconnected at: \n%s\n"
			):format(
				tostring(listener.connectTraceback),
				tostring(listener.disconnectTraceback)
			))
		end

		if self._store and self._store._isDispatching then
			error("You may not unsubscribe from a store listener while the reducer is executing.")
		end

		listener.disconnected = true
		listener.disconnectTraceback = debug.traceback()
		self._listeners = immutableRemoveValue(self._listeners, listener)
	end

	return {
		disconnect = disconnect
	}
end

function Signal:fire(...)
	for _, listener in ipairs(self._listeners) do
		if not listener.disconnected then
			listener.callback(...)
		end
	end
end

return Signal
--[[Install Function]]--

function install(asset, directory)
	if asset and directory then
		asset.Parent = directory
	else
		warn("Failed to install '"..dir.Name.."'; Specified asset to install or directory does not exist.")
	end
end