From 3744c68cabcab0de2bfb7a3ea6b4b16404b64a8f Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Tue, 11 Apr 2017 06:56:10 -0700 Subject: [PATCH 1/3] Add part index to Selection and BoundingBox modules, deselect before deleting This change makes the SelectionModule maintain and use a binary index for keeping track of selected items, making it significantly faster to check whether parts are selected or not. BoundingBoxModule is also updated to maintain and use a binary index for tracking static parts. Additionally, deletion operations now remove deleting parts from the selection beforehand to prevent cascades of automatic individual deselections as parts are deleted. These changes all optimize actions involving selected parts, and make building dramatically smoother. Signed-off-by: Robert Chiquini --- BoundingBoxModule.lua | 212 ++++++++++++++++++++++-------------------- Core.lua | 13 ++- SelectionModule.lua | 141 ++++++++++++++++------------ TargetingModule.lua | 24 +++-- tools/Lighting.lua | 8 +- tools/Move.lua | 17 ++-- tools/Paint.lua | 2 +- tools/Resize.lua | 2 +- tools/Surface.lua | 10 +- tools/Texture.lua | 2 +- 10 files changed, 236 insertions(+), 195 deletions(-) diff --git a/BoundingBoxModule.lua b/BoundingBoxModule.lua index 4d8f138..966525d 100644 --- a/BoundingBoxModule.lua +++ b/BoundingBoxModule.lua @@ -1,8 +1,17 @@ -- Libraries -Core = require(script.Parent.Core); -Support = Core.Support; +local Core = require(script.Parent.Core); +local Support = Core.Support; -BoundingBoxModule = {}; +-- Initialize module +local BoundingBoxModule = {}; + +-- Initialize internal module state +local StaticParts = {}; +local StaticPartsIndex = {}; +local StaticPartMonitors = {}; +local RecalculateStaticExtents = true; +local AggregatingStaticParts = false; +local StaticPartAggregators = {}; function BoundingBoxModule.StartBoundingBox(HandleAttachmentCallback) -- Creates and starts a selection bounding box @@ -116,109 +125,104 @@ function BoundingBoxModule.ClearBoundingBox() end; -StaticParts = {}; -StaticPartMonitors = {}; -RecalculateStaticExtents = true; -AggregatingStaticParts = false; -StaticPartAggregators = {}; +function AddStaticParts(Parts) + -- Adds the static parts to the list for state tracking -function AddStaticPart(Part) - -- Adds the static part to the list for state tracking + -- Add each given part + for _, Part in pairs(Parts) do - -- Make sure the part isn't already in the list - if Support.IsInTable(StaticParts, Part) then - return; - end; + -- Ensure part isn't already indexed, and verify it is static + if not StaticPartsIndex[Part] and Part.Anchored then + + -- Add part to static index + StaticPartsIndex[Part] = true; - -- Add the part to the list - table.insert(StaticParts, Part); + -- Start monitoring part for changes + StaticPartMonitors[Part] = Part.Changed:connect(function (Property) - -- Starts monitoring the part - StaticPartMonitors[Part] = Part.Changed:connect(function (Property) + -- Trigger static extent recalculations on position or size changes + if Property == 'CFrame' or Property == 'Size' then + RecalculateStaticExtents = true; - if Property == 'CFrame' or Property == 'Size' then - RecalculateStaticExtents = true; + -- Remove part from static index if it becomes mobile + elseif Property == 'Anchored' and not Part.Anchored then + RemoveStaticParts { Part }; + end; + + end); - elseif Property == 'Anchored' and not Part.Anchored then - RemoveStaticPart(Part); end; - end); + end; + + -- Update the static parts list + StaticParts = Support.Keys(StaticPartsIndex); - -- Recalculate the extents including this new part + -- Recalculate static extents to include added parts RecalculateStaticExtents = true; end; -function RemoveStaticPart(Part) - -- Removes the part from the static part tracking list +function RemoveStaticParts(Parts) + -- Removes the given parts from the static parts index - -- Get the part's key in the list - local PartKey = Support.FindTableOccurrence(StaticParts, Part); + -- Remove each given part + for _, Part in pairs(Parts) do - -- Remove it from the list - if PartKey then - StaticParts[PartKey] = nil; - end; + -- Remove part from static parts index + StaticPartsIndex[Part] = nil; + + -- Clean up the part's change monitors + if StaticPartMonitors[Part] then + StaticPartMonitors[Part]:disconnect(); + StaticPartMonitors[Part] = nil; + end; - -- Clear its state monitors - if StaticPartMonitors[Part] then - StaticPartMonitors[Part]:disconnect(); - StaticPartMonitors[Part] = nil; end; + -- Update the static parts list + StaticParts = Support.Keys(StaticPartsIndex); + + -- Recalculate static extents to exclude removed parts + RecalculateStaticExtents = true; + end; function StartAggregatingStaticParts() -- Begins to look for and identify static parts - -- Add current static parts - for _, Part in pairs(Core.Selection.Items) do - if Part.Anchored then - AddStaticPart(Part); - end; + -- Add current qualifying parts to static parts index + AddStaticParts(Core.Selection.Items); - -- Watch for parts that become anchored + -- Watch for parts that become static + for _, Part in pairs(Core.Selection.Items) do table.insert(StaticPartAggregators, Part.Changed:connect(function (Property) if Property == 'Anchored' and Part.Anchored then - AddStaticPart(Part); + AddStaticParts { Part }; end; end)); end; - -- Add newly selected anchored parts + -- Watch newly selected parts table.insert(StaticPartAggregators, Core.Selection.ItemsAdded:connect(function (Parts) - -- Go through each selected part - for _, Part in pairs(Parts) do + -- Add qualifying parts to static parts index + AddStaticParts(Parts); - -- Only add anchored, static parts - if Part.Anchored then - AddStaticPart(Part); - end; - - -- Watch for parts that become anchored + -- Watch for parts that become anchored + for _, Part in pairs(Parts) do table.insert(StaticPartAggregators, Part.Changed:connect(function (Property) if Property == 'Anchored' and Part.Anchored then - AddStaticPart(Part); + AddStaticParts { Part }; end; end)); - end; end)); - -- Remove deselected parts + -- Remove deselected parts from static parts index table.insert(StaticPartAggregators, Core.Selection.ItemsRemoved:connect(function (Parts) - - -- Remove the items - for _, Part in pairs(Parts) do - RemoveStaticPart(Part); - end; - - -- Recalculate static extents without the removed parts - RecalculateStaticExtents = true; - + RemoveStaticParts(Parts); end)); end; @@ -240,6 +244,7 @@ function StopAggregatingStaticParts() -- Clear all static part information StaticParts = {}; + StaticPartsIndex = {}; BoundingBoxModule.StaticExtents = nil; end; @@ -250,6 +255,7 @@ local table_insert = table.insert; local CFrame_toWorldSpace = CFrame.new().toWorldSpace; local math_min = math.min; local math_max = math.max; +local unpack = unpack; function BoundingBoxModule.CalculateExtents(Items, StaticExtents, ExtentsOnly) -- Returns the size and position of a box covering all items in `Items` @@ -279,45 +285,45 @@ function BoundingBoxModule.CalculateExtents(Items, StaticExtents, ExtentsOnly) local Corner; local XPoints, YPoints, ZPoints = {}, {}, {}; - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(SizeX, SizeY, SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(-SizeX, SizeY, SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(SizeX, -SizeY, SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(SizeX, SizeY, -SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(-SizeX, SizeY, -SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(-SizeX, -SizeY, SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(SizeX, -SizeY, -SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); - - Corner = CFrame_toWorldSpace(PartCFrame, CFrame_new(-SizeX, -SizeY, -SizeZ)); - table_insert(XPoints, Corner['x']); - table_insert(YPoints, Corner['y']); - table_insert(ZPoints, Corner['z']); + Corner = PartCFrame * CFrame_new(SizeX, SizeY, SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(-SizeX, SizeY, SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(SizeX, -SizeY, SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(SizeX, SizeY, -SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(-SizeX, SizeY, -SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(-SizeX, -SizeY, SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(SizeX, -SizeY, -SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); + + Corner = PartCFrame * CFrame_new(-SizeX, -SizeY, -SizeZ); + table_insert(XPoints, Corner.x); + table_insert(YPoints, Corner.y); + table_insert(ZPoints, Corner.z); -- Reduce gathered points to min/max extents MinX = math_min(MinX, unpack(XPoints)); diff --git a/Core.lua b/Core.lua index 6803be3..4e780af 100644 --- a/Core.lua +++ b/Core.lua @@ -331,6 +331,9 @@ function CloneSelection() Unapply = function (HistoryRecord) -- Reverts this change + -- Deselect the clones + Selection.Remove(HistoryRecord.Clones, false); + -- Remove the clones SyncAPI:Invoke('Remove', HistoryRecord.Clones); @@ -400,6 +403,9 @@ function DeleteSelection() Apply = function (HistoryRecord) -- Applies this change + -- Deselect the parts + Selection.Remove(HistoryRecord.Parts, false); + -- Remove the parts SyncAPI:Invoke('Remove', HistoryRecord.Parts); @@ -407,8 +413,11 @@ function DeleteSelection() }; + -- Deselect parts before deleting + Selection.Remove(HistoryRecord.Parts, false); + -- Perform the removal - SyncAPI:Invoke('Remove', Selection.Items); + SyncAPI:Invoke('Remove', HistoryRecord.Parts); -- Register the history record History.Add(HistoryRecord); @@ -458,7 +467,7 @@ function PrismSelect() for _, Part in pairs(Selection.Items) do local TouchingParts = Part:GetTouchingParts(); for _, TouchingPart in pairs(TouchingParts) do - if not Selection.Find(TouchingPart) then + if not Selection.IsSelected(TouchingPart) then Parts[TouchingPart] = true; end; end; diff --git a/SelectionModule.lua b/SelectionModule.lua index ed5596c..6639e64 100644 --- a/SelectionModule.lua +++ b/SelectionModule.lua @@ -6,6 +6,7 @@ local Support = require(script.Parent.SupportLibrary); -- Core selection system Selection = {}; Selection.Items = {}; +Selection.ItemIndex = {}; Selection.Outlines = {}; Selection.Color = BrickColor.new 'Cyan'; Selection.Multiselecting = false; @@ -20,51 +21,38 @@ Selection.Changed = RbxUtility.CreateSignal(); -- Item existence listeners local Listeners = {}; -function Selection.Find(Needle) - -- Return `Needle`'s index in the selection, or `nil` if not found +function Selection.IsSelected(Item) + -- Returns whether `Item` is selected or not - -- Go through each selected item - for Index, Item in pairs(Selection.Items) do + -- Check and return item presence in index + return Selection.ItemIndex[Item]; - -- Return the index if a match is found - if Item == Needle then - return Index; - end; - - end; - - -- Return `nil` if no match is found - return nil; end; function Selection.Add(Items, RegisterHistory) -- Adds the given items to the selection - local SelectableItems = {}; + -- Get core API + local Core = GetCore(); -- Go through and validate each given item + local SelectableItems = {}; for _, Item in pairs(Items) do -- Make sure each item is valid and not already selected - if GetCore().IsSelectable(Item) and not Selection.Find(Item) then - - -- Queue each part to be added into the selection + if Core.IsSelectable(Item) and not Selection.ItemIndex[Item] then table.insert(SelectableItems, Item); - end; end; - local OldSelection = Support.CloneTable(Selection.Items); + local OldSelection = Selection.Items; -- Go through the valid new selection items for _, Item in pairs(SelectableItems) do -- Add each valid item to the selection - table.insert(Selection.Items, Item); - - -- Add a selection box - CreateSelectionBox(Item); + Selection.ItemIndex[Item] = true; -- Deselect items that are destroyed Listeners[Item] = Item.AncestryChanged:connect(function (Object, Parent) @@ -75,11 +63,17 @@ function Selection.Add(Items, RegisterHistory) end; + -- Update selected item list + Selection.Items = Support.Keys(Selection.ItemIndex); + -- Create a history record for this selection change, if requested if RegisterHistory and #SelectableItems > 0 then TrackSelectionChange(OldSelection); end; + -- Create selection boxes for the selection + CreateSelectionBoxes(SelectableItems); + -- Fire relevant events Selection.ItemsAdded:fire(SelectableItems); Selection.Changed:fire(); @@ -89,28 +83,24 @@ end; function Selection.Remove(Items, RegisterHistory) -- Removes the given items from the selection - local DeselectableItems = {}; - -- Go through and validate each given item + local DeselectableItems = {}; for _, Item in pairs(Items) do -- Make sure each item is actually selected - if Selection.Find(Item) then + if Selection.IsSelected(Item) then table.insert(DeselectableItems, Item); end; end; - local OldSelection = Support.CloneTable(Selection.Items); + local OldSelection = Selection.Items; -- Go through the valid deselectable items for _, Item in pairs(DeselectableItems) do - -- Clear item's selection box - RemoveSelectionBox(Item); - -- Remove item from selection - table.remove(Selection.Items, Selection.Find(Item)); + Selection.ItemIndex[Item] = nil; -- Stop tracking item's parent Listeners[Item]:disconnect(); @@ -118,6 +108,12 @@ function Selection.Remove(Items, RegisterHistory) end; + -- Remove selection boxes from deselected items + RemoveSelectionBoxes(DeselectableItems); + + -- Update selected item list + Selection.Items = Support.Keys(Selection.ItemIndex); + -- Create a history record for this selection change, if requested if RegisterHistory and #DeselectableItems > 0 then TrackSelectionChange(OldSelection); @@ -155,7 +151,7 @@ function Selection.SetFocus(Item) -- Selects `Item` as the focused selection item -- Make sure the item is selected or is `nil` - if not Selection.Find(Item) and Item ~= nil then + if not Selection.IsSelected(Item) and Item ~= nil then return; end; @@ -189,47 +185,72 @@ function GetCore() return require(script.Parent.Core); end; -function CreateSelectionBox(Item) - -- Creates a SelectionBox for the given item +function CreateSelectionBoxes(Items) + -- Creates a SelectionBox for each given item + + -- Get the core API + local Core = GetCore(); -- Only create selection boxes if in tool mode - if GetCore().Mode ~= 'Tool' then + if Core.Mode ~= 'Tool' then return; end; - -- Avoid duplicate selection boxes - if Selection.Outlines[Item] then - return; - end; + -- Track new selection boxes + local SelectionBoxes = {}; + + -- Create an outline for each part + for _, Item in pairs(Items) do + + -- Avoid duplicate selection boxes + if not Selection.Outlines[Item] then + + -- Create the selection box + local SelectionBox = Instance.new 'SelectionBox'; + SelectionBox.Name = 'BTSelectionBox'; + SelectionBox.Color = Selection.Color; + SelectionBox.Adornee = Item; + SelectionBox.LineThickness = 0.025; + SelectionBox.Transparency = 0.5; - -- Create the selection box - local SelectionBox = RbxUtility.Create 'SelectionBox' { - Name = 'BTSelectionBox'; - Color = Selection.Color; - Adornee = Item; - LineThickness = 0.025; - Transparency = 0.5; - }; + -- Register the outline + Selection.Outlines[Item] = SelectionBox; + table.insert(SelectionBoxes, SelectionBox); - -- Register the selection box - SelectionBox.Parent = GetCore().UIContainer; - Selection.Outlines[Item] = SelectionBox; + end; + + end; + + -- Parent the selection boxes + for _, SelectionBox in pairs(SelectionBoxes) do + SelectionBox.Parent = Core.UIContainer; + end; end; -function RemoveSelectionBox(Item) +function RemoveSelectionBoxes(Items) -- Removes the given item's selection box - -- Get the item's selection box - local SelectionBox = Selection.Outlines[Item]; - - -- Remove the selection box if found - if SelectionBox then - SelectionBox:Destroy(); + -- Only proceed if in tool mode + if GetCore().Mode ~= 'Tool' then + return; end; - -- Deregister the selection box - Selection.Outlines[Item] = nil; + -- Remove each item's outline + for _, Item in pairs(Items) do + + -- Get the item's selection box + local SelectionBox = Selection.Outlines[Item]; + + -- Remove the selection box if found + if SelectionBox then + SelectionBox:Destroy(); + end; + + -- Deregister the selection box + Selection.Outlines[Item] = nil; + + end; end; @@ -332,7 +353,7 @@ function TrackSelectionChange(OldSelection) History.Add({ Before = OldSelection; - After = Support.CloneTable(Selection.Items); + After = Selection.Items; Unapply = function (HistoryRecord) -- Reverts this change diff --git a/TargetingModule.lua b/TargetingModule.lua index ef0e8ec..f9500e1 100644 --- a/TargetingModule.lua +++ b/TargetingModule.lua @@ -10,23 +10,27 @@ TargetingModule.TargetChanged = RbxUtility.CreateSignal(); function TargetingModule.EnableTargeting() -- Begin targeting parts from the mouse + -- Get core API + local Core = GetCore(); + + -- Get current mouse Mouse = GetCore().Mouse; -- Listen for target changes - GetCore().Connections.Targeting = Mouse.Move:connect(TargetingModule.UpdateTarget); + Core.Connections.Targeting = Mouse.Move:connect(TargetingModule.UpdateTarget); -- Listen for target clicks - GetCore().Connections.Selecting = Mouse.Button1Up:connect(TargetingModule.SelectTarget); + Core.Connections.Selecting = Mouse.Button1Up:connect(TargetingModule.SelectTarget); -- Listen for 2D selection - GetCore().Connections.RectSelectionStarted = Mouse.Button1Down:connect(TargetingModule.StartRectangleSelecting); - GetCore().Connections.RectSelectionFinished = Support.AddUserInputListener('Ended', 'MouseButton1', true, TargetingModule.FinishRectangleSelecting); + Core.Connections.RectSelectionStarted = Mouse.Button1Down:connect(TargetingModule.StartRectangleSelecting); + Core.Connections.RectSelectionFinished = Support.AddUserInputListener('Ended', 'MouseButton1', true, TargetingModule.FinishRectangleSelecting); -- Hide target box when tool is unequipped - GetCore().Connections.HideTargetBoxOnDisable = GetCore().Disabling:connect(TargetingModule.HighlightTarget); + Core.Connections.HideTargetBoxOnDisable = Core.Disabling:connect(TargetingModule.HighlightTarget); -- Cancel any ongoing selection when tool is unequipped - GetCore().Connections.CancelSelectionOnDisable = GetCore().Disabling:connect(TargetingModule.CancelRectangleSelecting); + Core.Connections.CancelSelectionOnDisable = Core.Disabling:connect(TargetingModule.CancelRectangleSelecting); end; @@ -73,7 +77,7 @@ function TargetingModule.SelectTarget() end; -- Focus on clicked, selected item - if not Selection.Multiselecting and Selection.Find(Target) then + if not Selection.Multiselecting and Selection.IsSelected(Target) then Selection.SetFocus(Target); return; end; @@ -85,7 +89,7 @@ function TargetingModule.SelectTarget() end; -- Unselect clicked, selected item if multiselection is enabled - if Selection.Multiselecting and Selection.Find(Target) then + if Selection.Multiselecting and Selection.IsSelected(Target) then Selection.Remove({ Target }, true); return; end; @@ -240,9 +244,9 @@ function TargetingModule.FinishRectangleSelecting() end; TargetingModule.TargetChanged:connect(function (Target) - + -- Hide target box if no/unselectable target - if not Target or not GetCore().IsSelectable(Target) or GetCore().Selection.Find(Target) then + if not Target or not GetCore().IsSelectable(Target) or GetCore().Selection.IsSelected(Target) then TargetingModule.HighlightTarget(nil); -- Show target outline if target is selectable diff --git a/tools/Lighting.lua b/tools/Lighting.lua index 393012b..1f6c62a 100644 --- a/tools/Lighting.lua +++ b/tools/Lighting.lua @@ -90,7 +90,7 @@ function EnableSurfaceClickSelection(LightType) -- Add the new click connection Connections.SurfaceClickSelection = UserInputService.InputEnded:connect(function (Input, GameProcessedEvent) - if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.Find(Core.Mouse.Target) then + if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.IsSelected(Core.Mouse.Target) then SetSurface(LightType, Core.Mouse.TargetSurface); end; end); @@ -155,7 +155,7 @@ function EnableLightSettingsUI(LightSettingsUI) -- Enable light type-specific features if LightType == 'SpotLight' or LightType == 'SurfaceLight' then - + -- Create a surface selection dropdown Surfaces = { 'Top', 'Bottom', 'Front', 'Back', 'Left', 'Right' }; local SurfaceDropdown = Core.Cheer(Options.SideOption.Dropdown).Start(Surfaces, '', function (Surface) @@ -292,7 +292,7 @@ function CloseLightOptions(Exception) ), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.5, true ); - + -- Make sure to not resize the exempt light type UI if not Exception or Exception and LightType ~= Exception then @@ -415,7 +415,7 @@ function UpdateUI() -- Update the surface dropdown input local Face = Support.IdentifyCommonProperty(Lights, 'Face'); SideDropdown.SetOption(Face and Face.Name or '*'); - + end; -- Update special color input diff --git a/tools/Move.lua b/tools/Move.lua index bfc7613..60044de 100644 --- a/tools/Move.lua +++ b/tools/Move.lua @@ -183,7 +183,7 @@ function UpdateUI() local CommonY = Support.IdentifyCommonItem(YVariations); local CommonZ = Support.IdentifyCommonItem(ZVariations); - -- Shortcuts to indicators + -- Shortcuts to indicators local XIndicator = MoveTool.UI.Info.Center.X.TextBox; local YIndicator = MoveTool.UI.Info.Center.Y.TextBox; local ZIndicator = MoveTool.UI.Info.Center.Z.TextBox; @@ -244,7 +244,7 @@ local AxisMultipliers = { function AttachHandles(Part, Autofocus) -- Creates and attaches handles to `Part`, and optionally automatically attaches to the focused part - + -- Enable autofocus if requested and not already on if Autofocus and not Connections.AutofocusHandle then Connections.AutofocusHandle = Selection.FocusChanged:connect(function () @@ -638,7 +638,7 @@ function TrackChange() Parts = Support.CloneTable(Selection.Items); BeforeCFrame = {}; AfterCFrame = {}; - + Unapply = function (Record) -- Reverts this change @@ -723,7 +723,7 @@ function EnableDragging() end; -- Select the target if it's not selected - if not Selection.Find(Core.Mouse.Target) then + if not Selection.IsSelected(Core.Mouse.Target) then Selection.Replace({ Core.Mouse.Target }, true); end; @@ -1036,13 +1036,14 @@ end; function TranslatePartsRelativeToPart(BasePart, InitialState, Parts) -- Moves the given parts to BasePart's current position, with their original offset from it - for _, Part in pairs(Parts) do + -- Get focused part's position for offsetting + local RelativeTo = InitialState[BasePart].CFrame:inverse(); - -- Calculate the focused part's position - local RelativeTo = InitialState[BasePart].CFrame; + -- Calculate offset and move each part + for _, Part in pairs(Parts) do -- Calculate how far apart we should be from the focused part - local Offset = RelativeTo:toObjectSpace(InitialState[Part].CFrame); + local Offset = RelativeTo * InitialState[Part].CFrame; -- Move relative to the focused part by this part's offset from it Part.CFrame = BasePart.CFrame * Offset; diff --git a/tools/Paint.lua b/tools/Paint.lua index a032d56..5778b4c 100644 --- a/tools/Paint.lua +++ b/tools/Paint.lua @@ -254,7 +254,7 @@ function EnableClickPainting() -- Watch out for clicks on selected parts Connections.ClickPainting = Selection.FocusChanged:connect(function (Part) - if Selection.Find(Core.Mouse.Target) then + if Selection.IsSelected(Core.Mouse.Target) then -- Paint the selected parts PaintParts(); diff --git a/tools/Resize.lua b/tools/Resize.lua index e29bd77..c6ff1c5 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -756,7 +756,7 @@ function StartSnapping() -- Only enable corner snapping SnapTracking.TrackEdgeMidpoints = false; SnapTracking.TrackFaceCentroids = false; - SnapTracking.TargetFilter = Selection.Find; + SnapTracking.TargetFilter = Selection.IsSelected; -- Trigger the PointSnapped event when a new point is snapped SnapTracking.StartTracking(function (NewPoint) diff --git a/tools/Surface.lua b/tools/Surface.lua index b946cf0..34752d9 100644 --- a/tools/Surface.lua +++ b/tools/Surface.lua @@ -173,7 +173,7 @@ function UpdateUI() end; end; - + -- Identify common surface type in selection local CommonSurfaceType = Support.IdentifyCommonItem(SurfaceTypeVariations); @@ -215,7 +215,7 @@ function SetSurfaceType(SurfaceType) Part.BackSurface = SurfaceType; Part.LeftSurface = SurfaceType; Part.RightSurface = SurfaceType; - + -- Change specific selected surface else Part[SurfaceTool.Surface .. 'Surface'] = SurfaceType; @@ -233,7 +233,7 @@ function EnableSurfaceSelection() -- Watch out for clicks on selected parts Connections.SurfaceSelection = Selection.FocusChanged:connect(function (Part) - if Selection.Find(Core.Mouse.Target) then + if Selection.IsSelected(Core.Mouse.Target) then -- Set the surface option to the target surface SetSurface(Core.Mouse.TargetSurface.Name); @@ -302,7 +302,7 @@ function TrackChange() Surfaces.Back = Part.BackSurface; Surfaces.Left = Part.LeftSurface; Surfaces.Right = Part.RightSurface; - + -- Record specific selected surface else Surfaces[SurfaceTool.Surface] = Part[SurfaceTool.Surface .. 'Surface']; @@ -336,7 +336,7 @@ function RegisterChange() Surfaces.Back = Part.BackSurface; Surfaces.Left = Part.LeftSurface; Surfaces.Right = Part.RightSurface; - + -- Record specific selected surface else Surfaces[SurfaceTool.Surface] = Part[SurfaceTool.Surface .. 'Surface']; diff --git a/tools/Texture.lua b/tools/Texture.lua index 99d03f9..06227a2 100644 --- a/tools/Texture.lua +++ b/tools/Texture.lua @@ -145,7 +145,7 @@ function EnableSurfaceClickSelection() -- Add the new click connection Connections.SurfaceClickSelection = UserInputService.InputEnded:connect(function (Input, GameProcessedEvent) - if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.Find(Core.Mouse.Target) then + if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.IsSelected(Core.Mouse.Target) then SetFace(Core.Mouse.TargetSurface); end; end); From 451570ede934ebbdda135426a62bab74f1290108 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Tue, 11 Apr 2017 07:51:01 -0700 Subject: [PATCH 2/3] Catch handle releases at all times in Move, Resize, & Rotate tools This change moves logic for finalizing mouse-involving operations from outside of temporary connections, in order to prevent issues where parts are left in a mid-operation state because the tool was switched or disabled too early. Signed-off-by: Robert Chiquini --- tools/Move.lua | 93 +++++++++++++++++++++++----------------------- tools/Resize.lua | 97 +++++++++++++++++++++++++----------------------- tools/Rotate.lua | 62 +++++++++++++++---------------- 3 files changed, 125 insertions(+), 127 deletions(-) diff --git a/tools/Move.lua b/tools/Move.lua index 60044de..a7e2275 100644 --- a/tools/Move.lua +++ b/tools/Move.lua @@ -65,6 +65,19 @@ function ClearConnections() end; +function ClearConnection(ConnectionKey) + -- Clears the given specific connection + + local Connection = Connections[ConnectionKey]; + + -- Disconnect the connection if it exists + if Connections[ConnectionKey] then + Connection:disconnect(); + Connections[ConnectionKey] = nil; + end; + +end; + function ShowUI() -- Creates and reveals the UI @@ -253,8 +266,7 @@ function AttachHandles(Part, Autofocus) -- Disable autofocus if not requested and on elseif not Autofocus and Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; -- Just attach and show the handles if they already exist @@ -277,7 +289,6 @@ function AttachHandles(Part, Autofocus) -- Prepare for moving parts when the handle is clicked ------------------------------------------------------ - local InitialState = {}; local AreaPermissions; Handles.MouseButton1Down:connect(function () @@ -299,36 +310,6 @@ function AttachHandles(Part, Autofocus) AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); end; - ------------------------------------------------------ - -- Finalize changes to parts when the handle is let go - ------------------------------------------------------ - - Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - - -- Make sure this was button 1 being released, and dragging is ongoing - if not HandleDragging or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then - return; - end; - - -- Disable dragging - HandleDragging = false; - - -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; - - -- Make joints, restore original anchor and collision states - for _, Part in pairs(Selection.Items) do - Part:MakeJoints(); - Part.CanCollide = InitialState[Part].CanCollide; - Part.Anchored = InitialState[Part].Anchored; - end; - - -- Register the change - RegisterChange(); - - end); - end); ------------------------------------------ @@ -363,6 +344,32 @@ function AttachHandles(Part, Autofocus) end; +-- Finalize changes to parts when the handle is let go +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Ensure handle dragging is ongoing + if not HandleDragging then + return; + end; + + -- Disable dragging + HandleDragging = false; + + -- Clear this connection to prevent it from firing again + ClearConnection 'HandleRelease'; + + -- Make joints, restore original anchor and collision states + for _, Part in pairs(Selection.Items) do + Part:MakeJoints(); + Part.CanCollide = InitialState[Part].CanCollide; + Part.Anchored = InitialState[Part].Anchored; + end; + + -- Register the change + RegisterChange(); + +end); + function HideHandles() -- Hides the resizing handles @@ -375,11 +382,8 @@ function HideHandles() Handles.Visible = false; Handles.Parent = nil; - -- Disable handle autofocus if enabled - if Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; - end; + -- Disable handle autofocus + ClearConnection 'AutofocusHandle'; end; @@ -741,7 +745,7 @@ function EnableDragging() SetUpDragging(DragStartTarget, SnapTracking.Enabled and SnappedPoint or nil); -- Disable watching for potential dragging - Connections.WatchForDrag:disconnect(); + ClearConnection 'WatchForDrag'; end; @@ -757,10 +761,7 @@ function EnableDragging() DragStartTarget = nil; -- Disconnect dragging-start listeners - if Connections.WatchForDrag then - Connections.WatchForDrag:disconnect(); - Connections.WatchForDrag = nil; - end; + ClearConnection 'WatchForDrag'; end); @@ -1064,13 +1065,11 @@ function FinishDragging() Dragging = false; -- Stop the dragging action - Connections.Drag:disconnect() - Connections.Drag = nil; + ClearConnection 'Drag'; -- Stop, clean up snapping point tracking SnapTracking.StopTracking(); - Connections.DragSnapping:disconnect(); - Connections.DragSnapping = nil; + ClearConnection 'DragSnapping'; -- Restore the original state of each part for _, Part in pairs(Selection.Items) do diff --git a/tools/Resize.lua b/tools/Resize.lua index c6ff1c5..84afbb8 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -42,6 +42,7 @@ function ResizeTool.Unequip() HideHandles(); ClearConnections(); SnapTracking.StopTracking(); + FinishSnapping(); end; @@ -264,7 +265,6 @@ function ShowHandles() -- Prepare for resizing parts when the handle is clicked -------------------------------------------------------- - local InitialState = {}; local AreaPermissions; Handles.MouseButton1Down:connect(function () @@ -286,38 +286,6 @@ function ShowHandles() AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); end; - ------------------------------------------------------ - -- Finalize changes to parts when the handle is let go - ------------------------------------------------------ - - Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - - -- Make sure this was button 1 being released, and handle resizing is ongoing - if not HandleResizing or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then - return; - end; - - -- Disable resizing - HandleResizing = false; - - -- Prevent selection - Core.Targeting.CancelSelecting(); - - -- Clear this connection to prevent it from firing again - ClearConnection 'HandleRelease'; - - -- Make joints, restore original anchor and collision states - for _, Part in pairs(Selection.Items) do - Part:MakeJoints(); - Part.CanCollide = InitialState[Part].CanCollide; - Part.Anchored = InitialState[Part].Anchored; - end; - - -- Register the change - RegisterChange(); - - end); - end); ------------------------------------------ @@ -359,6 +327,36 @@ function ShowHandles() end; + +-- Finalize changes to parts when the handle is let go +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Ensure handle resizing is ongoing + if not HandleResizing then + return; + end; + + -- Disable resizing + HandleResizing = false; + + -- Prevent selection + Core.Targeting.CancelSelecting(); + + -- Clear this connection to prevent it from firing again + ClearConnection 'HandleRelease'; + + -- Make joints, restore original anchor and collision states + for _, Part in pairs(Selection.Items) do + Part:MakeJoints(); + Part.CanCollide = InitialState[Part].CanCollide; + Part.Anchored = InitialState[Part].Anchored; + end; + + -- Register the change + RegisterChange(); + +end); + function HideHandles() -- Hides the resizing handles @@ -938,32 +936,37 @@ function StartSnapping() end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) +end; - -- If destination stage was reached, restore the selection's original state - if SnappingStage == 'Destination' then - for Part, PartState in pairs(SnappingStartSelectionState) do - Part:MakeJoints(); - Part.CanCollide = PartState.CanCollide; - Part.Anchored = PartState.Anchored; - end; - end; +-- Stop snapping whenever mouse is released +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) - -- Finish snapping - FinishSnapping(); + -- Ensure snapping is ongoing + if not SnappingStage then + return; + end; - end); + -- Finish snapping + FinishSnapping(); + +end); -end; function FinishSnapping() + -- Cleans up and finalizes the snapping operation -- Ensure snapping is ongoing if not SnappingStage then return; end; + -- Restore the selection's original state + for Part, PartState in pairs(SnappingStartSelectionState) do + Part:MakeJoints(); + Part.CanCollide = PartState.CanCollide; + Part.Anchored = PartState.Anchored; + end; + -- Disable any snapping stage SnappingStage = nil; diff --git a/tools/Rotate.lua b/tools/Rotate.lua index f58b0e8..88a575e 100644 --- a/tools/Rotate.lua +++ b/tools/Rotate.lua @@ -273,7 +273,6 @@ function AttachHandles(Part, Autofocus) -- Prepare for rotating parts when the handle is clicked -------------------------------------------------------- - local InitialState = {}; local AreaPermissions; Handles.MouseButton1Down:connect(function () @@ -305,38 +304,6 @@ function AttachHandles(Part, Autofocus) PivotPoint = InitialState[Selection.Focus].CFrame; end; - ------------------------------------------------------ - -- Finalize changes to parts when the handle is let go - ------------------------------------------------------ - - Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - - -- Make sure this was button 1 being released, and rotating is ongoing - if not HandleRotating or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then - return; - end; - - -- Prevent selection - Core.Targeting.CancelSelecting(); - - -- Disable rotating - HandleRotating = false; - - -- Clear this connection to prevent it from firing again - ClearConnection 'HandleRelease'; - - -- Make joints, restore original anchor and collision states - for _, Part in pairs(Selection.Items) do - Part:MakeJoints(); - Part.CanCollide = InitialState[Part].CanCollide; - Part.Anchored = InitialState[Part].Anchored; - end; - - -- Register the change - RegisterChange(); - - end); - end); ------------------------------------------ @@ -375,6 +342,35 @@ function AttachHandles(Part, Autofocus) end; +-- Finalize changes to parts when the handle is let go +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Make sure rotating is ongoing + if not HandleRotating then + return; + end; + + -- Prevent selection + Core.Targeting.CancelSelecting(); + + -- Disable rotating + HandleRotating = false; + + -- Clear this connection to prevent it from firing again + ClearConnection 'HandleRelease'; + + -- Make joints, restore original anchor and collision states + for _, Part in pairs(Selection.Items) do + Part:MakeJoints(); + Part.CanCollide = InitialState[Part].CanCollide; + Part.Anchored = InitialState[Part].Anchored; + end; + + -- Register the change + RegisterChange(); + +end); + function HideHandles() -- Hides the resizing handles From 00801b9a78bded2c16d42a2806eb9668f4fe9754 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Tue, 11 Apr 2017 16:01:24 -0700 Subject: [PATCH 3/3] Update asset builds to 2.1.0 Signed-off-by: Robert Chiquini --- build/Building Tools by F3X (plugin).rbxmx | 2715 ++++++++++---------- build/Building Tools by F3X.rbxmx | 2635 +++++++++---------- 2 files changed, 2716 insertions(+), 2634 deletions(-) diff --git a/build/Building Tools by F3X (plugin).rbxmx b/build/Building Tools by F3X (plugin).rbxmx index 1b01426..72786f5 100644 --- a/build/Building Tools by F3X (plugin).rbxmx +++ b/build/Building Tools by F3X (plugin).rbxmx @@ -1,11 +1,11 @@ null nil - + Building Tools by F3X - + false -0.5 @@ -76,7 +76,7 @@ 0.800000012 - + 4294967295 5 @@ -85,7 +85,7 @@ 0 - + 4294967295 2 @@ -94,7 +94,7 @@ 0 - + 4294967295 3 @@ -103,7 +103,7 @@ 0 - + 4294967295 0 @@ -112,7 +112,7 @@ 0 - + 4294967295 1 @@ -121,7 +121,7 @@ 0 - + 4294967295 4 @@ -131,17 +131,17 @@ - + Version - 2.0.4 + 2.1.0 - + SupportLibrary - {3B9C733D-B278-4AF3-BD73-0B2B8F2F19B6} + {D9556558-E69B-4CD7-9D50-507908257A86} - + SecurityModule - {3DDB9821-CE15-4B40-96CC-A55AA6A0799A} + {3401EA9C-1E9D-46EB-9EDB-D8C28B9B075A} - + Region by AxisAngle - {A7098394-ADCC-42BC-8CF8-721A4E28C48A} + {6B95E6D0-B586-444C-B188-EEB7C7A5730E} - + false @@ -1818,11 +1818,11 @@ end; -- Expose GetLibraries function _G.GetLibraries = GetLibraries;]]> - + F3X/SupportLibrary@1.0.0 - {56910557-0736-4D62-BBD6-096A11CA38C4} + {946A4CC1-6686-4565-8C0C-F43458BE8291} - + Metadata - {DFA05253-9F57-4AD2-810F-1B8F6F6603D7} + {0DFB0D00-B07F-4B3B-A6C9-323C815AA535} - + F3X/Cheer@0.0.1 - {B78F7E1B-6DC5-4724-9A36-69A8C62BF466} + {C8D0DAD5-92DD-4750-A047-343030A539F5} - + SupportLibrary - {59DE0AAC-A2F9-42E6-90AE-41CE14C10416} + {2CDD67FF-2CDB-4C67-BBD4-57C0CBB5A70E} - + Metadata - {4CA35FAB-5CCC-45F9-BA2E-EA8BF37BF4D7} + {2E19CEB9-BF5B-43F9-BA77-1DA1CC3DAFAC} - + F3X/Try@1.0.0 - {C9142536-A61B-499E-9BF4-F36E3D790E33} + {38EC51E1-C3FF-48F8-B733-2BD0FFD6C100} - + SupportLibrary @@ -5232,11 +5232,11 @@ end; return SupportLibrary;]]> - + Metadata - {5B1FFCCF-5CB0-4338-B6A4-DEE602998C87} + {F020D70C-F566-46EC-8243-A067D75DC97A} - + SerializationModule - {A8AC26D7-FAE7-44FF-8012-1BDCE2C60108} + {9191D0B1-4975-4981-A4FB-CAE28F816E67} - + SyncAPI - + SyncModule - {185C63EE-A1E9-412F-BF5F-417C8DDC25F7} + {8618E884-723D-4B16-831F-49569C0FA7AD} - + ServerEndpoint - + false ServerEndpointScript - {D444E596-4AB5-4706-8E5D-2AEEE8624027} + {A636FC52-37C6-4282-983D-9055AA44EA23} - + false @@ -7269,22 +7269,22 @@ end;]]> - + Loaded false - + ComponentCount 0 - + false ComponentCounter - {FBD76AE5-1813-4620-B28F-0C5012254C16} + {FB5BBEC8-7693-47F9-8C70-7743534EAA27}

- + false @@ -7322,11 +7322,11 @@ Indicator.Value = true;]]> - + Assets - {E4FD0134-1BB0-44E3-90F6-2D2B49C39A0C} + {8386F054-27DA-48D3-874D-4DB007D7AC97} return Assets;]]> - + Core - {D1D7CD74-FBF6-4C28-B6D2-A6A58313E257} + {3F7B7FC9-3744-4313-8368-025A623568D8} - + false @@ -8068,15 +8077,15 @@ local Core = require(Tool:WaitForChild 'Core'); require(Tool.Tools.CoreToolLoader);]]> - + Tools - + MoveTool - {82360781-7673-4323-AB3E-AC34A6F2A311} + {2021DF9B-3BD7-43FE-8924-64425F88CD6D} - + ResizeTool - {19FD1962-6261-4080-AC86-0BFB98FDB40D} + {6229027D-CD04-4E61-A4A7-2F9FBC02A02E} - + RotateTool - {D8D1A850-A8F6-40A8-A073-A861D4185523} + {F5DD8618-4AD2-446C-9A05-59461E6E6D8E} - + PaintTool - {A3455F9B-2BB9-4113-947A-0BFE1C08C2A3} + {62FCFCF7-500D-4FD8-83F5-417690A02F2A} - + Colors - {995577E2-6193-427F-876D-9CDFEACF3E74} + {C77AD9DB-8BD6-48BA-B5AF-263A23F16A92} - + MaterialTool - {7468CFF9-ED7E-4663-8974-DA3D503D40A9} + {2747D86F-B1CA-4529-B354-5A86C124E911} - + SurfaceTool - {62B9775B-0545-49AF-A5DC-890C45D0FB71} + {99123F42-467B-421A-AFFB-3A545AC944A8} - + AnchorTool - {6AC72367-BF28-4729-89E8-706C53D67D6A} + {15498961-470C-4B54-A827-55C5C8ED6B09} - + WeldTool - {CAB289F8-788B-4958-A998-DC5CB7DA7DF1} + {7BA551AA-3379-4CFA-867D-438842125D5B} - + TextureTool - {A95E3D63-F4EF-4A0A-A3B9-921B60840F50} + {5BFFDB99-730E-438C-89C9-52DF3E4BD08F} - + MeshTool - {E0407536-C797-4A89-AABC-D6D77D03087F} + {0A200B0A-52D2-4290-A89F-5E49D32B2C9A} - + NewPartTool - {43D159F3-8D8C-45DC-BFE0-1F54602DD688} + {DDF5E457-D488-469F-A321-6C84AD4A60CA} - + CollisionTool - {F62F31F5-D5A7-4AEA-B68A-D014718C6AA9} + {CC65B47C-CA64-46BD-A588-52F108ED8266} - + LightingTool - {E4D77A7B-1674-4A3A-9142-40E4BC33CE75} + {6E982A66-92A4-4382-9997-1A3672BBAC8F} - + DecorateTool - {094F5ED3-553F-46F5-8DD6-BF7159FC80B0} + {9CB4F583-E59A-42F4-93DE-7CFF182DA317} - + CoreToolLoader - {D22B21E9-BBED-4E42-8D0E-91E5A911D82A} + {CAA38DE4-A8CA-4882-8F5D-812628B6E3E7} - + HistoryModule - {EA89A3E5-DCA9-4FA4-8BCB-61DB5C7705AC} + {907F8522-3B02-4BC3-A5EF-DCF223C6F3BB} - + SelectionModule - {E45B8E2E-9E24-40CE-A269-8954B76A6A12} + {13D9B62D-3AD6-4348-BF0D-B31495403346} 0 then TrackSelectionChange(OldSelection); end; + -- Create selection boxes for the selection + CreateSelectionBoxes(SelectableItems); + -- Fire relevant events Selection.ItemsAdded:fire(SelectableItems); Selection.Changed:fire(); @@ -16177,28 +16181,24 @@ end; function Selection.Remove(Items, RegisterHistory) -- Removes the given items from the selection - local DeselectableItems = {}; - -- Go through and validate each given item + local DeselectableItems = {}; for _, Item in pairs(Items) do -- Make sure each item is actually selected - if Selection.Find(Item) then + if Selection.IsSelected(Item) then table.insert(DeselectableItems, Item); end; end; - local OldSelection = Support.CloneTable(Selection.Items); + local OldSelection = Selection.Items; -- Go through the valid deselectable items for _, Item in pairs(DeselectableItems) do - -- Clear item's selection box - RemoveSelectionBox(Item); - -- Remove item from selection - table.remove(Selection.Items, Selection.Find(Item)); + Selection.ItemIndex[Item] = nil; -- Stop tracking item's parent Listeners[Item]:disconnect(); @@ -16206,6 +16206,12 @@ function Selection.Remove(Items, RegisterHistory) end; + -- Remove selection boxes from deselected items + RemoveSelectionBoxes(DeselectableItems); + + -- Update selected item list + Selection.Items = Support.Keys(Selection.ItemIndex); + -- Create a history record for this selection change, if requested if RegisterHistory and #DeselectableItems > 0 then TrackSelectionChange(OldSelection); @@ -16243,7 +16249,7 @@ function Selection.SetFocus(Item) -- Selects `Item` as the focused selection item -- Make sure the item is selected or is `nil` - if not Selection.Find(Item) and Item ~= nil then + if not Selection.IsSelected(Item) and Item ~= nil then return; end; @@ -16277,47 +16283,72 @@ function GetCore() return require(script.Parent.Core); end; -function CreateSelectionBox(Item) - -- Creates a SelectionBox for the given item +function CreateSelectionBoxes(Items) + -- Creates a SelectionBox for each given item + + -- Get the core API + local Core = GetCore(); -- Only create selection boxes if in tool mode - if GetCore().Mode ~= 'Tool' then + if Core.Mode ~= 'Tool' then return; end; - -- Avoid duplicate selection boxes - if Selection.Outlines[Item] then - return; - end; + -- Track new selection boxes + local SelectionBoxes = {}; - -- Create the selection box - local SelectionBox = RbxUtility.Create 'SelectionBox' { - Name = 'BTSelectionBox'; - Color = Selection.Color; - Adornee = Item; - LineThickness = 0.025; - Transparency = 0.5; - }; + -- Create an outline for each part + for _, Item in pairs(Items) do + + -- Avoid duplicate selection boxes + if not Selection.Outlines[Item] then + + -- Create the selection box + local SelectionBox = Instance.new 'SelectionBox'; + SelectionBox.Name = 'BTSelectionBox'; + SelectionBox.Color = Selection.Color; + SelectionBox.Adornee = Item; + SelectionBox.LineThickness = 0.025; + SelectionBox.Transparency = 0.5; - -- Register the selection box - SelectionBox.Parent = GetCore().UIContainer; - Selection.Outlines[Item] = SelectionBox; + -- Register the outline + Selection.Outlines[Item] = SelectionBox; + table.insert(SelectionBoxes, SelectionBox); + + end; + + end; + + -- Parent the selection boxes + for _, SelectionBox in pairs(SelectionBoxes) do + SelectionBox.Parent = Core.UIContainer; + end; end; -function RemoveSelectionBox(Item) +function RemoveSelectionBoxes(Items) -- Removes the given item's selection box - -- Get the item's selection box - local SelectionBox = Selection.Outlines[Item]; - - -- Remove the selection box if found - if SelectionBox then - SelectionBox:Destroy(); + -- Only proceed if in tool mode + if GetCore().Mode ~= 'Tool' then + return; end; - -- Deregister the selection box - Selection.Outlines[Item] = nil; + -- Remove each item's outline + for _, Item in pairs(Items) do + + -- Get the item's selection box + local SelectionBox = Selection.Outlines[Item]; + + -- Remove the selection box if found + if SelectionBox then + SelectionBox:Destroy(); + end; + + -- Deregister the selection box + Selection.Outlines[Item] = nil; + + end; end; @@ -16420,7 +16451,7 @@ function TrackSelectionChange(OldSelection) History.Add({ Before = OldSelection; - After = Support.CloneTable(Selection.Items); + After = Selection.Items; Unapply = function (HistoryRecord) -- Reverts this change @@ -16444,11 +16475,11 @@ end; return Selection;]]> - + SnappingModule - {7A7F3F7D-DB6B-4B1C-90D6-E221EEC993B3} + {6B31D07F-DDFD-4374-B798-4B7DC3EB11DE} - + FilterMode false - + false FilterModeEnabler - {DF4E1777-7B85-4886-9BFF-D14BC07A64E7} + {337B8939-C72D-4605-95ED-ECB4C0FE6122} script.Parent.Value = Workspace.FilteringEnabled; - + BoundingBoxModule - {EAC88C68-8BF4-4F05-A508-12CC700A8666} + {8B65974F-30B0-4FC6-AF4D-93385327981D} - + TargetingModule - {9ED3863D-5CE8-4F57-B2A1-4DA34A4F49D9} + {D7DCED7D-68BB-4010-BE05-78F7D1304731} - + Interfaces - + true @@ -17389,7 +17430,7 @@ return TargetingModule;]]> true 1 - + false @@ -17428,7 +17469,7 @@ return TargetingModule;]]> true 1 - + false @@ -17468,7 +17509,7 @@ return TargetingModule;]]> 1 - + false @@ -17519,7 +17560,7 @@ return TargetingModule;]]> 1 - + false @@ -17571,7 +17612,7 @@ return TargetingModule;]]> - + false @@ -17610,7 +17651,7 @@ return TargetingModule;]]> true 1 - + false @@ -17661,7 +17702,7 @@ return TargetingModule;]]> 1 - + false @@ -17700,7 +17741,7 @@ return TargetingModule;]]> true 1 - + false @@ -17740,7 +17781,7 @@ return TargetingModule;]]> 1 - + true @@ -17795,7 +17836,7 @@ return TargetingModule;]]> 2 - + false @@ -17856,7 +17897,7 @@ return TargetingModule;]]> 1 - + false @@ -17908,7 +17949,7 @@ return TargetingModule;]]> - + false @@ -17947,7 +17988,7 @@ return TargetingModule;]]> true 1 - + false @@ -17987,7 +18028,7 @@ return TargetingModule;]]> 1 - + true @@ -18042,7 +18083,7 @@ return TargetingModule;]]> 2 - + false @@ -18103,7 +18144,7 @@ return TargetingModule;]]> 1 - + false @@ -18156,7 +18197,7 @@ return TargetingModule;]]> - + false @@ -18195,7 +18236,7 @@ return TargetingModule;]]> true 1 - + false @@ -18235,7 +18276,7 @@ return TargetingModule;]]> 1 - + false @@ -18288,7 +18329,7 @@ return TargetingModule;]]> - + true @@ -18327,7 +18368,7 @@ return TargetingModule;]]> true 1 - + false @@ -18366,7 +18407,7 @@ return TargetingModule;]]> true 1 - + false @@ -18406,7 +18447,7 @@ return TargetingModule;]]> 1 - + false @@ -18457,7 +18498,7 @@ return TargetingModule;]]> 1 - + false @@ -18509,7 +18550,7 @@ return TargetingModule;]]> - + false @@ -18548,7 +18589,7 @@ return TargetingModule;]]> true 1 - + false @@ -18599,7 +18640,7 @@ return TargetingModule;]]> 1 - + false @@ -18638,7 +18679,7 @@ return TargetingModule;]]> true 1 - + false @@ -18678,7 +18719,7 @@ return TargetingModule;]]> 1 - + true @@ -18733,7 +18774,7 @@ return TargetingModule;]]> 2 - + false @@ -18794,7 +18835,7 @@ return TargetingModule;]]> 1 - + false @@ -18846,7 +18887,7 @@ return TargetingModule;]]> - + false @@ -18885,7 +18926,7 @@ return TargetingModule;]]> true 1 - + false @@ -18925,7 +18966,7 @@ return TargetingModule;]]> 1 - + true @@ -18980,7 +19021,7 @@ return TargetingModule;]]> 2 - + false @@ -19041,7 +19082,7 @@ return TargetingModule;]]> 1 - + false @@ -19094,7 +19135,7 @@ return TargetingModule;]]> - + false @@ -19133,7 +19174,7 @@ return TargetingModule;]]> true 1 - + false @@ -19173,7 +19214,7 @@ return TargetingModule;]]> 1 - + false @@ -19226,7 +19267,7 @@ return TargetingModule;]]> - + true @@ -19265,7 +19306,7 @@ return TargetingModule;]]> true 1 - + false @@ -19305,7 +19346,7 @@ return TargetingModule;]]> 1 - + false @@ -19344,7 +19385,7 @@ return TargetingModule;]]> true 1 - + false @@ -19384,7 +19425,7 @@ return TargetingModule;]]> 1 - + false @@ -19435,7 +19476,7 @@ return TargetingModule;]]> 1 - + false @@ -19487,7 +19528,7 @@ return TargetingModule;]]> - + false @@ -19526,7 +19567,7 @@ return TargetingModule;]]> true 1 - + false @@ -19577,7 +19618,7 @@ return TargetingModule;]]> 1 - + true @@ -19642,7 +19683,7 @@ return TargetingModule;]]> 1 - + false @@ -19682,7 +19723,7 @@ return TargetingModule;]]> 1 - + true @@ -19737,7 +19778,7 @@ return TargetingModule;]]> 1 - + true @@ -19792,7 +19833,7 @@ return TargetingModule;]]> 1 - + false @@ -19832,7 +19873,7 @@ return TargetingModule;]]> 1 - + false @@ -19871,7 +19912,7 @@ return TargetingModule;]]> true 1 - + false @@ -19910,7 +19951,7 @@ return TargetingModule;]]> true 1 - + false @@ -19961,7 +20002,7 @@ return TargetingModule;]]> 1 - + false @@ -20000,7 +20041,7 @@ return TargetingModule;]]> true 1 - + false @@ -20061,7 +20102,7 @@ return TargetingModule;]]> 1 - + false @@ -20101,7 +20142,7 @@ return TargetingModule;]]> 1 - + true @@ -20157,7 +20198,7 @@ return TargetingModule;]]> - + false @@ -20196,7 +20237,7 @@ return TargetingModule;]]> true 1 - + false @@ -20247,7 +20288,7 @@ return TargetingModule;]]> 1 - + false @@ -20286,7 +20327,7 @@ return TargetingModule;]]> true 1 - + false @@ -20347,7 +20388,7 @@ return TargetingModule;]]> 1 - + false @@ -20387,7 +20428,7 @@ return TargetingModule;]]> 1 - + true @@ -20443,7 +20484,7 @@ return TargetingModule;]]> - + false @@ -20482,7 +20523,7 @@ return TargetingModule;]]> true 1 - + false @@ -20533,7 +20574,7 @@ return TargetingModule;]]> 1 - + false @@ -20572,7 +20613,7 @@ return TargetingModule;]]> true 1 - + false @@ -20633,7 +20674,7 @@ return TargetingModule;]]> 1 - + false @@ -20673,7 +20714,7 @@ return TargetingModule;]]> 1 - + true @@ -20729,7 +20770,7 @@ return TargetingModule;]]> - + false @@ -20768,7 +20809,7 @@ return TargetingModule;]]> true 1 - + true @@ -20832,7 +20873,7 @@ return TargetingModule;]]> true 1 - + false @@ -20873,7 +20914,7 @@ return TargetingModule;]]> - + false @@ -20924,7 +20965,7 @@ return TargetingModule;]]> 1 - + false @@ -20963,7 +21004,7 @@ return TargetingModule;]]> true 1 - + false @@ -21003,7 +21044,7 @@ return TargetingModule;]]> 1 - + false @@ -21058,7 +21099,7 @@ return TargetingModule;]]> - + false @@ -21109,7 +21150,7 @@ return TargetingModule;]]> 1 - + false @@ -21148,7 +21189,7 @@ return TargetingModule;]]> true 1 - + false @@ -21199,7 +21240,7 @@ return TargetingModule;]]> 1 - + true @@ -21264,7 +21305,7 @@ return TargetingModule;]]> 1 - + false @@ -21304,7 +21345,7 @@ return TargetingModule;]]> 1 - + true @@ -21359,7 +21400,7 @@ return TargetingModule;]]> 1 - + true @@ -21414,7 +21455,7 @@ return TargetingModule;]]> 1 - + false @@ -21454,7 +21495,7 @@ return TargetingModule;]]> 1 - + false @@ -21493,7 +21534,7 @@ return TargetingModule;]]> true 1 - + false @@ -21532,7 +21573,7 @@ return TargetingModule;]]> true 1 - + false @@ -21583,7 +21624,7 @@ return TargetingModule;]]> 1 - + false @@ -21622,7 +21663,7 @@ return TargetingModule;]]> true 1 - + false @@ -21683,7 +21724,7 @@ return TargetingModule;]]> 1 - + false @@ -21723,7 +21764,7 @@ return TargetingModule;]]> 1 - + true @@ -21779,7 +21820,7 @@ return TargetingModule;]]> - + false @@ -21818,7 +21859,7 @@ return TargetingModule;]]> true 1 - + false @@ -21869,7 +21910,7 @@ return TargetingModule;]]> 1 - + false @@ -21908,7 +21949,7 @@ return TargetingModule;]]> true 1 - + false @@ -21969,7 +22010,7 @@ return TargetingModule;]]> 1 - + false @@ -22009,7 +22050,7 @@ return TargetingModule;]]> 1 - + true @@ -22065,7 +22106,7 @@ return TargetingModule;]]> - + false @@ -22104,7 +22145,7 @@ return TargetingModule;]]> true 1 - + true @@ -22168,7 +22209,7 @@ return TargetingModule;]]> true 1 - + false @@ -22209,7 +22250,7 @@ return TargetingModule;]]> - + false @@ -22260,7 +22301,7 @@ return TargetingModule;]]> 1 - + false @@ -22299,7 +22340,7 @@ return TargetingModule;]]> true 1 - + false @@ -22339,7 +22380,7 @@ return TargetingModule;]]> 1 - + false @@ -22392,7 +22433,7 @@ return TargetingModule;]]> - + false @@ -22431,7 +22472,7 @@ return TargetingModule;]]> true 1 - + true @@ -22495,7 +22536,7 @@ return TargetingModule;]]> true 1 - + false @@ -22536,7 +22577,7 @@ return TargetingModule;]]> - + false @@ -22587,7 +22628,7 @@ return TargetingModule;]]> 1 - + false @@ -22626,7 +22667,7 @@ return TargetingModule;]]> true 1 - + false @@ -22666,7 +22707,7 @@ return TargetingModule;]]> 1 - + false @@ -22721,7 +22762,7 @@ return TargetingModule;]]> - + false @@ -22760,7 +22801,7 @@ return TargetingModule;]]> true 1 - + false @@ -22811,7 +22852,7 @@ return TargetingModule;]]> 1 - + true @@ -22876,7 +22917,7 @@ return TargetingModule;]]> 1 - + false @@ -22916,7 +22957,7 @@ return TargetingModule;]]> 1 - + true @@ -22971,7 +23012,7 @@ return TargetingModule;]]> 2 - + true @@ -23026,7 +23067,7 @@ return TargetingModule;]]> 2 - + false @@ -23066,7 +23107,7 @@ return TargetingModule;]]> 1 - + false @@ -23105,7 +23146,7 @@ return TargetingModule;]]> true 1 - + false @@ -23144,7 +23185,7 @@ return TargetingModule;]]> true 1 - + true @@ -23208,7 +23249,7 @@ return TargetingModule;]]> true 1 - + false @@ -23249,7 +23290,7 @@ return TargetingModule;]]> - + false @@ -23300,7 +23341,7 @@ return TargetingModule;]]> 1 - + false @@ -23339,7 +23380,7 @@ return TargetingModule;]]> true 1 - + false @@ -23379,7 +23420,7 @@ return TargetingModule;]]> 1 - + false @@ -23435,7 +23476,7 @@ return TargetingModule;]]> - + true @@ -23474,7 +23515,7 @@ return TargetingModule;]]> true 1 - + false @@ -23513,7 +23554,7 @@ return TargetingModule;]]> false 1 - + false @@ -23552,7 +23593,7 @@ return TargetingModule;]]> true 1 - + true @@ -23616,7 +23657,7 @@ return TargetingModule;]]> true 1 - + false @@ -23655,7 +23696,7 @@ return TargetingModule;]]> false 2 - + false @@ -23695,7 +23736,7 @@ return TargetingModule;]]> 2 - + false @@ -23748,7 +23789,7 @@ return TargetingModule;]]> - + true @@ -23812,7 +23853,7 @@ return TargetingModule;]]> true 1 - + false @@ -23851,7 +23892,7 @@ return TargetingModule;]]> false 2 - + false @@ -23891,7 +23932,7 @@ return TargetingModule;]]> 2 - + false @@ -23944,7 +23985,7 @@ return TargetingModule;]]> - + true @@ -24008,7 +24049,7 @@ return TargetingModule;]]> true 1 - + false @@ -24047,7 +24088,7 @@ return TargetingModule;]]> false 3 - + false @@ -24087,7 +24128,7 @@ return TargetingModule;]]> 3 - + false @@ -24140,7 +24181,7 @@ return TargetingModule;]]> - + false @@ -24179,7 +24220,7 @@ return TargetingModule;]]> true 1 - + false @@ -24218,7 +24259,7 @@ return TargetingModule;]]> false 2 - + false @@ -24258,7 +24299,7 @@ return TargetingModule;]]> 2 - + false @@ -24311,7 +24352,7 @@ return TargetingModule;]]> - + true @@ -24366,7 +24407,7 @@ return TargetingModule;]]> 2 - + true @@ -24422,7 +24463,7 @@ return TargetingModule;]]> - + false @@ -24476,7 +24517,7 @@ return TargetingModule;]]> 1 - + false @@ -24527,7 +24568,7 @@ return TargetingModule;]]> 1 - + false @@ -24566,7 +24607,7 @@ return TargetingModule;]]> true 1 - + true @@ -24621,7 +24662,7 @@ return TargetingModule;]]> 1 - + false @@ -24661,7 +24702,7 @@ return TargetingModule;]]> 1 - + false @@ -24714,7 +24755,7 @@ return TargetingModule;]]> - + true @@ -24753,7 +24794,7 @@ return TargetingModule;]]> true 1 - + true @@ -24817,7 +24858,7 @@ return TargetingModule;]]> true 1 - + false @@ -24879,7 +24920,7 @@ return TargetingModule;]]> - + true @@ -24943,7 +24984,7 @@ return TargetingModule;]]> true 2 - + false @@ -24983,7 +25024,7 @@ return TargetingModule;]]> 1 - + false @@ -25045,7 +25086,7 @@ return TargetingModule;]]> - + false @@ -25084,7 +25125,7 @@ return TargetingModule;]]> true 1 - + false @@ -25135,7 +25176,7 @@ return TargetingModule;]]> 1 - + false @@ -25174,7 +25215,7 @@ return TargetingModule;]]> true 1 - + false @@ -25215,7 +25256,7 @@ return TargetingModule;]]> - + true @@ -25268,7 +25309,7 @@ return TargetingModule;]]> true 2 - + false @@ -25331,7 +25372,7 @@ return TargetingModule;]]> - + false @@ -25370,7 +25411,7 @@ return TargetingModule;]]> true 1 - + false @@ -25421,7 +25462,7 @@ return TargetingModule;]]> 1 - + false @@ -25460,7 +25501,7 @@ return TargetingModule;]]> true 1 - + false @@ -25501,7 +25542,7 @@ return TargetingModule;]]> - + true @@ -25554,7 +25595,7 @@ return TargetingModule;]]> true 2 - + false @@ -25617,7 +25658,7 @@ return TargetingModule;]]> - + false @@ -25656,7 +25697,7 @@ return TargetingModule;]]> true 1 - + false @@ -25707,7 +25748,7 @@ return TargetingModule;]]> 1 - + false @@ -25746,7 +25787,7 @@ return TargetingModule;]]> true 1 - + false @@ -25787,7 +25828,7 @@ return TargetingModule;]]> - + true @@ -25840,7 +25881,7 @@ return TargetingModule;]]> true 2 - + false @@ -25903,7 +25944,7 @@ return TargetingModule;]]> - + false @@ -25942,7 +25983,7 @@ return TargetingModule;]]> true 1 - + false @@ -25983,7 +26024,7 @@ return TargetingModule;]]> - + true @@ -26037,7 +26078,7 @@ return TargetingModule;]]> true 2 - + false @@ -26078,7 +26119,7 @@ return TargetingModule;]]> - + true @@ -26132,7 +26173,7 @@ return TargetingModule;]]> true 2 - + false @@ -26173,7 +26214,7 @@ return TargetingModule;]]> - + [Component] @@ -26301,7 +26342,7 @@ return Component;]]> - + true @@ -26340,7 +26381,7 @@ return Component;]]> true 1 - + false @@ -26379,7 +26420,7 @@ return Component;]]> true 1 - + false @@ -26419,7 +26460,7 @@ return Component;]]> 1 - + true @@ -26474,7 +26515,7 @@ return Component;]]> 1 - + true @@ -26529,7 +26570,7 @@ return Component;]]> 1 - + false @@ -26569,7 +26610,7 @@ return Component;]]> 1 - + true @@ -26634,7 +26675,7 @@ return Component;]]> 1 - + false @@ -26685,7 +26726,7 @@ return Component;]]> 1 - + false @@ -26724,7 +26765,7 @@ return Component;]]> true 1 - + false @@ -26763,7 +26804,7 @@ return Component;]]> true 1 - + false @@ -26814,7 +26855,7 @@ return Component;]]> 1 - + true @@ -26880,7 +26921,7 @@ return Component;]]> - + false @@ -26919,7 +26960,7 @@ return Component;]]> true 1 - + false @@ -26958,7 +26999,7 @@ return Component;]]> true 1 - + true @@ -27012,7 +27053,7 @@ return Component;]]> 2 - + false @@ -27073,7 +27114,7 @@ return Component;]]> 1 - + false @@ -27114,7 +27155,7 @@ return Component;]]> - + false @@ -27166,7 +27207,7 @@ return Component;]]> - + false @@ -27205,7 +27246,7 @@ return Component;]]> true 1 - + false @@ -27244,7 +27285,7 @@ return Component;]]> true 1 - + true @@ -27298,7 +27339,7 @@ return Component;]]> 2 - + false @@ -27359,7 +27400,7 @@ return Component;]]> 1 - + false @@ -27400,7 +27441,7 @@ return Component;]]> - + false @@ -27452,7 +27493,7 @@ return Component;]]> - + false @@ -27491,7 +27532,7 @@ return Component;]]> true 1 - + true @@ -27555,7 +27596,7 @@ return Component;]]> true 1 - + false @@ -27596,7 +27637,7 @@ return Component;]]> - + false @@ -27647,7 +27688,7 @@ return Component;]]> 1 - + false @@ -27686,7 +27727,7 @@ return Component;]]> true 1 - + false @@ -27726,7 +27767,7 @@ return Component;]]> 1 - + false @@ -27781,7 +27822,7 @@ return Component;]]> - + false @@ -27832,7 +27873,7 @@ return Component;]]> 1 - + false @@ -27871,7 +27912,7 @@ return Component;]]> true 1 - + false @@ -27910,7 +27951,7 @@ return Component;]]> true 1 - + false @@ -27949,7 +27990,7 @@ return Component;]]> true 1 - + false @@ -28000,7 +28041,7 @@ return Component;]]> 1 - + true @@ -28066,7 +28107,7 @@ return Component;]]> - + false @@ -28105,7 +28146,7 @@ return Component;]]> true 1 - + false @@ -28156,7 +28197,7 @@ return Component;]]> 1 - + true @@ -28210,7 +28251,7 @@ return Component;]]> true 1 - + false @@ -28271,7 +28312,7 @@ return Component;]]> 3 - + true @@ -28325,7 +28366,7 @@ return Component;]]> false 4 - + false @@ -28377,12 +28418,12 @@ return Component;]]> - + Options - + false @@ -28422,7 +28463,7 @@ return Component;]]> 1 - + false @@ -28473,7 +28514,7 @@ return Component;]]> 3 - + [Component] @@ -28559,7 +28600,7 @@ return Component;]]> - + false @@ -28598,7 +28639,7 @@ return Component;]]> true 1 - + false @@ -28637,7 +28678,7 @@ return Component;]]> true 1 - + true @@ -28691,7 +28732,7 @@ return Component;]]> 2 - + false @@ -28752,7 +28793,7 @@ return Component;]]> 1 - + false @@ -28793,7 +28834,7 @@ return Component;]]> - + false @@ -28845,7 +28886,7 @@ return Component;]]> - + false @@ -28884,7 +28925,7 @@ return Component;]]> true 1 - + false @@ -28923,7 +28964,7 @@ return Component;]]> true 1 - + true @@ -28977,7 +29018,7 @@ return Component;]]> 2 - + false @@ -29017,7 +29058,7 @@ return Component;]]> 1 - + false @@ -29079,7 +29120,7 @@ return Component;]]> - + false @@ -29131,7 +29172,7 @@ return Component;]]> - + false @@ -29170,7 +29211,7 @@ return Component;]]> true 1 - + false @@ -29209,7 +29250,7 @@ return Component;]]> true 1 - + true @@ -29263,7 +29304,7 @@ return Component;]]> 2 - + false @@ -29324,7 +29365,7 @@ return Component;]]> 1 - + false @@ -29365,7 +29406,7 @@ return Component;]]> - + false @@ -29417,7 +29458,7 @@ return Component;]]> - + false @@ -29456,7 +29497,7 @@ return Component;]]> true 1 - + true @@ -29520,7 +29561,7 @@ return Component;]]> true 1 - + false @@ -29561,7 +29602,7 @@ return Component;]]> - + false @@ -29612,7 +29653,7 @@ return Component;]]> 1 - + false @@ -29651,7 +29692,7 @@ return Component;]]> true 1 - + false @@ -29691,7 +29732,7 @@ return Component;]]> 1 - + false @@ -29745,7 +29786,7 @@ return Component;]]> - + false @@ -29785,7 +29826,7 @@ return Component;]]> 1 - + true @@ -29840,7 +29881,7 @@ return Component;]]> 1 - + true @@ -29895,7 +29936,7 @@ return Component;]]> 1 - + false @@ -29935,7 +29976,7 @@ return Component;]]> 1 - + true @@ -30000,7 +30041,7 @@ return Component;]]> 1 - + false @@ -30052,7 +30093,7 @@ return Component;]]> - + false @@ -30091,7 +30132,7 @@ return Component;]]> true 1 - + false @@ -30142,7 +30183,7 @@ return Component;]]> 1 - + false @@ -30193,7 +30234,7 @@ return Component;]]> 1 - + false @@ -30234,7 +30275,7 @@ return Component;]]> - + false @@ -30274,7 +30315,7 @@ return Component;]]> 1 - + false @@ -30313,7 +30354,7 @@ return Component;]]> true 1 - + false @@ -30353,7 +30394,7 @@ return Component;]]> 1 - + true @@ -30408,7 +30449,7 @@ return Component;]]> 1 - + true @@ -30463,7 +30504,7 @@ return Component;]]> 1 - + false @@ -30503,7 +30544,7 @@ return Component;]]> 1 - + true @@ -30568,7 +30609,7 @@ return Component;]]> 1 - + false @@ -30619,7 +30660,7 @@ return Component;]]> 1 - + false @@ -30658,7 +30699,7 @@ return Component;]]> true 1 - + false @@ -30697,7 +30738,7 @@ return Component;]]> true 1 - + false @@ -30748,7 +30789,7 @@ return Component;]]> 1 - + true @@ -30814,7 +30855,7 @@ return Component;]]> - + false @@ -30853,7 +30894,7 @@ return Component;]]> true 1 - + false @@ -30904,7 +30945,7 @@ return Component;]]> 1 - + true @@ -30958,7 +30999,7 @@ return Component;]]> true 1 - + false @@ -31019,7 +31060,7 @@ return Component;]]> 3 - + true @@ -31073,7 +31114,7 @@ return Component;]]> false 4 - + false @@ -31125,12 +31166,12 @@ return Component;]]> - + Options - + false @@ -31170,7 +31211,7 @@ return Component;]]> 1 - + false @@ -31221,7 +31262,7 @@ return Component;]]> 3 - + [Component] @@ -31307,7 +31348,7 @@ return Component;]]> - + false @@ -31346,7 +31387,7 @@ return Component;]]> true 1 - + false @@ -31385,7 +31426,7 @@ return Component;]]> true 1 - + true @@ -31439,7 +31480,7 @@ return Component;]]> 2 - + false @@ -31500,7 +31541,7 @@ return Component;]]> 1 - + false @@ -31541,7 +31582,7 @@ return Component;]]> - + false @@ -31593,7 +31634,7 @@ return Component;]]> - + false @@ -31632,7 +31673,7 @@ return Component;]]> true 1 - + false @@ -31671,7 +31712,7 @@ return Component;]]> true 1 - + true @@ -31725,7 +31766,7 @@ return Component;]]> 2 - + false @@ -31765,7 +31806,7 @@ return Component;]]> 1 - + false @@ -31827,7 +31868,7 @@ return Component;]]> - + false @@ -31879,7 +31920,7 @@ return Component;]]> - + false @@ -31918,7 +31959,7 @@ return Component;]]> true 1 - + false @@ -31957,7 +31998,7 @@ return Component;]]> true 1 - + true @@ -32011,7 +32052,7 @@ return Component;]]> 2 - + false @@ -32072,7 +32113,7 @@ return Component;]]> 1 - + false @@ -32113,7 +32154,7 @@ return Component;]]> - + false @@ -32165,7 +32206,7 @@ return Component;]]> - + false @@ -32204,7 +32245,7 @@ return Component;]]> true 1 - + true @@ -32268,7 +32309,7 @@ return Component;]]> true 1 - + false @@ -32309,7 +32350,7 @@ return Component;]]> - + false @@ -32360,7 +32401,7 @@ return Component;]]> 1 - + false @@ -32399,7 +32440,7 @@ return Component;]]> true 1 - + false @@ -32439,7 +32480,7 @@ return Component;]]> 1 - + false @@ -32495,7 +32536,7 @@ return Component;]]> - + true @@ -32534,7 +32575,7 @@ return Component;]]> true 1 - + false @@ -32573,7 +32614,7 @@ return Component;]]> true 1 - + false @@ -32613,7 +32654,7 @@ return Component;]]> 1 - + false @@ -32664,7 +32705,7 @@ return Component;]]> 1 - + false @@ -32716,7 +32757,7 @@ return Component;]]> - + false @@ -32755,7 +32796,7 @@ return Component;]]> true 1 - + false @@ -32806,7 +32847,7 @@ return Component;]]> 1 - + true @@ -32860,7 +32901,7 @@ return Component;]]> true 1 - + false @@ -32921,7 +32962,7 @@ return Component;]]> 3 - + true @@ -32975,7 +33016,7 @@ return Component;]]> false 4 - + false @@ -33027,12 +33068,12 @@ return Component;]]> - + Options - + false @@ -33072,7 +33113,7 @@ return Component;]]> 1 - + false @@ -33123,7 +33164,7 @@ return Component;]]> 3 - + [Component] @@ -33209,7 +33250,7 @@ return Component;]]> - + false @@ -33248,7 +33289,7 @@ return Component;]]> true 1 - + false @@ -33299,7 +33340,7 @@ return Component;]]> 1 - + false @@ -33338,7 +33379,7 @@ return Component;]]> true 1 - + false @@ -33399,7 +33440,7 @@ return Component;]]> 1 - + false @@ -33439,7 +33480,7 @@ return Component;]]> 1 - + true @@ -33495,7 +33536,7 @@ return Component;]]> - + false @@ -33534,7 +33575,7 @@ return Component;]]> true 1 - + false @@ -33585,7 +33626,7 @@ return Component;]]> 1 - + false @@ -33624,7 +33665,7 @@ return Component;]]> true 1 - + false @@ -33664,7 +33705,7 @@ return Component;]]> 1 - + false @@ -33725,7 +33766,7 @@ return Component;]]> 1 - + true @@ -33781,7 +33822,7 @@ return Component;]]> - + false @@ -33820,7 +33861,7 @@ return Component;]]> true 1 - + false @@ -33861,7 +33902,7 @@ return Component;]]> - + false @@ -33913,7 +33954,7 @@ return Component;]]> - + true @@ -33952,7 +33993,7 @@ return Component;]]> true 1 - + false @@ -33991,7 +34032,7 @@ return Component;]]> true 1 - + false @@ -34031,7 +34072,7 @@ return Component;]]> 1 - + false @@ -34082,7 +34123,7 @@ return Component;]]> 1 - + false @@ -34134,7 +34175,7 @@ return Component;]]> - + false @@ -34173,7 +34214,7 @@ return Component;]]> false 1 - + false @@ -34224,7 +34265,7 @@ return Component;]]> 1 - + true @@ -34278,7 +34319,7 @@ return Component;]]> true 1 - + false @@ -34339,7 +34380,7 @@ return Component;]]> 3 - + true @@ -34393,7 +34434,7 @@ return Component;]]> false 4 - + false @@ -34445,12 +34486,12 @@ return Component;]]> - + Options - + false @@ -34490,7 +34531,7 @@ return Component;]]> 1 - + false @@ -34541,7 +34582,7 @@ return Component;]]> 3 - + [Component] @@ -34627,7 +34668,7 @@ return Component;]]> - + false @@ -34666,7 +34707,7 @@ return Component;]]> false 1 - + false @@ -34717,7 +34758,7 @@ return Component;]]> 1 - + false @@ -34756,7 +34797,7 @@ return Component;]]> true 1 - + false @@ -34817,7 +34858,7 @@ return Component;]]> 1 - + false @@ -34857,7 +34898,7 @@ return Component;]]> 1 - + true @@ -34912,7 +34953,7 @@ return Component;]]> - + false @@ -34951,7 +34992,7 @@ return Component;]]> true 1 - + false @@ -35012,7 +35053,7 @@ return Component;]]> 1 - + false @@ -35052,7 +35093,7 @@ return Component;]]> 1 - + true @@ -35107,7 +35148,7 @@ return Component;]]> - + false @@ -35146,7 +35187,7 @@ return Component;]]> true 1 - + false @@ -35207,7 +35248,7 @@ return Component;]]> 1 - + false @@ -35247,7 +35288,7 @@ return Component;]]> 1 - + true @@ -35303,7 +35344,7 @@ return Component;]]> - + false @@ -35342,7 +35383,7 @@ return Component;]]> false 1 - + true @@ -35397,7 +35438,7 @@ return Component;]]> 1 - + false @@ -35438,7 +35479,7 @@ return Component;]]> - + false @@ -35477,7 +35518,7 @@ return Component;]]> false 1 - + false @@ -35528,7 +35569,7 @@ return Component;]]> 1 - + true @@ -35582,7 +35623,7 @@ return Component;]]> 1 - + false @@ -35621,7 +35662,7 @@ return Component;]]> true 1 - + false @@ -35661,7 +35702,7 @@ return Component;]]> 1 - + false @@ -35701,7 +35742,7 @@ return Component;]]> 1 - + false @@ -35742,7 +35783,7 @@ return Component;]]> - + false @@ -35783,7 +35824,7 @@ return Component;]]> - + false @@ -35823,7 +35864,7 @@ return Component;]]> 1 - + false @@ -35862,7 +35903,7 @@ return Component;]]> false 1 - + false @@ -35913,7 +35954,7 @@ return Component;]]> 1 - + true @@ -35967,7 +36008,7 @@ return Component;]]> 1 - + false @@ -36006,7 +36047,7 @@ return Component;]]> true 1 - + false @@ -36046,7 +36087,7 @@ return Component;]]> 1 - + false @@ -36086,7 +36127,7 @@ return Component;]]> 1 - + false @@ -36127,7 +36168,7 @@ return Component;]]> - + false @@ -36168,7 +36209,7 @@ return Component;]]> - + false @@ -36207,7 +36248,7 @@ return Component;]]> false 1 - + true @@ -36262,7 +36303,7 @@ return Component;]]> 1 - + false @@ -36303,7 +36344,7 @@ return Component;]]> - + false @@ -36342,7 +36383,7 @@ return Component;]]> false 1 - + false @@ -36393,7 +36434,7 @@ return Component;]]> 1 - + false @@ -36432,7 +36473,7 @@ return Component;]]> true 1 - + false @@ -36472,7 +36513,7 @@ return Component;]]> 1 - + false @@ -36524,7 +36565,7 @@ return Component;]]> - + true @@ -36588,7 +36629,7 @@ return Component;]]> true 1 - + false @@ -36630,7 +36671,7 @@ return Component;]]> - + false @@ -36681,7 +36722,7 @@ return Component;]]> 1 - + false @@ -36720,7 +36761,7 @@ return Component;]]> false 1 - + false @@ -36771,7 +36812,7 @@ return Component;]]> 1 - + false @@ -36810,7 +36851,7 @@ return Component;]]> true 1 - + false @@ -36871,7 +36912,7 @@ return Component;]]> 1 - + false @@ -36911,7 +36952,7 @@ return Component;]]> 1 - + true @@ -36966,7 +37007,7 @@ return Component;]]> - + false @@ -37005,7 +37046,7 @@ return Component;]]> true 1 - + false @@ -37066,7 +37107,7 @@ return Component;]]> 1 - + false @@ -37106,7 +37147,7 @@ return Component;]]> 1 - + true @@ -37161,7 +37202,7 @@ return Component;]]> - + false @@ -37200,7 +37241,7 @@ return Component;]]> true 1 - + false @@ -37261,7 +37302,7 @@ return Component;]]> 1 - + false @@ -37301,7 +37342,7 @@ return Component;]]> 1 - + true @@ -37358,7 +37399,7 @@ return Component;]]> - + true @@ -37397,7 +37438,7 @@ return Component;]]> true 1 - + false @@ -37436,7 +37477,7 @@ return Component;]]> true 1 - + false @@ -37487,7 +37528,7 @@ return Component;]]> 1 - + false @@ -37528,7 +37569,7 @@ return Component;]]> - + false @@ -37567,7 +37608,7 @@ return Component;]]> false 1 - + false @@ -37606,7 +37647,7 @@ return Component;]]> true 1 - + false @@ -37645,7 +37686,7 @@ return Component;]]> true 1 - + false @@ -37706,7 +37747,7 @@ return Component;]]> 1 - + true @@ -37761,7 +37802,7 @@ return Component;]]> - + false @@ -37800,7 +37841,7 @@ return Component;]]> true 1 - + true @@ -37854,7 +37895,7 @@ return Component;]]> 2 - + false @@ -37916,7 +37957,7 @@ return Component;]]> - + false @@ -37955,7 +37996,7 @@ return Component;]]> true 1 - + true @@ -38009,7 +38050,7 @@ return Component;]]> 2 - + false @@ -38071,7 +38112,7 @@ return Component;]]> - + false @@ -38123,7 +38164,7 @@ return Component;]]> - + false @@ -38174,7 +38215,7 @@ return Component;]]> 1 - + false @@ -38215,7 +38256,7 @@ return Component;]]> - + false @@ -38254,7 +38295,7 @@ return Component;]]> true 1 - + false @@ -38293,7 +38334,7 @@ return Component;]]> true 1 - + false @@ -38345,7 +38386,7 @@ return Component;]]> - + false @@ -38384,7 +38425,7 @@ return Component;]]> true 1 - + false @@ -38445,7 +38486,7 @@ return Component;]]> 1 - + true @@ -38499,7 +38540,7 @@ return Component;]]> 2 - + false @@ -38541,7 +38582,7 @@ return Component;]]> - + false @@ -38580,7 +38621,7 @@ return Component;]]> true 1 - + false @@ -38631,7 +38672,7 @@ return Component;]]> 1 - + false @@ -38682,7 +38723,7 @@ return Component;]]> 1 - + false @@ -38723,7 +38764,7 @@ return Component;]]> - + false @@ -38762,7 +38803,7 @@ return Component;]]> true 1 - + false @@ -38801,7 +38842,7 @@ return Component;]]> true 1 - + false @@ -38853,7 +38894,7 @@ return Component;]]> - + false @@ -38892,7 +38933,7 @@ return Component;]]> true 1 - + false @@ -38943,7 +38984,7 @@ return Component;]]> 2 - + false @@ -39004,7 +39045,7 @@ return Component;]]> 1 - + true @@ -39059,7 +39100,7 @@ return Component;]]> 2 - + false @@ -39100,7 +39141,7 @@ return Component;]]> - + false @@ -39139,7 +39180,7 @@ return Component;]]> true 1 - + false @@ -39190,7 +39231,7 @@ return Component;]]> 2 - + false @@ -39251,7 +39292,7 @@ return Component;]]> 1 - + true @@ -39306,7 +39347,7 @@ return Component;]]> 2 - + false @@ -39347,7 +39388,7 @@ return Component;]]> - + false @@ -39386,7 +39427,7 @@ return Component;]]> true 1 - + false @@ -39437,7 +39478,7 @@ return Component;]]> 2 - + false @@ -39498,7 +39539,7 @@ return Component;]]> 1 - + true @@ -39553,7 +39594,7 @@ return Component;]]> 2 - + false @@ -39596,7 +39637,7 @@ return Component;]]> - + true @@ -39635,7 +39676,7 @@ return Component;]]> true 1 - + false @@ -39674,7 +39715,7 @@ return Component;]]> true 1 - + false @@ -39714,7 +39755,7 @@ return Component;]]> 1 - + false @@ -39765,7 +39806,7 @@ return Component;]]> 1 - + false @@ -39817,7 +39858,7 @@ return Component;]]> - + false @@ -39856,7 +39897,7 @@ return Component;]]> true 1 - + false @@ -39907,7 +39948,7 @@ return Component;]]> 1 - + true @@ -39961,7 +40002,7 @@ return Component;]]> true 1 - + false @@ -40022,7 +40063,7 @@ return Component;]]> 3 - + true @@ -40076,7 +40117,7 @@ return Component;]]> false 4 - + false @@ -40128,12 +40169,12 @@ return Component;]]> - + Options - + false @@ -40173,7 +40214,7 @@ return Component;]]> 1 - + false @@ -40224,7 +40265,7 @@ return Component;]]> 3 - + [Component] @@ -40310,7 +40351,7 @@ return Component;]]> - + false @@ -40349,7 +40390,7 @@ return Component;]]> true 1 - + false @@ -40389,7 +40430,7 @@ return Component;]]> 1 - + false @@ -40442,7 +40483,7 @@ return Component;]]> - + true @@ -40481,7 +40522,7 @@ return Component;]]> true 1 - + false @@ -40520,7 +40561,7 @@ return Component;]]> true 1 - + false @@ -40560,7 +40601,7 @@ return Component;]]> 1 - + false @@ -40611,7 +40652,7 @@ return Component;]]> 1 - + false @@ -40663,7 +40704,7 @@ return Component;]]> - + false @@ -40703,7 +40744,7 @@ return Component;]]> 1 - + true @@ -40757,7 +40798,7 @@ return Component;]]> true 1 - + false @@ -40807,7 +40848,7 @@ return Component;]]> false 1 - + false @@ -40850,7 +40891,7 @@ return Component;]]> - + true @@ -40889,7 +40930,7 @@ return Component;]]> true 1 - + false @@ -40928,7 +40969,7 @@ return Component;]]> true 1 - + false @@ -40967,7 +41008,7 @@ return Component;]]> true 1 - + false @@ -41007,7 +41048,7 @@ return Component;]]> 1 - + true @@ -41062,7 +41103,7 @@ return Component;]]> 2 - + false @@ -41123,7 +41164,7 @@ return Component;]]> 1 - + false @@ -41175,7 +41216,7 @@ return Component;]]> - + false @@ -41214,7 +41255,7 @@ return Component;]]> true 1 - + false @@ -41254,7 +41295,7 @@ return Component;]]> 1 - + true @@ -41309,7 +41350,7 @@ return Component;]]> 2 - + false @@ -41370,7 +41411,7 @@ return Component;]]> 1 - + false @@ -41422,7 +41463,7 @@ return Component;]]> - + false @@ -41461,7 +41502,7 @@ return Component;]]> true 1 - + false @@ -41514,7 +41555,7 @@ return Component;]]> - + false @@ -41553,7 +41594,7 @@ return Component;]]> true 1 - + false @@ -41593,7 +41634,7 @@ return Component;]]> 1 - + false @@ -41644,7 +41685,7 @@ return Component;]]> 1 - + false @@ -41696,7 +41737,7 @@ return Component;]]> - + false @@ -41735,7 +41776,7 @@ return Component;]]> true 1 - + false @@ -41774,7 +41815,7 @@ return Component;]]> true 1 - + false @@ -41814,7 +41855,7 @@ return Component;]]> 1 - + true @@ -41868,7 +41909,7 @@ return Component;]]> 2 - + false @@ -41930,7 +41971,7 @@ return Component;]]> - + false @@ -41969,7 +42010,7 @@ return Component;]]> true 1 - + false @@ -42022,7 +42063,7 @@ return Component;]]> - + false @@ -42061,7 +42102,7 @@ return Component;]]> false 1 - + false @@ -42101,7 +42142,7 @@ return Component;]]> 1 - + false @@ -42152,7 +42193,7 @@ return Component;]]> 1 - + false @@ -42191,7 +42232,7 @@ return Component;]]> true 1 - + false @@ -42242,7 +42283,7 @@ return Component;]]> 1 - + false @@ -42281,7 +42322,7 @@ return Component;]]> true 1 - + true @@ -42335,7 +42376,7 @@ return Component;]]> 2 - + false @@ -42397,7 +42438,7 @@ return Component;]]> - + false @@ -42436,7 +42477,7 @@ return Component;]]> true 1 - + true @@ -42490,7 +42531,7 @@ return Component;]]> 2 - + false @@ -42552,7 +42593,7 @@ return Component;]]> - + false @@ -42591,7 +42632,7 @@ return Component;]]> true 1 - + true @@ -42645,7 +42686,7 @@ return Component;]]> 2 - + false @@ -42709,7 +42750,7 @@ return Component;]]> - + false @@ -42748,7 +42789,7 @@ return Component;]]> true 1 - + false @@ -42788,7 +42829,7 @@ return Component;]]> 1 - + false @@ -42841,7 +42882,7 @@ return Component;]]> - + true @@ -42880,7 +42921,7 @@ return Component;]]> true 1 - + false @@ -42919,7 +42960,7 @@ return Component;]]> true 1 - + false @@ -42958,7 +42999,7 @@ return Component;]]> true 1 - + false @@ -42998,7 +43039,7 @@ return Component;]]> 1 - + true @@ -43053,7 +43094,7 @@ return Component;]]> 2 - + false @@ -43114,7 +43155,7 @@ return Component;]]> 1 - + false @@ -43166,7 +43207,7 @@ return Component;]]> - + false @@ -43205,7 +43246,7 @@ return Component;]]> true 1 - + false @@ -43245,7 +43286,7 @@ return Component;]]> 1 - + true @@ -43300,7 +43341,7 @@ return Component;]]> 2 - + false @@ -43361,7 +43402,7 @@ return Component;]]> 1 - + false @@ -43413,7 +43454,7 @@ return Component;]]> - + false @@ -43452,7 +43493,7 @@ return Component;]]> true 1 - + false @@ -43492,7 +43533,7 @@ return Component;]]> 1 - + true @@ -43547,7 +43588,7 @@ return Component;]]> 2 - + false @@ -43608,7 +43649,7 @@ return Component;]]> 1 - + false @@ -43660,7 +43701,7 @@ return Component;]]> - + false @@ -43699,7 +43740,7 @@ return Component;]]> true 1 - + false @@ -43752,7 +43793,7 @@ return Component;]]> - + false @@ -43791,7 +43832,7 @@ return Component;]]> true 1 - + false @@ -43831,7 +43872,7 @@ return Component;]]> 1 - + false @@ -43882,7 +43923,7 @@ return Component;]]> 1 - + false @@ -43934,7 +43975,7 @@ return Component;]]> - + false @@ -43973,7 +44014,7 @@ return Component;]]> true 1 - + false @@ -44012,7 +44053,7 @@ return Component;]]> true 1 - + false @@ -44052,7 +44093,7 @@ return Component;]]> 1 - + true @@ -44106,7 +44147,7 @@ return Component;]]> 2 - + false @@ -44168,7 +44209,7 @@ return Component;]]> - + false @@ -44207,7 +44248,7 @@ return Component;]]> true 1 - + false @@ -44260,7 +44301,7 @@ return Component;]]> - + false @@ -44299,7 +44340,7 @@ return Component;]]> false 1 - + false @@ -44339,7 +44380,7 @@ return Component;]]> 1 - + false @@ -44390,7 +44431,7 @@ return Component;]]> 1 - + false @@ -44429,7 +44470,7 @@ return Component;]]> true 1 - + false @@ -44480,7 +44521,7 @@ return Component;]]> 1 - + false @@ -44519,7 +44560,7 @@ return Component;]]> true 1 - + true @@ -44573,7 +44614,7 @@ return Component;]]> 2 - + false @@ -44635,7 +44676,7 @@ return Component;]]> - + false @@ -44674,7 +44715,7 @@ return Component;]]> true 1 - + true @@ -44728,7 +44769,7 @@ return Component;]]> 2 - + false @@ -44790,7 +44831,7 @@ return Component;]]> - + false @@ -44829,7 +44870,7 @@ return Component;]]> true 1 - + true @@ -44883,7 +44924,7 @@ return Component;]]> 2 - + false @@ -44947,7 +44988,7 @@ return Component;]]> - + false @@ -44986,7 +45027,7 @@ return Component;]]> true 1 - + false @@ -45026,7 +45067,7 @@ return Component;]]> 1 - + false @@ -45079,7 +45120,7 @@ return Component;]]> - + true @@ -45118,7 +45159,7 @@ return Component;]]> true 1 - + false @@ -45157,7 +45198,7 @@ return Component;]]> true 1 - + false @@ -45197,7 +45238,7 @@ return Component;]]> 1 - + false @@ -45248,7 +45289,7 @@ return Component;]]> 1 - + false @@ -45300,7 +45341,7 @@ return Component;]]> - + false @@ -45339,7 +45380,7 @@ return Component;]]> true 1 - + false @@ -45390,7 +45431,7 @@ return Component;]]> 1 - + true @@ -45444,7 +45485,7 @@ return Component;]]> true 1 - + false @@ -45505,7 +45546,7 @@ return Component;]]> 3 - + true @@ -45559,7 +45600,7 @@ return Component;]]> false 4 - + false @@ -45611,12 +45652,12 @@ return Component;]]> - + Options - + false @@ -45656,7 +45697,7 @@ return Component;]]> 1 - + false @@ -45707,7 +45748,7 @@ return Component;]]> 3 - + [Component] @@ -45793,7 +45834,7 @@ return Component;]]> - + false @@ -45832,7 +45873,7 @@ return Component;]]> true 1 - + false @@ -45883,7 +45924,7 @@ return Component;]]> 1 - + true @@ -45937,7 +45978,7 @@ return Component;]]> true 1 - + false @@ -45998,7 +46039,7 @@ return Component;]]> 3 - + true @@ -46052,7 +46093,7 @@ return Component;]]> false 4 - + false @@ -46104,12 +46145,12 @@ return Component;]]> - + Options - + false @@ -46149,7 +46190,7 @@ return Component;]]> 1 - + false @@ -46200,7 +46241,7 @@ return Component;]]> 3 - + [Component] @@ -46286,7 +46327,7 @@ return Component;]]> - + false @@ -46325,7 +46366,7 @@ return Component;]]> true 1 - + false @@ -46365,7 +46406,7 @@ return Component;]]> 1 - + false @@ -46418,7 +46459,7 @@ return Component;]]> - + true @@ -46457,7 +46498,7 @@ return Component;]]> true 1 - + false @@ -46496,7 +46537,7 @@ return Component;]]> true 1 - + false @@ -46536,7 +46577,7 @@ return Component;]]> 1 - + false @@ -46587,7 +46628,7 @@ return Component;]]> 1 - + false @@ -46639,7 +46680,7 @@ return Component;]]> - + false @@ -46678,7 +46719,7 @@ return Component;]]> true 1 - + false @@ -46729,7 +46770,7 @@ return Component;]]> 1 - + true @@ -46783,7 +46824,7 @@ return Component;]]> true 1 - + false @@ -46844,7 +46885,7 @@ return Component;]]> 3 - + true @@ -46898,7 +46939,7 @@ return Component;]]> false 4 - + false @@ -46950,12 +46991,12 @@ return Component;]]> - + Options - + false @@ -46995,7 +47036,7 @@ return Component;]]> 1 - + false @@ -47046,7 +47087,7 @@ return Component;]]> 3 - + [Component] @@ -47132,7 +47173,7 @@ return Component;]]> - + false @@ -47171,7 +47212,7 @@ return Component;]]> false 1 - + false @@ -47222,7 +47263,7 @@ return Component;]]> 1 - + false @@ -47261,7 +47302,7 @@ return Component;]]> true 1 - + false @@ -47322,7 +47363,7 @@ return Component;]]> 1 - + false @@ -47362,7 +47403,7 @@ return Component;]]> 1 - + true @@ -47417,7 +47458,7 @@ return Component;]]> - + false @@ -47456,7 +47497,7 @@ return Component;]]> true 1 - + false @@ -47517,7 +47558,7 @@ return Component;]]> 1 - + false @@ -47557,7 +47598,7 @@ return Component;]]> 1 - + true @@ -47613,7 +47654,7 @@ return Component;]]> - + false @@ -47653,7 +47694,7 @@ return Component;]]> 1 - + false @@ -47692,7 +47733,7 @@ return Component;]]> true 1 - + false @@ -47743,7 +47784,7 @@ return Component;]]> 1 - + false @@ -47782,7 +47823,7 @@ return Component;]]> true 1 - + false @@ -47843,7 +47884,7 @@ return Component;]]> 1 - + false @@ -47883,7 +47924,7 @@ return Component;]]> 1 - + true @@ -47939,7 +47980,7 @@ return Component;]]> - + false @@ -47978,7 +48019,7 @@ return Component;]]> true 1 - + false @@ -48029,7 +48070,7 @@ return Component;]]> 1 - + false @@ -48068,7 +48109,7 @@ return Component;]]> true 1 - + false @@ -48108,7 +48149,7 @@ return Component;]]> 1 - + true @@ -48163,7 +48204,7 @@ return Component;]]> 2 - + false @@ -48224,7 +48265,7 @@ return Component;]]> 1 - + false @@ -48276,7 +48317,7 @@ return Component;]]> - + false @@ -48315,7 +48356,7 @@ return Component;]]> true 1 - + true @@ -48370,7 +48411,7 @@ return Component;]]> 2 - + false @@ -48431,7 +48472,7 @@ return Component;]]> 1 - + false @@ -48482,7 +48523,7 @@ return Component;]]> 1 - + false @@ -48524,7 +48565,7 @@ return Component;]]> - + false @@ -48563,7 +48604,7 @@ return Component;]]> true 1 - + false @@ -48614,7 +48655,7 @@ return Component;]]> 1 - + false @@ -48653,7 +48694,7 @@ return Component;]]> true 1 - + false @@ -48693,7 +48734,7 @@ return Component;]]> 1 - + false @@ -48733,7 +48774,7 @@ return Component;]]> 1 - + false @@ -48774,7 +48815,7 @@ return Component;]]> - + false @@ -48814,7 +48855,7 @@ return Component;]]> 1 - + true @@ -48869,7 +48910,7 @@ return Component;]]> - + false @@ -48908,7 +48949,7 @@ return Component;]]> false 1 - + true @@ -48963,7 +49004,7 @@ return Component;]]> 1 - + false @@ -49004,7 +49045,7 @@ return Component;]]> - + false @@ -49043,7 +49084,7 @@ return Component;]]> true 1 - + true @@ -49098,7 +49139,7 @@ return Component;]]> 1 - + false @@ -49139,7 +49180,7 @@ return Component;]]> - + false @@ -49191,7 +49232,7 @@ return Component;]]> - + true @@ -49230,7 +49271,7 @@ return Component;]]> true 1 - + false @@ -49269,7 +49310,7 @@ return Component;]]> true 1 - + false @@ -49309,7 +49350,7 @@ return Component;]]> 1 - + false @@ -49360,7 +49401,7 @@ return Component;]]> 1 - + false @@ -49412,7 +49453,7 @@ return Component;]]> - + false @@ -49451,7 +49492,7 @@ return Component;]]> true 1 - + true @@ -49505,7 +49546,7 @@ return Component;]]> true 1 - + false @@ -49546,7 +49587,7 @@ return Component;]]> - + true @@ -49600,7 +49641,7 @@ return Component;]]> true 1 - + false @@ -49642,7 +49683,7 @@ return Component;]]> - + false @@ -49681,7 +49722,7 @@ return Component;]]> true 1 - + false @@ -49721,7 +49762,7 @@ return Component;]]> 1 - + false @@ -49774,7 +49815,7 @@ return Component;]]> - + true @@ -49813,7 +49854,7 @@ return Component;]]> false 1 - + false @@ -49852,7 +49893,7 @@ return Component;]]> false 1 - + false @@ -49903,7 +49944,7 @@ return Component;]]> 1 - + false @@ -49954,7 +49995,7 @@ return Component;]]> 1 - + false @@ -49993,7 +50034,7 @@ return Component;]]> true 1 - + false @@ -50033,7 +50074,7 @@ return Component;]]> 1 - + false @@ -50073,7 +50114,7 @@ return Component;]]> 1 - + false @@ -50113,7 +50154,7 @@ return Component;]]> 1 - + false @@ -50153,7 +50194,7 @@ return Component;]]> 1 - + false @@ -50195,7 +50236,7 @@ return Component;]]> - + false @@ -50234,7 +50275,7 @@ return Component;]]> false 1 - + false @@ -50285,7 +50326,7 @@ return Component;]]> 1 - + false @@ -50324,7 +50365,7 @@ return Component;]]> true 1 - + false @@ -50364,7 +50405,7 @@ return Component;]]> 1 - + false @@ -50404,7 +50445,7 @@ return Component;]]> 1 - + false @@ -50444,7 +50485,7 @@ return Component;]]> 1 - + false @@ -50484,7 +50525,7 @@ return Component;]]> 1 - + false @@ -50526,7 +50567,7 @@ return Component;]]> - + false @@ -50565,7 +50606,7 @@ return Component;]]> false 1 - + true @@ -50620,7 +50661,7 @@ return Component;]]> 1 - + false @@ -50661,7 +50702,7 @@ return Component;]]> - + false @@ -50700,7 +50741,7 @@ return Component;]]> true 1 - + false @@ -50739,7 +50780,7 @@ return Component;]]> true 1 - + false @@ -50779,7 +50820,7 @@ return Component;]]> 1 - + false @@ -50819,7 +50860,7 @@ return Component;]]> 1 - + false @@ -50859,7 +50900,7 @@ return Component;]]> 1 - + false @@ -50899,7 +50940,7 @@ return Component;]]> 1 - + false @@ -50940,7 +50981,7 @@ return Component;]]> - + false @@ -50991,7 +51032,7 @@ return Component;]]> 1 - + false @@ -51030,7 +51071,7 @@ return Component;]]> true 1 - + false @@ -51070,7 +51111,7 @@ return Component;]]> 1 - + false @@ -51110,7 +51151,7 @@ return Component;]]> 1 - + false @@ -51150,7 +51191,7 @@ return Component;]]> 1 - + false @@ -51190,7 +51231,7 @@ return Component;]]> 1 - + false @@ -51231,7 +51272,7 @@ return Component;]]> - + true @@ -51285,7 +51326,7 @@ return Component;]]> true 1 - + false @@ -51327,7 +51368,7 @@ return Component;]]> - + [Component] @@ -51404,7 +51445,7 @@ return Component;]]> - + false @@ -51443,7 +51484,7 @@ return Component;]]> false 1 - + false @@ -51482,7 +51523,7 @@ return Component;]]> false 1 - + false @@ -51522,7 +51563,7 @@ return Component;]]> 1 - + true @@ -51577,7 +51618,7 @@ return Component;]]> 1 - + true @@ -51632,7 +51673,7 @@ return Component;]]> 1 - + false @@ -51672,7 +51713,7 @@ return Component;]]> 1 - + false @@ -51711,7 +51752,7 @@ return Component;]]> true 1 - + false @@ -51762,14 +51803,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -51808,7 +51849,7 @@ return Component;]]> false 1 - + false @@ -51859,13 +51900,13 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -51917,7 +51958,7 @@ return Component;]]> - + [Component] @@ -51971,7 +52012,7 @@ return Component;]]> - + false @@ -52010,7 +52051,7 @@ return Component;]]> false 1 - + false @@ -52050,7 +52091,7 @@ return Component;]]> 1 - + true @@ -52105,7 +52146,7 @@ return Component;]]> 1 - + true @@ -52160,7 +52201,7 @@ return Component;]]> 1 - + false @@ -52200,7 +52241,7 @@ return Component;]]> 1 - + false @@ -52239,7 +52280,7 @@ return Component;]]> true 1 - + false @@ -52290,14 +52331,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -52336,7 +52377,7 @@ return Component;]]> false 1 - + false @@ -52387,14 +52428,14 @@ return Component;]]> 1 - + NotificationSize 80 - + [Component] @@ -52448,7 +52489,7 @@ return Component;]]> - + false @@ -52487,7 +52528,7 @@ return Component;]]> false 1 - + false @@ -52527,7 +52568,7 @@ return Component;]]> 1 - + true @@ -52582,7 +52623,7 @@ return Component;]]> 1 - + true @@ -52637,7 +52678,7 @@ return Component;]]> 1 - + false @@ -52677,7 +52718,7 @@ return Component;]]> 1 - + false @@ -52716,7 +52757,7 @@ return Component;]]> true 1 - + false @@ -52767,14 +52808,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52813,7 +52854,7 @@ return Component;]]> false 1 - + false @@ -52864,7 +52905,7 @@ return Component;]]> 1 - + false @@ -52915,14 +52956,14 @@ return Component;]]> 1 - + NotificationSize 110 - + [Component] @@ -52976,7 +53017,7 @@ return Component;]]> - + 1 1 @@ -52989,7 +53030,7 @@ return Component;]]> 0 - + [Component] @@ -53049,7 +53090,7 @@ return Component;]]> - + false @@ -53088,7 +53129,7 @@ return Component;]]> true 1 - + false @@ -53127,7 +53168,7 @@ return Component;]]> true 3 - + false @@ -53167,7 +53208,7 @@ return Component;]]> 3 - + false @@ -53209,7 +53250,7 @@ return Component;]]> - + false @@ -53248,7 +53289,7 @@ return Component;]]> true 1 - + false @@ -53288,7 +53329,7 @@ return Component;]]> 1 - + false @@ -53329,7 +53370,7 @@ return Component;]]> - + false @@ -53368,7 +53409,7 @@ return Component;]]> true 1 - + false @@ -53408,7 +53449,7 @@ return Component;]]> 2 - + false @@ -53447,7 +53488,7 @@ return Component;]]> true 3 - + false @@ -53487,7 +53528,7 @@ return Component;]]> 3 - + false @@ -53529,7 +53570,7 @@ return Component;]]> - + true @@ -53568,7 +53609,7 @@ return Component;]]> true 1 - + false @@ -53607,7 +53648,7 @@ return Component;]]> true 1 - + false @@ -53658,7 +53699,7 @@ return Component;]]> 1 - + true @@ -53722,7 +53763,7 @@ return Component;]]> true 1 - + false @@ -53772,7 +53813,7 @@ return Component;]]> false 10 - + [Component] @@ -53831,7 +53872,7 @@ return Component.Start();]]> - + false @@ -53872,7 +53913,7 @@ return Component.Start();]]> - + false @@ -53912,7 +53953,7 @@ return Component.Start();]]> 1 - + false @@ -53952,7 +53993,7 @@ return Component.Start();]]> 1 - + false @@ -53991,7 +54032,7 @@ return Component.Start();]]> false 1 - + false @@ -54030,7 +54071,7 @@ return Component.Start();]]> true 1 - + false @@ -54070,7 +54111,7 @@ return Component.Start();]]> 1 - + false @@ -54110,7 +54151,7 @@ return Component.Start();]]> 1 - + false @@ -54150,7 +54191,7 @@ return Component.Start();]]> 1 - + false @@ -54190,7 +54231,7 @@ return Component.Start();]]> 1 - + false @@ -54231,7 +54272,7 @@ return Component.Start();]]> - + false @@ -54284,7 +54325,7 @@ return Component.Start();]]> true 1 - + false @@ -54323,7 +54364,7 @@ return Component.Start();]]> true 1 - + false @@ -54363,7 +54404,7 @@ return Component.Start();]]> 1 - + false @@ -54403,7 +54444,7 @@ return Component.Start();]]> 1 - + false @@ -54443,7 +54484,7 @@ return Component.Start();]]> 1 - + false @@ -54483,7 +54524,7 @@ return Component.Start();]]> 1 - + false @@ -54524,7 +54565,7 @@ return Component.Start();]]> - + false @@ -54563,7 +54604,7 @@ return Component.Start();]]> true 1 - + false @@ -54618,7 +54659,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54670,7 +54711,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54709,7 +54750,7 @@ roblox.com/library/142485815/import]]> true 1 - + false @@ -54766,7 +54807,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54818,7 +54859,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54869,7 +54910,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54922,7 +54963,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54972,7 +55013,7 @@ roblox.com/library/142485815/import]]> false 10 - + [Component] @@ -55035,7 +55076,7 @@ return Component;]]> - + true @@ -55100,7 +55141,7 @@ return Component;]]> 1 - + true @@ -55164,7 +55205,7 @@ return Component;]]> false 1 - + false @@ -55216,7 +55257,7 @@ return Component;]]> - + false @@ -55255,7 +55296,7 @@ return Component;]]> true 1 - + false @@ -55294,7 +55335,7 @@ return Component;]]> false 1 - + false @@ -55333,7 +55374,7 @@ return Component;]]> true 1 - + false @@ -55373,7 +55414,7 @@ return Component;]]> 1 - + false @@ -55426,7 +55467,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -55479,7 +55520,7 @@ TIP: Press R while hovering over a part to copy its color.]]> - + false @@ -55518,7 +55559,7 @@ TIP: Press R while hovering over a part to copy its color.]]> false 1 - + false @@ -55557,7 +55598,7 @@ TIP: Press R while hovering over a part to copy its color.]]> true 1 - + false @@ -55597,7 +55638,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -55650,7 +55691,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55703,7 +55744,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55742,7 +55783,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55781,7 +55822,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55821,7 +55862,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55872,7 +55913,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55925,7 +55966,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55964,7 +56005,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -56003,7 +56044,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -56043,7 +56084,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -56096,7 +56137,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -56149,7 +56190,7 @@ TIP: Press Enter to toggle anchor quickly.]]> - + false @@ -56188,7 +56229,7 @@ TIP: Press Enter to toggle anchor quickly.]]> false 1 - + false @@ -56227,7 +56268,7 @@ TIP: Press Enter to toggle anchor quickly.]]> true 1 - + false @@ -56267,7 +56308,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -56320,7 +56361,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -56373,7 +56414,7 @@ TIP: Click and drag where you want your part to be.]]> - + false @@ -56412,7 +56453,7 @@ TIP: Click and drag where you want your part to be.]]> false 1 - + false @@ -56451,7 +56492,7 @@ TIP: Click and drag where you want your part to be.]]> true 1 - + false @@ -56491,7 +56532,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -56546,7 +56587,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56599,7 +56640,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di - + false @@ -56638,7 +56679,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di false 1 - + false @@ -56677,7 +56718,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di true 1 - + false @@ -56717,7 +56758,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56774,7 +56815,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56827,7 +56868,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]> - + false @@ -56866,7 +56907,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>false 1 - + false @@ -56905,7 +56946,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>true 1 - + false @@ -56945,7 +56986,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56998,7 +57039,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57051,7 +57092,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -57090,7 +57131,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -57129,7 +57170,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -57169,7 +57210,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57220,7 +57261,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57273,7 +57314,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -57312,7 +57353,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -57351,7 +57392,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -57391,7 +57432,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57446,7 +57487,7 @@ NOTE: This tool does not work in Roblox Studio.]]> 1 - + false @@ -57499,7 +57540,7 @@ NOTE: This tool does not work in Roblox Studio.]]> - + false @@ -57538,7 +57579,7 @@ NOTE: This tool does not work in Roblox Studio.]]> false 1 - + false @@ -57577,7 +57618,7 @@ NOTE: This tool does not work in Roblox Studio.]]> true 1 - + false @@ -57617,7 +57658,7 @@ NOTE: This tool does not work in Roblox Studio.]]> 1 - + false @@ -57670,7 +57711,7 @@ TIP: Press Enter to toggle collision quickly.]]> 1 - + false @@ -57723,7 +57764,7 @@ TIP: Press Enter to toggle collision quickly.]]> - + false @@ -57762,7 +57803,7 @@ TIP: Press Enter to toggle collision quickly.]]> false 1 - + false @@ -57815,7 +57856,7 @@ TIP: Press Enter to toggle collision quickly.]]> true 1 - + false @@ -57854,7 +57895,7 @@ TIP: Press Enter to toggle collision quickly.]]> true 1 - + false @@ -57894,7 +57935,7 @@ TIP: Press Enter to toggle collision quickly.]]> 1 - + false @@ -57949,7 +57990,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58000,7 +58041,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58051,7 +58092,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58103,7 +58144,7 @@ LAST - Relative to the last part selected]]> - + false @@ -58143,7 +58184,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58182,7 +58223,7 @@ LAST - Relative to the last part selected]]> true 1 - + false @@ -58245,7 +58286,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -58297,7 +58338,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -58348,7 +58389,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -58401,7 +58442,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -58440,7 +58481,7 @@ TIP: Hit the - key to quickly type increments.]]> false 1 - + false @@ -58493,7 +58534,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -58533,7 +58574,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -58572,7 +58613,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -58635,7 +58676,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -58687,7 +58728,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen - + false @@ -58726,7 +58767,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen true 1 - + false @@ -58766,7 +58807,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -58821,7 +58862,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58872,7 +58913,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58923,7 +58964,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58975,7 +59016,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -59026,7 +59067,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59079,7 +59120,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -59118,7 +59159,7 @@ LAST - Each part around the center of the last part selected]]> false 1 - + false @@ -59171,7 +59212,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -59211,7 +59252,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59250,7 +59291,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -59303,7 +59344,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -59355,7 +59396,7 @@ TIP: Click on a part to focus the handles on it.]]> - + false @@ -59394,7 +59435,7 @@ TIP: Click on a part to focus the handles on it.]]> true 1 - + false @@ -59445,7 +59486,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -59509,7 +59550,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -59560,7 +59601,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -59613,7 +59654,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + [Component] @@ -59774,7 +59815,7 @@ return Component;]]> - + [Component] @@ -59917,18 +59958,18 @@ return Component;]]> - + AutoUpdate true - + false AutomaticUpdating - {18DFFE9D-CCB2-4626-BDB2-C58584518AB8} + {8C0AAE61-43D9-4E49-9DF7-C52371E6485E} 0 then end;]]> - + -9.0008564 @@ -60022,7 +60063,7 @@ end;]]> 1 ThumbnailCamera - + true -0.5 @@ -60093,7 +60134,7 @@ end;]]> 0.200000003 - + true null @@ -60108,7 +60149,7 @@ end;]]> 0 0 - + false @@ -60170,12 +60211,12 @@ end;]]> - + false ThumbnailClearer - {7149C99B-E27D-452D-8D02-BE14FEEDF2C5} + {03B14B3E-22C8-41A9-A164-25C245235B1E} script.Parent:Destroy(); diff --git a/build/Building Tools by F3X.rbxmx b/build/Building Tools by F3X.rbxmx index d7c8795..ab67926 100644 --- a/build/Building Tools by F3X.rbxmx +++ b/build/Building Tools by F3X.rbxmx @@ -1,7 +1,7 @@ null nil - + true true @@ -25,7 +25,7 @@ Building Tools by F3X - + false -0.5 @@ -96,7 +96,7 @@ 0.800000012 - + 4294967295 5 @@ -105,7 +105,7 @@ 0 - + 4294967295 2 @@ -114,7 +114,7 @@ 0 - + 4294967295 3 @@ -123,7 +123,7 @@ 0 - + 4294967295 0 @@ -132,7 +132,7 @@ 0 - + 4294967295 1 @@ -141,7 +141,7 @@ 0 - + 4294967295 4 @@ -151,13 +151,13 @@ - + Version - 2.0.4 + 2.1.0 - + SupportLibrary @@ -934,7 +934,7 @@ end; return SupportLibrary;]]> - + SecurityModule @@ -1260,7 +1260,7 @@ end; return Security;]]> - + Region by AxisAngle @@ -1676,7 +1676,7 @@ end return Region]]> - + false @@ -1838,7 +1838,7 @@ end; -- Expose GetLibraries function _G.GetLibraries = GetLibraries;]]> - + F3X/SupportLibrary@1.0.0 @@ -2614,7 +2614,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -2631,7 +2631,7 @@ return SupportLibrary;]]> - + F3X/Cheer@0.0.1 @@ -3485,7 +3485,7 @@ setmetatable(Cheer, { return Cheer;]]> - + SupportLibrary @@ -4262,7 +4262,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -4279,7 +4279,7 @@ return SupportLibrary;]]> - + F3X/Try@1.0.0 @@ -4476,7 +4476,7 @@ end; return Try;]]> - + SupportLibrary @@ -5252,7 +5252,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -5270,7 +5270,7 @@ return SupportLibrary;]]> - + SerializationModule @@ -5719,11 +5719,11 @@ end; return Serialization;]]> - + SyncAPI - + SyncModule @@ -7234,7 +7234,7 @@ return { };]]> - + false @@ -7264,11 +7264,11 @@ SyncAPI.OnInvoke = function (...) end;]]> - + ServerEndpoint - + false @@ -7289,17 +7289,17 @@ end;]]> - + Loaded false - + ComponentCount 0 - + false @@ -7317,7 +7317,7 @@ Count.Value = Support.GetDescendantCount(Tool) - ThumbnailDescendantCount;]]>

- + false @@ -7342,7 +7342,7 @@ Indicator.Value = true;]]> - + Assets @@ -7389,7 +7389,7 @@ Indicator.Value = true;]]> return Assets;]]> - + Core @@ -7727,6 +7727,9 @@ function CloneSelection() Unapply = function (HistoryRecord) -- Reverts this change + -- Deselect the clones + Selection.Remove(HistoryRecord.Clones, false); + -- Remove the clones SyncAPI:Invoke('Remove', HistoryRecord.Clones); @@ -7796,6 +7799,9 @@ function DeleteSelection() Apply = function (HistoryRecord) -- Applies this change + -- Deselect the parts + Selection.Remove(HistoryRecord.Parts, false); + -- Remove the parts SyncAPI:Invoke('Remove', HistoryRecord.Parts); @@ -7803,8 +7809,11 @@ function DeleteSelection() }; + -- Deselect parts before deleting + Selection.Remove(HistoryRecord.Parts, false); + -- Perform the removal - SyncAPI:Invoke('Remove', Selection.Items); + SyncAPI:Invoke('Remove', HistoryRecord.Parts); -- Register the history record History.Add(HistoryRecord); @@ -7854,7 +7863,7 @@ function PrismSelect() for _, Part in pairs(Selection.Items) do local TouchingParts = Part:GetTouchingParts(); for _, TouchingPart in pairs(TouchingParts) do - if not Selection.Find(TouchingPart) then + if not Selection.IsSelected(TouchingPart) then Parts[TouchingPart] = true; end; end; @@ -8063,7 +8072,7 @@ InitializeUI(); return getfenv(0);]]> - + false @@ -8088,11 +8097,11 @@ local Core = require(Tool:WaitForChild 'Core'); require(Tool.Tools.CoreToolLoader);]]> - + Tools - + MoveTool @@ -8164,6 +8173,19 @@ function ClearConnections() end; +function ClearConnection(ConnectionKey) + -- Clears the given specific connection + + local Connection = Connections[ConnectionKey]; + + -- Disconnect the connection if it exists + if Connections[ConnectionKey] then + Connection:disconnect(); + Connections[ConnectionKey] = nil; + end; + +end; + function ShowUI() -- Creates and reveals the UI @@ -8282,7 +8304,7 @@ function UpdateUI() local CommonY = Support.IdentifyCommonItem(YVariations); local CommonZ = Support.IdentifyCommonItem(ZVariations); - -- Shortcuts to indicators + -- Shortcuts to indicators local XIndicator = MoveTool.UI.Info.Center.X.TextBox; local YIndicator = MoveTool.UI.Info.Center.Y.TextBox; local ZIndicator = MoveTool.UI.Info.Center.Z.TextBox; @@ -8343,7 +8365,7 @@ local AxisMultipliers = { function AttachHandles(Part, Autofocus) -- Creates and attaches handles to `Part`, and optionally automatically attaches to the focused part - + -- Enable autofocus if requested and not already on if Autofocus and not Connections.AutofocusHandle then Connections.AutofocusHandle = Selection.FocusChanged:connect(function () @@ -8352,8 +8374,7 @@ function AttachHandles(Part, Autofocus) -- Disable autofocus if not requested and on elseif not Autofocus and Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; -- Just attach and show the handles if they already exist @@ -8376,7 +8397,6 @@ function AttachHandles(Part, Autofocus) -- Prepare for moving parts when the handle is clicked ------------------------------------------------------ - local InitialState = {}; local AreaPermissions; Handles.MouseButton1Down:connect(function () @@ -8398,36 +8418,6 @@ function AttachHandles(Part, Autofocus) AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); end; - ------------------------------------------------------ - -- Finalize changes to parts when the handle is let go - ------------------------------------------------------ - - Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - - -- Make sure this was button 1 being released, and dragging is ongoing - if not HandleDragging or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then - return; - end; - - -- Disable dragging - HandleDragging = false; - - -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; - - -- Make joints, restore original anchor and collision states - for _, Part in pairs(Selection.Items) do - Part:MakeJoints(); - Part.CanCollide = InitialState[Part].CanCollide; - Part.Anchored = InitialState[Part].Anchored; - end; - - -- Register the change - RegisterChange(); - - end); - end); ------------------------------------------ @@ -8462,6 +8452,32 @@ function AttachHandles(Part, Autofocus) end; +-- Finalize changes to parts when the handle is let go +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Ensure handle dragging is ongoing + if not HandleDragging then + return; + end; + + -- Disable dragging + HandleDragging = false; + + -- Clear this connection to prevent it from firing again + ClearConnection 'HandleRelease'; + + -- Make joints, restore original anchor and collision states + for _, Part in pairs(Selection.Items) do + Part:MakeJoints(); + Part.CanCollide = InitialState[Part].CanCollide; + Part.Anchored = InitialState[Part].Anchored; + end; + + -- Register the change + RegisterChange(); + +end); + function HideHandles() -- Hides the resizing handles @@ -8474,11 +8490,8 @@ function HideHandles() Handles.Visible = false; Handles.Parent = nil; - -- Disable handle autofocus if enabled - if Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; - end; + -- Disable handle autofocus + ClearConnection 'AutofocusHandle'; end; @@ -8737,7 +8750,7 @@ function TrackChange() Parts = Support.CloneTable(Selection.Items); BeforeCFrame = {}; AfterCFrame = {}; - + Unapply = function (Record) -- Reverts this change @@ -8822,7 +8835,7 @@ function EnableDragging() end; -- Select the target if it's not selected - if not Selection.Find(Core.Mouse.Target) then + if not Selection.IsSelected(Core.Mouse.Target) then Selection.Replace({ Core.Mouse.Target }, true); end; @@ -8840,7 +8853,7 @@ function EnableDragging() SetUpDragging(DragStartTarget, SnapTracking.Enabled and SnappedPoint or nil); -- Disable watching for potential dragging - Connections.WatchForDrag:disconnect(); + ClearConnection 'WatchForDrag'; end; @@ -8856,10 +8869,7 @@ function EnableDragging() DragStartTarget = nil; -- Disconnect dragging-start listeners - if Connections.WatchForDrag then - Connections.WatchForDrag:disconnect(); - Connections.WatchForDrag = nil; - end; + ClearConnection 'WatchForDrag'; end); @@ -9135,13 +9145,14 @@ end; function TranslatePartsRelativeToPart(BasePart, InitialState, Parts) -- Moves the given parts to BasePart's current position, with their original offset from it - for _, Part in pairs(Parts) do + -- Get focused part's position for offsetting + local RelativeTo = InitialState[BasePart].CFrame:inverse(); - -- Calculate the focused part's position - local RelativeTo = InitialState[BasePart].CFrame; + -- Calculate offset and move each part + for _, Part in pairs(Parts) do -- Calculate how far apart we should be from the focused part - local Offset = RelativeTo:toObjectSpace(InitialState[Part].CFrame); + local Offset = RelativeTo * InitialState[Part].CFrame; -- Move relative to the focused part by this part's offset from it Part.CFrame = BasePart.CFrame * Offset; @@ -9162,13 +9173,11 @@ function FinishDragging() Dragging = false; -- Stop the dragging action - Connections.Drag:disconnect() - Connections.Drag = nil; + ClearConnection 'Drag'; -- Stop, clean up snapping point tracking SnapTracking.StopTracking(); - Connections.DragSnapping:disconnect(); - Connections.DragSnapping = nil; + ClearConnection 'DragSnapping'; -- Restore the original state of each part for _, Part in pairs(Selection.Items) do @@ -9186,7 +9195,7 @@ end; return MoveTool;]]> - + ResizeTool @@ -9235,6 +9244,7 @@ function ResizeTool.Unequip() HideHandles(); ClearConnections(); SnapTracking.StopTracking(); + FinishSnapping(); end; @@ -9457,7 +9467,6 @@ function ShowHandles() -- Prepare for resizing parts when the handle is clicked -------------------------------------------------------- - local InitialState = {}; local AreaPermissions; Handles.MouseButton1Down:connect(function () @@ -9479,38 +9488,6 @@ function ShowHandles() AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); end; - ------------------------------------------------------ - -- Finalize changes to parts when the handle is let go - ------------------------------------------------------ - - Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - - -- Make sure this was button 1 being released, and handle resizing is ongoing - if not HandleResizing or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then - return; - end; - - -- Disable resizing - HandleResizing = false; - - -- Prevent selection - Core.Targeting.CancelSelecting(); - - -- Clear this connection to prevent it from firing again - ClearConnection 'HandleRelease'; - - -- Make joints, restore original anchor and collision states - for _, Part in pairs(Selection.Items) do - Part:MakeJoints(); - Part.CanCollide = InitialState[Part].CanCollide; - Part.Anchored = InitialState[Part].Anchored; - end; - - -- Register the change - RegisterChange(); - - end); - end); ------------------------------------------ @@ -9552,6 +9529,36 @@ function ShowHandles() end; + +-- Finalize changes to parts when the handle is let go +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Ensure handle resizing is ongoing + if not HandleResizing then + return; + end; + + -- Disable resizing + HandleResizing = false; + + -- Prevent selection + Core.Targeting.CancelSelecting(); + + -- Clear this connection to prevent it from firing again + ClearConnection 'HandleRelease'; + + -- Make joints, restore original anchor and collision states + for _, Part in pairs(Selection.Items) do + Part:MakeJoints(); + Part.CanCollide = InitialState[Part].CanCollide; + Part.Anchored = InitialState[Part].Anchored; + end; + + -- Register the change + RegisterChange(); + +end); + function HideHandles() -- Hides the resizing handles @@ -9949,7 +9956,7 @@ function StartSnapping() -- Only enable corner snapping SnapTracking.TrackEdgeMidpoints = false; SnapTracking.TrackFaceCentroids = false; - SnapTracking.TargetFilter = Selection.Find; + SnapTracking.TargetFilter = Selection.IsSelected; -- Trigger the PointSnapped event when a new point is snapped SnapTracking.StartTracking(function (NewPoint) @@ -10110,11 +10117,13 @@ function StartSnapping() end; end; - -- Update the distance alignment line + -- Get snap point and destination point screen positions for UI alignment local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + + -- Update the distance alignment line local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); @@ -10129,32 +10138,37 @@ function StartSnapping() end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) +end; - -- If destination stage was reached, restore the selection's original state - if SnappingStage == 'Destination' then - for Part, PartState in pairs(SnappingStartSelectionState) do - Part:MakeJoints(); - Part.CanCollide = PartState.CanCollide; - Part.Anchored = PartState.Anchored; - end; - end; +-- Stop snapping whenever mouse is released +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Ensure snapping is ongoing + if not SnappingStage then + return; + end; - -- Finish snapping - FinishSnapping(); + -- Finish snapping + FinishSnapping(); - end); +end); -end; function FinishSnapping() + -- Cleans up and finalizes the snapping operation -- Ensure snapping is ongoing if not SnappingStage then return; end; + -- Restore the selection's original state + for Part, PartState in pairs(SnappingStartSelectionState) do + Part:MakeJoints(); + Part.CanCollide = PartState.CanCollide; + Part.Anchored = PartState.Anchored; + end; + -- Disable any snapping stage SnappingStage = nil; @@ -10234,7 +10248,7 @@ end; return ResizeTool;]]> - + RotateTool @@ -10514,7 +10528,6 @@ function AttachHandles(Part, Autofocus) -- Prepare for rotating parts when the handle is clicked -------------------------------------------------------- - local InitialState = {}; local AreaPermissions; Handles.MouseButton1Down:connect(function () @@ -10546,38 +10559,6 @@ function AttachHandles(Part, Autofocus) PivotPoint = InitialState[Selection.Focus].CFrame; end; - ------------------------------------------------------ - -- Finalize changes to parts when the handle is let go - ------------------------------------------------------ - - Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - - -- Make sure this was button 1 being released, and rotating is ongoing - if not HandleRotating or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then - return; - end; - - -- Prevent selection - Core.Targeting.CancelSelecting(); - - -- Disable rotating - HandleRotating = false; - - -- Clear this connection to prevent it from firing again - ClearConnection 'HandleRelease'; - - -- Make joints, restore original anchor and collision states - for _, Part in pairs(Selection.Items) do - Part:MakeJoints(); - Part.CanCollide = InitialState[Part].CanCollide; - Part.Anchored = InitialState[Part].Anchored; - end; - - -- Register the change - RegisterChange(); - - end); - end); ------------------------------------------ @@ -10616,6 +10597,35 @@ function AttachHandles(Part, Autofocus) end; +-- Finalize changes to parts when the handle is let go +Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- Make sure rotating is ongoing + if not HandleRotating then + return; + end; + + -- Prevent selection + Core.Targeting.CancelSelecting(); + + -- Disable rotating + HandleRotating = false; + + -- Clear this connection to prevent it from firing again + ClearConnection 'HandleRelease'; + + -- Make joints, restore original anchor and collision states + for _, Part in pairs(Selection.Items) do + Part:MakeJoints(); + Part.CanCollide = InitialState[Part].CanCollide; + Part.Anchored = InitialState[Part].Anchored; + end; + + -- Register the change + RegisterChange(); + +end); + function HideHandles() -- Hides the resizing handles @@ -11020,7 +11030,7 @@ end; return RotateTool;]]> - + PaintTool @@ -11281,7 +11291,7 @@ function EnableClickPainting() -- Watch out for clicks on selected parts Connections.ClickPainting = Selection.FocusChanged:connect(function (Part) - if Selection.Find(Core.Mouse.Target) then + if Selection.IsSelected(Core.Mouse.Target) then -- Paint the selected parts PaintParts(); @@ -11375,7 +11385,7 @@ end; -- Return the tool return PaintTool;]]> - + Colors @@ -11515,7 +11525,7 @@ return BrickColors; ]]> - + MaterialTool @@ -11860,7 +11870,7 @@ end; return MaterialTool;]]> - + SurfaceTool @@ -12040,7 +12050,7 @@ function UpdateUI() end; end; - + -- Identify common surface type in selection local CommonSurfaceType = Support.IdentifyCommonItem(SurfaceTypeVariations); @@ -12082,7 +12092,7 @@ function SetSurfaceType(SurfaceType) Part.BackSurface = SurfaceType; Part.LeftSurface = SurfaceType; Part.RightSurface = SurfaceType; - + -- Change specific selected surface else Part[SurfaceTool.Surface .. 'Surface'] = SurfaceType; @@ -12100,7 +12110,7 @@ function EnableSurfaceSelection() -- Watch out for clicks on selected parts Connections.SurfaceSelection = Selection.FocusChanged:connect(function (Part) - if Selection.Find(Core.Mouse.Target) then + if Selection.IsSelected(Core.Mouse.Target) then -- Set the surface option to the target surface SetSurface(Core.Mouse.TargetSurface.Name); @@ -12169,7 +12179,7 @@ function TrackChange() Surfaces.Back = Part.BackSurface; Surfaces.Left = Part.LeftSurface; Surfaces.Right = Part.RightSurface; - + -- Record specific selected surface else Surfaces[SurfaceTool.Surface] = Part[SurfaceTool.Surface .. 'Surface']; @@ -12203,7 +12213,7 @@ function RegisterChange() Surfaces.Back = Part.BackSurface; Surfaces.Left = Part.LeftSurface; Surfaces.Right = Part.RightSurface; - + -- Record specific selected surface else Surfaces[SurfaceTool.Surface] = Part[SurfaceTool.Surface .. 'Surface']; @@ -12227,7 +12237,7 @@ end; return SurfaceTool;]]> - + AnchorTool @@ -12483,7 +12493,7 @@ end; return AnchorTool;]]> - + WeldTool @@ -12697,7 +12707,7 @@ end; return WeldTool;]]> - + TextureTool @@ -12849,7 +12859,7 @@ function EnableSurfaceClickSelection() -- Add the new click connection Connections.SurfaceClickSelection = UserInputService.InputEnded:connect(function (Input, GameProcessedEvent) - if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.Find(Core.Mouse.Target) then + if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.IsSelected(Core.Mouse.Target) then SetFace(Core.Mouse.TargetSurface); end; end); @@ -13315,7 +13325,7 @@ end; return TextureTool;]]> - + MeshTool @@ -14072,7 +14082,7 @@ end; return MeshTool;]]> - + NewPartTool @@ -14272,7 +14282,7 @@ end; return NewPartTool;]]> - + CollisionTool @@ -14528,7 +14538,7 @@ end; return CollisionTool;]]> - + LightingTool @@ -14625,7 +14635,7 @@ function EnableSurfaceClickSelection(LightType) -- Add the new click connection Connections.SurfaceClickSelection = UserInputService.InputEnded:connect(function (Input, GameProcessedEvent) - if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.Find(Core.Mouse.Target) then + if not GameProcessedEvent and Input.UserInputType == Enum.UserInputType.MouseButton1 and Selection.IsSelected(Core.Mouse.Target) then SetSurface(LightType, Core.Mouse.TargetSurface); end; end); @@ -14690,7 +14700,7 @@ function EnableLightSettingsUI(LightSettingsUI) -- Enable light type-specific features if LightType == 'SpotLight' or LightType == 'SurfaceLight' then - + -- Create a surface selection dropdown Surfaces = { 'Top', 'Bottom', 'Front', 'Back', 'Left', 'Right' }; local SurfaceDropdown = Core.Cheer(Options.SideOption.Dropdown).Start(Surfaces, '', function (Surface) @@ -14827,7 +14837,7 @@ function CloseLightOptions(Exception) ), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.5, true ); - + -- Make sure to not resize the exempt light type UI if not Exception or Exception and LightType ~= Exception then @@ -14950,7 +14960,7 @@ function UpdateUI() -- Update the surface dropdown input local Face = Support.IdentifyCommonProperty(Lights, 'Face'); SideDropdown.SetOption(Face and Face.Name or '*'); - + end; -- Update special color input @@ -15301,7 +15311,7 @@ end; return LightingTool;]]> - + DecorateTool @@ -15934,7 +15944,7 @@ end; return DecorateTool;]]> - + CoreToolLoader @@ -16018,7 +16028,7 @@ return true;]]> - + HistoryModule @@ -16101,7 +16111,7 @@ end; return History;]]> - + SelectionModule @@ -16114,6 +16124,7 @@ local Support = require(script.Parent.SupportLibrary); -- Core selection system Selection = {}; Selection.Items = {}; +Selection.ItemIndex = {}; Selection.Outlines = {}; Selection.Color = BrickColor.new 'Cyan'; Selection.Multiselecting = false; @@ -16128,51 +16139,38 @@ Selection.Changed = RbxUtility.CreateSignal(); -- Item existence listeners local Listeners = {}; -function Selection.Find(Needle) - -- Return `Needle`'s index in the selection, or `nil` if not found - - -- Go through each selected item - for Index, Item in pairs(Selection.Items) do - - -- Return the index if a match is found - if Item == Needle then - return Index; - end; +function Selection.IsSelected(Item) + -- Returns whether `Item` is selected or not - end; + -- Check and return item presence in index + return Selection.ItemIndex[Item]; - -- Return `nil` if no match is found - return nil; end; function Selection.Add(Items, RegisterHistory) -- Adds the given items to the selection - local SelectableItems = {}; + -- Get core API + local Core = GetCore(); -- Go through and validate each given item + local SelectableItems = {}; for _, Item in pairs(Items) do -- Make sure each item is valid and not already selected - if GetCore().IsSelectable(Item) and not Selection.Find(Item) then - - -- Queue each part to be added into the selection + if Core.IsSelectable(Item) and not Selection.ItemIndex[Item] then table.insert(SelectableItems, Item); - end; end; - local OldSelection = Support.CloneTable(Selection.Items); + local OldSelection = Selection.Items; -- Go through the valid new selection items for _, Item in pairs(SelectableItems) do -- Add each valid item to the selection - table.insert(Selection.Items, Item); - - -- Add a selection box - CreateSelectionBox(Item); + Selection.ItemIndex[Item] = true; -- Deselect items that are destroyed Listeners[Item] = Item.AncestryChanged:connect(function (Object, Parent) @@ -16183,11 +16181,17 @@ function Selection.Add(Items, RegisterHistory) end; + -- Update selected item list + Selection.Items = Support.Keys(Selection.ItemIndex); + -- Create a history record for this selection change, if requested if RegisterHistory and #SelectableItems > 0 then TrackSelectionChange(OldSelection); end; + -- Create selection boxes for the selection + CreateSelectionBoxes(SelectableItems); + -- Fire relevant events Selection.ItemsAdded:fire(SelectableItems); Selection.Changed:fire(); @@ -16197,28 +16201,24 @@ end; function Selection.Remove(Items, RegisterHistory) -- Removes the given items from the selection - local DeselectableItems = {}; - -- Go through and validate each given item + local DeselectableItems = {}; for _, Item in pairs(Items) do -- Make sure each item is actually selected - if Selection.Find(Item) then + if Selection.IsSelected(Item) then table.insert(DeselectableItems, Item); end; end; - local OldSelection = Support.CloneTable(Selection.Items); + local OldSelection = Selection.Items; -- Go through the valid deselectable items for _, Item in pairs(DeselectableItems) do - -- Clear item's selection box - RemoveSelectionBox(Item); - -- Remove item from selection - table.remove(Selection.Items, Selection.Find(Item)); + Selection.ItemIndex[Item] = nil; -- Stop tracking item's parent Listeners[Item]:disconnect(); @@ -16226,6 +16226,12 @@ function Selection.Remove(Items, RegisterHistory) end; + -- Remove selection boxes from deselected items + RemoveSelectionBoxes(DeselectableItems); + + -- Update selected item list + Selection.Items = Support.Keys(Selection.ItemIndex); + -- Create a history record for this selection change, if requested if RegisterHistory and #DeselectableItems > 0 then TrackSelectionChange(OldSelection); @@ -16263,7 +16269,7 @@ function Selection.SetFocus(Item) -- Selects `Item` as the focused selection item -- Make sure the item is selected or is `nil` - if not Selection.Find(Item) and Item ~= nil then + if not Selection.IsSelected(Item) and Item ~= nil then return; end; @@ -16297,47 +16303,72 @@ function GetCore() return require(script.Parent.Core); end; -function CreateSelectionBox(Item) - -- Creates a SelectionBox for the given item +function CreateSelectionBoxes(Items) + -- Creates a SelectionBox for each given item + + -- Get the core API + local Core = GetCore(); -- Only create selection boxes if in tool mode - if GetCore().Mode ~= 'Tool' then + if Core.Mode ~= 'Tool' then return; end; - -- Avoid duplicate selection boxes - if Selection.Outlines[Item] then - return; - end; + -- Track new selection boxes + local SelectionBoxes = {}; - -- Create the selection box - local SelectionBox = RbxUtility.Create 'SelectionBox' { - Name = 'BTSelectionBox'; - Color = Selection.Color; - Adornee = Item; - LineThickness = 0.025; - Transparency = 0.5; - }; + -- Create an outline for each part + for _, Item in pairs(Items) do + + -- Avoid duplicate selection boxes + if not Selection.Outlines[Item] then + + -- Create the selection box + local SelectionBox = Instance.new 'SelectionBox'; + SelectionBox.Name = 'BTSelectionBox'; + SelectionBox.Color = Selection.Color; + SelectionBox.Adornee = Item; + SelectionBox.LineThickness = 0.025; + SelectionBox.Transparency = 0.5; - -- Register the selection box - SelectionBox.Parent = GetCore().UIContainer; - Selection.Outlines[Item] = SelectionBox; + -- Register the outline + Selection.Outlines[Item] = SelectionBox; + table.insert(SelectionBoxes, SelectionBox); + + end; + + end; + + -- Parent the selection boxes + for _, SelectionBox in pairs(SelectionBoxes) do + SelectionBox.Parent = Core.UIContainer; + end; end; -function RemoveSelectionBox(Item) +function RemoveSelectionBoxes(Items) -- Removes the given item's selection box - -- Get the item's selection box - local SelectionBox = Selection.Outlines[Item]; - - -- Remove the selection box if found - if SelectionBox then - SelectionBox:Destroy(); + -- Only proceed if in tool mode + if GetCore().Mode ~= 'Tool' then + return; end; - -- Deregister the selection box - Selection.Outlines[Item] = nil; + -- Remove each item's outline + for _, Item in pairs(Items) do + + -- Get the item's selection box + local SelectionBox = Selection.Outlines[Item]; + + -- Remove the selection box if found + if SelectionBox then + SelectionBox:Destroy(); + end; + + -- Deregister the selection box + Selection.Outlines[Item] = nil; + + end; end; @@ -16440,7 +16471,7 @@ function TrackSelectionChange(OldSelection) History.Add({ Before = OldSelection; - After = Support.CloneTable(Selection.Items); + After = Selection.Items; Unapply = function (HistoryRecord) -- Reverts this change @@ -16464,7 +16495,7 @@ end; return Selection;]]> - + SnappingModule @@ -16714,12 +16745,12 @@ end; return SnapTracking;]]> - + FilterMode false - + false @@ -16729,16 +16760,25 @@ return SnapTracking;]]> - + BoundingBoxModule {30E3EC0B-6D59-465A-B78A-AF4D09B33D43} - + TargetingModule @@ -17117,23 +17154,27 @@ TargetingModule.TargetChanged = RbxUtility.CreateSignal(); function TargetingModule.EnableTargeting() -- Begin targeting parts from the mouse + -- Get core API + local Core = GetCore(); + + -- Get current mouse Mouse = GetCore().Mouse; -- Listen for target changes - GetCore().Connections.Targeting = Mouse.Move:connect(TargetingModule.UpdateTarget); + Core.Connections.Targeting = Mouse.Move:connect(TargetingModule.UpdateTarget); -- Listen for target clicks - GetCore().Connections.Selecting = Mouse.Button1Up:connect(TargetingModule.SelectTarget); + Core.Connections.Selecting = Mouse.Button1Up:connect(TargetingModule.SelectTarget); -- Listen for 2D selection - GetCore().Connections.RectSelectionStarted = Mouse.Button1Down:connect(TargetingModule.StartRectangleSelecting); - GetCore().Connections.RectSelectionFinished = Support.AddUserInputListener('Ended', 'MouseButton1', true, TargetingModule.FinishRectangleSelecting); + Core.Connections.RectSelectionStarted = Mouse.Button1Down:connect(TargetingModule.StartRectangleSelecting); + Core.Connections.RectSelectionFinished = Support.AddUserInputListener('Ended', 'MouseButton1', true, TargetingModule.FinishRectangleSelecting); -- Hide target box when tool is unequipped - GetCore().Connections.HideTargetBoxOnDisable = GetCore().Disabling:connect(TargetingModule.HighlightTarget); + Core.Connections.HideTargetBoxOnDisable = Core.Disabling:connect(TargetingModule.HighlightTarget); -- Cancel any ongoing selection when tool is unequipped - GetCore().Connections.CancelSelectionOnDisable = GetCore().Disabling:connect(TargetingModule.CancelRectangleSelecting); + Core.Connections.CancelSelectionOnDisable = Core.Disabling:connect(TargetingModule.CancelRectangleSelecting); end; @@ -17180,7 +17221,7 @@ function TargetingModule.SelectTarget() end; -- Focus on clicked, selected item - if not Selection.Multiselecting and Selection.Find(Target) then + if not Selection.Multiselecting and Selection.IsSelected(Target) then Selection.SetFocus(Target); return; end; @@ -17192,7 +17233,7 @@ function TargetingModule.SelectTarget() end; -- Unselect clicked, selected item if multiselection is enabled - if Selection.Multiselecting and Selection.Find(Target) then + if Selection.Multiselecting and Selection.IsSelected(Target) then Selection.Remove({ Target }, true); return; end; @@ -17347,9 +17388,9 @@ function TargetingModule.FinishRectangleSelecting() end; TargetingModule.TargetChanged:connect(function (Target) - + -- Hide target box if no/unselectable target - if not Target or not GetCore().IsSelectable(Target) or GetCore().Selection.Find(Target) then + if not Target or not GetCore().IsSelectable(Target) or GetCore().Selection.IsSelected(Target) then TargetingModule.HighlightTarget(nil); -- Show target outline if target is selectable @@ -17366,11 +17407,11 @@ end; return TargetingModule;]]> - + Interfaces - + true @@ -17409,7 +17450,7 @@ return TargetingModule;]]> true 1 - + false @@ -17448,7 +17489,7 @@ return TargetingModule;]]> true 1 - + false @@ -17488,7 +17529,7 @@ return TargetingModule;]]> 1 - + false @@ -17539,7 +17580,7 @@ return TargetingModule;]]> 1 - + false @@ -17591,7 +17632,7 @@ return TargetingModule;]]> - + false @@ -17630,7 +17671,7 @@ return TargetingModule;]]> true 1 - + false @@ -17681,7 +17722,7 @@ return TargetingModule;]]> 1 - + false @@ -17720,7 +17761,7 @@ return TargetingModule;]]> true 1 - + false @@ -17760,7 +17801,7 @@ return TargetingModule;]]> 1 - + true @@ -17815,7 +17856,7 @@ return TargetingModule;]]> 2 - + false @@ -17876,7 +17917,7 @@ return TargetingModule;]]> 1 - + false @@ -17928,7 +17969,7 @@ return TargetingModule;]]> - + false @@ -17967,7 +18008,7 @@ return TargetingModule;]]> true 1 - + false @@ -18007,7 +18048,7 @@ return TargetingModule;]]> 1 - + true @@ -18062,7 +18103,7 @@ return TargetingModule;]]> 2 - + false @@ -18123,7 +18164,7 @@ return TargetingModule;]]> 1 - + false @@ -18176,7 +18217,7 @@ return TargetingModule;]]> - + false @@ -18215,7 +18256,7 @@ return TargetingModule;]]> true 1 - + false @@ -18255,7 +18296,7 @@ return TargetingModule;]]> 1 - + false @@ -18308,7 +18349,7 @@ return TargetingModule;]]> - + true @@ -18347,7 +18388,7 @@ return TargetingModule;]]> true 1 - + false @@ -18386,7 +18427,7 @@ return TargetingModule;]]> true 1 - + false @@ -18426,7 +18467,7 @@ return TargetingModule;]]> 1 - + false @@ -18477,7 +18518,7 @@ return TargetingModule;]]> 1 - + false @@ -18529,7 +18570,7 @@ return TargetingModule;]]> - + false @@ -18568,7 +18609,7 @@ return TargetingModule;]]> true 1 - + false @@ -18619,7 +18660,7 @@ return TargetingModule;]]> 1 - + false @@ -18658,7 +18699,7 @@ return TargetingModule;]]> true 1 - + false @@ -18698,7 +18739,7 @@ return TargetingModule;]]> 1 - + true @@ -18753,7 +18794,7 @@ return TargetingModule;]]> 2 - + false @@ -18814,7 +18855,7 @@ return TargetingModule;]]> 1 - + false @@ -18866,7 +18907,7 @@ return TargetingModule;]]> - + false @@ -18905,7 +18946,7 @@ return TargetingModule;]]> true 1 - + false @@ -18945,7 +18986,7 @@ return TargetingModule;]]> 1 - + true @@ -19000,7 +19041,7 @@ return TargetingModule;]]> 2 - + false @@ -19061,7 +19102,7 @@ return TargetingModule;]]> 1 - + false @@ -19114,7 +19155,7 @@ return TargetingModule;]]> - + false @@ -19153,7 +19194,7 @@ return TargetingModule;]]> true 1 - + false @@ -19193,7 +19234,7 @@ return TargetingModule;]]> 1 - + false @@ -19246,7 +19287,7 @@ return TargetingModule;]]> - + true @@ -19285,7 +19326,7 @@ return TargetingModule;]]> true 1 - + false @@ -19325,7 +19366,7 @@ return TargetingModule;]]> 1 - + false @@ -19364,7 +19405,7 @@ return TargetingModule;]]> true 1 - + false @@ -19404,7 +19445,7 @@ return TargetingModule;]]> 1 - + false @@ -19455,7 +19496,7 @@ return TargetingModule;]]> 1 - + false @@ -19507,7 +19548,7 @@ return TargetingModule;]]> - + false @@ -19546,7 +19587,7 @@ return TargetingModule;]]> true 1 - + false @@ -19597,7 +19638,7 @@ return TargetingModule;]]> 1 - + true @@ -19662,7 +19703,7 @@ return TargetingModule;]]> 1 - + false @@ -19702,7 +19743,7 @@ return TargetingModule;]]> 1 - + true @@ -19757,7 +19798,7 @@ return TargetingModule;]]> 1 - + true @@ -19812,7 +19853,7 @@ return TargetingModule;]]> 1 - + false @@ -19852,7 +19893,7 @@ return TargetingModule;]]> 1 - + false @@ -19891,7 +19932,7 @@ return TargetingModule;]]> true 1 - + false @@ -19930,7 +19971,7 @@ return TargetingModule;]]> true 1 - + false @@ -19981,7 +20022,7 @@ return TargetingModule;]]> 1 - + false @@ -20020,7 +20061,7 @@ return TargetingModule;]]> true 1 - + false @@ -20081,7 +20122,7 @@ return TargetingModule;]]> 1 - + false @@ -20121,7 +20162,7 @@ return TargetingModule;]]> 1 - + true @@ -20177,7 +20218,7 @@ return TargetingModule;]]> - + false @@ -20216,7 +20257,7 @@ return TargetingModule;]]> true 1 - + false @@ -20267,7 +20308,7 @@ return TargetingModule;]]> 1 - + false @@ -20306,7 +20347,7 @@ return TargetingModule;]]> true 1 - + false @@ -20367,7 +20408,7 @@ return TargetingModule;]]> 1 - + false @@ -20407,7 +20448,7 @@ return TargetingModule;]]> 1 - + true @@ -20463,7 +20504,7 @@ return TargetingModule;]]> - + false @@ -20502,7 +20543,7 @@ return TargetingModule;]]> true 1 - + false @@ -20553,7 +20594,7 @@ return TargetingModule;]]> 1 - + false @@ -20592,7 +20633,7 @@ return TargetingModule;]]> true 1 - + false @@ -20653,7 +20694,7 @@ return TargetingModule;]]> 1 - + false @@ -20693,7 +20734,7 @@ return TargetingModule;]]> 1 - + true @@ -20749,7 +20790,7 @@ return TargetingModule;]]> - + false @@ -20788,7 +20829,7 @@ return TargetingModule;]]> true 1 - + true @@ -20852,7 +20893,7 @@ return TargetingModule;]]> true 1 - + false @@ -20893,7 +20934,7 @@ return TargetingModule;]]> - + false @@ -20944,7 +20985,7 @@ return TargetingModule;]]> 1 - + false @@ -20983,7 +21024,7 @@ return TargetingModule;]]> true 1 - + false @@ -21023,7 +21064,7 @@ return TargetingModule;]]> 1 - + false @@ -21078,7 +21119,7 @@ return TargetingModule;]]> - + false @@ -21129,7 +21170,7 @@ return TargetingModule;]]> 1 - + false @@ -21168,7 +21209,7 @@ return TargetingModule;]]> true 1 - + false @@ -21219,7 +21260,7 @@ return TargetingModule;]]> 1 - + true @@ -21284,7 +21325,7 @@ return TargetingModule;]]> 1 - + false @@ -21324,7 +21365,7 @@ return TargetingModule;]]> 1 - + true @@ -21379,7 +21420,7 @@ return TargetingModule;]]> 1 - + true @@ -21434,7 +21475,7 @@ return TargetingModule;]]> 1 - + false @@ -21474,7 +21515,7 @@ return TargetingModule;]]> 1 - + false @@ -21513,7 +21554,7 @@ return TargetingModule;]]> true 1 - + false @@ -21552,7 +21593,7 @@ return TargetingModule;]]> true 1 - + false @@ -21603,7 +21644,7 @@ return TargetingModule;]]> 1 - + false @@ -21642,7 +21683,7 @@ return TargetingModule;]]> true 1 - + false @@ -21703,7 +21744,7 @@ return TargetingModule;]]> 1 - + false @@ -21743,7 +21784,7 @@ return TargetingModule;]]> 1 - + true @@ -21799,7 +21840,7 @@ return TargetingModule;]]> - + false @@ -21838,7 +21879,7 @@ return TargetingModule;]]> true 1 - + false @@ -21889,7 +21930,7 @@ return TargetingModule;]]> 1 - + false @@ -21928,7 +21969,7 @@ return TargetingModule;]]> true 1 - + false @@ -21989,7 +22030,7 @@ return TargetingModule;]]> 1 - + false @@ -22029,7 +22070,7 @@ return TargetingModule;]]> 1 - + true @@ -22085,7 +22126,7 @@ return TargetingModule;]]> - + false @@ -22124,7 +22165,7 @@ return TargetingModule;]]> true 1 - + true @@ -22188,7 +22229,7 @@ return TargetingModule;]]> true 1 - + false @@ -22229,7 +22270,7 @@ return TargetingModule;]]> - + false @@ -22280,7 +22321,7 @@ return TargetingModule;]]> 1 - + false @@ -22319,7 +22360,7 @@ return TargetingModule;]]> true 1 - + false @@ -22359,7 +22400,7 @@ return TargetingModule;]]> 1 - + false @@ -22412,7 +22453,7 @@ return TargetingModule;]]> - + false @@ -22451,7 +22492,7 @@ return TargetingModule;]]> true 1 - + true @@ -22515,7 +22556,7 @@ return TargetingModule;]]> true 1 - + false @@ -22556,7 +22597,7 @@ return TargetingModule;]]> - + false @@ -22607,7 +22648,7 @@ return TargetingModule;]]> 1 - + false @@ -22646,7 +22687,7 @@ return TargetingModule;]]> true 1 - + false @@ -22686,7 +22727,7 @@ return TargetingModule;]]> 1 - + false @@ -22741,7 +22782,7 @@ return TargetingModule;]]> - + false @@ -22780,7 +22821,7 @@ return TargetingModule;]]> true 1 - + false @@ -22831,7 +22872,7 @@ return TargetingModule;]]> 1 - + true @@ -22896,7 +22937,7 @@ return TargetingModule;]]> 1 - + false @@ -22936,7 +22977,7 @@ return TargetingModule;]]> 1 - + true @@ -22991,7 +23032,7 @@ return TargetingModule;]]> 2 - + true @@ -23046,7 +23087,7 @@ return TargetingModule;]]> 2 - + false @@ -23086,7 +23127,7 @@ return TargetingModule;]]> 1 - + false @@ -23125,7 +23166,7 @@ return TargetingModule;]]> true 1 - + false @@ -23164,7 +23205,7 @@ return TargetingModule;]]> true 1 - + true @@ -23228,7 +23269,7 @@ return TargetingModule;]]> true 1 - + false @@ -23269,7 +23310,7 @@ return TargetingModule;]]> - + false @@ -23320,7 +23361,7 @@ return TargetingModule;]]> 1 - + false @@ -23359,7 +23400,7 @@ return TargetingModule;]]> true 1 - + false @@ -23399,7 +23440,7 @@ return TargetingModule;]]> 1 - + false @@ -23455,7 +23496,7 @@ return TargetingModule;]]> - + true @@ -23494,7 +23535,7 @@ return TargetingModule;]]> true 1 - + false @@ -23533,7 +23574,7 @@ return TargetingModule;]]> false 1 - + false @@ -23572,7 +23613,7 @@ return TargetingModule;]]> true 1 - + true @@ -23636,7 +23677,7 @@ return TargetingModule;]]> true 1 - + false @@ -23675,7 +23716,7 @@ return TargetingModule;]]> false 2 - + false @@ -23715,7 +23756,7 @@ return TargetingModule;]]> 2 - + false @@ -23768,7 +23809,7 @@ return TargetingModule;]]> - + true @@ -23832,7 +23873,7 @@ return TargetingModule;]]> true 1 - + false @@ -23871,7 +23912,7 @@ return TargetingModule;]]> false 2 - + false @@ -23911,7 +23952,7 @@ return TargetingModule;]]> 2 - + false @@ -23964,7 +24005,7 @@ return TargetingModule;]]> - + true @@ -24028,7 +24069,7 @@ return TargetingModule;]]> true 1 - + false @@ -24067,7 +24108,7 @@ return TargetingModule;]]> false 3 - + false @@ -24107,7 +24148,7 @@ return TargetingModule;]]> 3 - + false @@ -24160,7 +24201,7 @@ return TargetingModule;]]> - + false @@ -24199,7 +24240,7 @@ return TargetingModule;]]> true 1 - + false @@ -24238,7 +24279,7 @@ return TargetingModule;]]> false 2 - + false @@ -24278,7 +24319,7 @@ return TargetingModule;]]> 2 - + false @@ -24331,7 +24372,7 @@ return TargetingModule;]]> - + true @@ -24386,7 +24427,7 @@ return TargetingModule;]]> 2 - + true @@ -24442,7 +24483,7 @@ return TargetingModule;]]> - + false @@ -24496,7 +24537,7 @@ return TargetingModule;]]> 1 - + false @@ -24547,7 +24588,7 @@ return TargetingModule;]]> 1 - + false @@ -24586,7 +24627,7 @@ return TargetingModule;]]> true 1 - + true @@ -24641,7 +24682,7 @@ return TargetingModule;]]> 1 - + false @@ -24681,7 +24722,7 @@ return TargetingModule;]]> 1 - + false @@ -24734,7 +24775,7 @@ return TargetingModule;]]> - + true @@ -24773,7 +24814,7 @@ return TargetingModule;]]> true 1 - + true @@ -24837,7 +24878,7 @@ return TargetingModule;]]> true 1 - + false @@ -24899,7 +24940,7 @@ return TargetingModule;]]> - + true @@ -24963,7 +25004,7 @@ return TargetingModule;]]> true 2 - + false @@ -25003,7 +25044,7 @@ return TargetingModule;]]> 1 - + false @@ -25065,7 +25106,7 @@ return TargetingModule;]]> - + false @@ -25104,7 +25145,7 @@ return TargetingModule;]]> true 1 - + false @@ -25155,7 +25196,7 @@ return TargetingModule;]]> 1 - + false @@ -25194,7 +25235,7 @@ return TargetingModule;]]> true 1 - + false @@ -25235,7 +25276,7 @@ return TargetingModule;]]> - + true @@ -25288,7 +25329,7 @@ return TargetingModule;]]> true 2 - + false @@ -25351,7 +25392,7 @@ return TargetingModule;]]> - + false @@ -25390,7 +25431,7 @@ return TargetingModule;]]> true 1 - + false @@ -25441,7 +25482,7 @@ return TargetingModule;]]> 1 - + false @@ -25480,7 +25521,7 @@ return TargetingModule;]]> true 1 - + false @@ -25521,7 +25562,7 @@ return TargetingModule;]]> - + true @@ -25574,7 +25615,7 @@ return TargetingModule;]]> true 2 - + false @@ -25637,7 +25678,7 @@ return TargetingModule;]]> - + false @@ -25676,7 +25717,7 @@ return TargetingModule;]]> true 1 - + false @@ -25727,7 +25768,7 @@ return TargetingModule;]]> 1 - + false @@ -25766,7 +25807,7 @@ return TargetingModule;]]> true 1 - + false @@ -25807,7 +25848,7 @@ return TargetingModule;]]> - + true @@ -25860,7 +25901,7 @@ return TargetingModule;]]> true 2 - + false @@ -25923,7 +25964,7 @@ return TargetingModule;]]> - + false @@ -25962,7 +26003,7 @@ return TargetingModule;]]> true 1 - + false @@ -26003,7 +26044,7 @@ return TargetingModule;]]> - + true @@ -26057,7 +26098,7 @@ return TargetingModule;]]> true 2 - + false @@ -26098,7 +26139,7 @@ return TargetingModule;]]> - + true @@ -26152,7 +26193,7 @@ return TargetingModule;]]> true 2 - + false @@ -26193,7 +26234,7 @@ return TargetingModule;]]> - + false @@ -26322,7 +26363,7 @@ return Component;]]> - + true @@ -26361,7 +26402,7 @@ return Component;]]> true 1 - + false @@ -26400,7 +26441,7 @@ return Component;]]> true 1 - + false @@ -26440,7 +26481,7 @@ return Component;]]> 1 - + true @@ -26495,7 +26536,7 @@ return Component;]]> 1 - + true @@ -26550,7 +26591,7 @@ return Component;]]> 1 - + false @@ -26590,7 +26631,7 @@ return Component;]]> 1 - + true @@ -26655,7 +26696,7 @@ return Component;]]> 1 - + false @@ -26706,7 +26747,7 @@ return Component;]]> 1 - + false @@ -26745,7 +26786,7 @@ return Component;]]> true 1 - + false @@ -26784,7 +26825,7 @@ return Component;]]> true 1 - + false @@ -26835,7 +26876,7 @@ return Component;]]> 1 - + true @@ -26901,7 +26942,7 @@ return Component;]]> - + false @@ -26940,7 +26981,7 @@ return Component;]]> true 1 - + false @@ -26979,7 +27020,7 @@ return Component;]]> true 1 - + true @@ -27033,7 +27074,7 @@ return Component;]]> 2 - + false @@ -27094,7 +27135,7 @@ return Component;]]> 1 - + false @@ -27135,7 +27176,7 @@ return Component;]]> - + false @@ -27187,7 +27228,7 @@ return Component;]]> - + false @@ -27226,7 +27267,7 @@ return Component;]]> true 1 - + false @@ -27265,7 +27306,7 @@ return Component;]]> true 1 - + true @@ -27319,7 +27360,7 @@ return Component;]]> 2 - + false @@ -27380,7 +27421,7 @@ return Component;]]> 1 - + false @@ -27421,7 +27462,7 @@ return Component;]]> - + false @@ -27473,7 +27514,7 @@ return Component;]]> - + false @@ -27512,7 +27553,7 @@ return Component;]]> true 1 - + true @@ -27576,7 +27617,7 @@ return Component;]]> true 1 - + false @@ -27617,7 +27658,7 @@ return Component;]]> - + false @@ -27668,7 +27709,7 @@ return Component;]]> 1 - + false @@ -27707,7 +27748,7 @@ return Component;]]> true 1 - + false @@ -27747,7 +27788,7 @@ return Component;]]> 1 - + false @@ -27802,7 +27843,7 @@ return Component;]]> - + false @@ -27853,7 +27894,7 @@ return Component;]]> 1 - + false @@ -27892,7 +27933,7 @@ return Component;]]> true 1 - + false @@ -27931,7 +27972,7 @@ return Component;]]> true 1 - + false @@ -27970,7 +28011,7 @@ return Component;]]> true 1 - + false @@ -28021,7 +28062,7 @@ return Component;]]> 1 - + true @@ -28087,7 +28128,7 @@ return Component;]]> - + false @@ -28126,7 +28167,7 @@ return Component;]]> true 1 - + false @@ -28177,7 +28218,7 @@ return Component;]]> 1 - + true @@ -28231,7 +28272,7 @@ return Component;]]> true 1 - + false @@ -28292,7 +28333,7 @@ return Component;]]> 3 - + true @@ -28346,7 +28387,7 @@ return Component;]]> false 4 - + false @@ -28398,12 +28439,12 @@ return Component;]]> - + Options - + false @@ -28443,7 +28484,7 @@ return Component;]]> 1 - + false @@ -28494,7 +28535,7 @@ return Component;]]> 3 - + false @@ -28581,7 +28622,7 @@ return Component;]]> - + false @@ -28620,7 +28661,7 @@ return Component;]]> true 1 - + false @@ -28659,7 +28700,7 @@ return Component;]]> true 1 - + true @@ -28713,7 +28754,7 @@ return Component;]]> 2 - + false @@ -28774,7 +28815,7 @@ return Component;]]> 1 - + false @@ -28815,7 +28856,7 @@ return Component;]]> - + false @@ -28867,7 +28908,7 @@ return Component;]]> - + false @@ -28906,7 +28947,7 @@ return Component;]]> true 1 - + false @@ -28945,7 +28986,7 @@ return Component;]]> true 1 - + true @@ -28999,7 +29040,7 @@ return Component;]]> 2 - + false @@ -29039,7 +29080,7 @@ return Component;]]> 1 - + false @@ -29101,7 +29142,7 @@ return Component;]]> - + false @@ -29153,7 +29194,7 @@ return Component;]]> - + false @@ -29192,7 +29233,7 @@ return Component;]]> true 1 - + false @@ -29231,7 +29272,7 @@ return Component;]]> true 1 - + true @@ -29285,7 +29326,7 @@ return Component;]]> 2 - + false @@ -29346,7 +29387,7 @@ return Component;]]> 1 - + false @@ -29387,7 +29428,7 @@ return Component;]]> - + false @@ -29439,7 +29480,7 @@ return Component;]]> - + false @@ -29478,7 +29519,7 @@ return Component;]]> true 1 - + true @@ -29542,7 +29583,7 @@ return Component;]]> true 1 - + false @@ -29583,7 +29624,7 @@ return Component;]]> - + false @@ -29634,7 +29675,7 @@ return Component;]]> 1 - + false @@ -29673,7 +29714,7 @@ return Component;]]> true 1 - + false @@ -29713,7 +29754,7 @@ return Component;]]> 1 - + false @@ -29767,7 +29808,7 @@ return Component;]]> - + false @@ -29807,7 +29848,7 @@ return Component;]]> 1 - + true @@ -29862,7 +29903,7 @@ return Component;]]> 1 - + true @@ -29917,7 +29958,7 @@ return Component;]]> 1 - + false @@ -29957,7 +29998,7 @@ return Component;]]> 1 - + true @@ -30022,7 +30063,7 @@ return Component;]]> 1 - + false @@ -30074,7 +30115,7 @@ return Component;]]> - + false @@ -30113,7 +30154,7 @@ return Component;]]> true 1 - + false @@ -30164,7 +30205,7 @@ return Component;]]> 1 - + false @@ -30215,7 +30256,7 @@ return Component;]]> 1 - + false @@ -30256,7 +30297,7 @@ return Component;]]> - + false @@ -30296,7 +30337,7 @@ return Component;]]> 1 - + false @@ -30335,7 +30376,7 @@ return Component;]]> true 1 - + false @@ -30375,7 +30416,7 @@ return Component;]]> 1 - + true @@ -30430,7 +30471,7 @@ return Component;]]> 1 - + true @@ -30485,7 +30526,7 @@ return Component;]]> 1 - + false @@ -30525,7 +30566,7 @@ return Component;]]> 1 - + true @@ -30590,7 +30631,7 @@ return Component;]]> 1 - + false @@ -30641,7 +30682,7 @@ return Component;]]> 1 - + false @@ -30680,7 +30721,7 @@ return Component;]]> true 1 - + false @@ -30719,7 +30760,7 @@ return Component;]]> true 1 - + false @@ -30770,7 +30811,7 @@ return Component;]]> 1 - + true @@ -30836,7 +30877,7 @@ return Component;]]> - + false @@ -30875,7 +30916,7 @@ return Component;]]> true 1 - + false @@ -30926,7 +30967,7 @@ return Component;]]> 1 - + true @@ -30980,7 +31021,7 @@ return Component;]]> true 1 - + false @@ -31041,7 +31082,7 @@ return Component;]]> 3 - + true @@ -31095,7 +31136,7 @@ return Component;]]> false 4 - + false @@ -31147,12 +31188,12 @@ return Component;]]> - + Options - + false @@ -31192,7 +31233,7 @@ return Component;]]> 1 - + false @@ -31243,7 +31284,7 @@ return Component;]]> 3 - + false @@ -31330,7 +31371,7 @@ return Component;]]> - + false @@ -31369,7 +31410,7 @@ return Component;]]> true 1 - + false @@ -31408,7 +31449,7 @@ return Component;]]> true 1 - + true @@ -31462,7 +31503,7 @@ return Component;]]> 2 - + false @@ -31523,7 +31564,7 @@ return Component;]]> 1 - + false @@ -31564,7 +31605,7 @@ return Component;]]> - + false @@ -31616,7 +31657,7 @@ return Component;]]> - + false @@ -31655,7 +31696,7 @@ return Component;]]> true 1 - + false @@ -31694,7 +31735,7 @@ return Component;]]> true 1 - + true @@ -31748,7 +31789,7 @@ return Component;]]> 2 - + false @@ -31788,7 +31829,7 @@ return Component;]]> 1 - + false @@ -31850,7 +31891,7 @@ return Component;]]> - + false @@ -31902,7 +31943,7 @@ return Component;]]> - + false @@ -31941,7 +31982,7 @@ return Component;]]> true 1 - + false @@ -31980,7 +32021,7 @@ return Component;]]> true 1 - + true @@ -32034,7 +32075,7 @@ return Component;]]> 2 - + false @@ -32095,7 +32136,7 @@ return Component;]]> 1 - + false @@ -32136,7 +32177,7 @@ return Component;]]> - + false @@ -32188,7 +32229,7 @@ return Component;]]> - + false @@ -32227,7 +32268,7 @@ return Component;]]> true 1 - + true @@ -32291,7 +32332,7 @@ return Component;]]> true 1 - + false @@ -32332,7 +32373,7 @@ return Component;]]> - + false @@ -32383,7 +32424,7 @@ return Component;]]> 1 - + false @@ -32422,7 +32463,7 @@ return Component;]]> true 1 - + false @@ -32462,7 +32503,7 @@ return Component;]]> 1 - + false @@ -32518,7 +32559,7 @@ return Component;]]> - + true @@ -32557,7 +32598,7 @@ return Component;]]> true 1 - + false @@ -32596,7 +32637,7 @@ return Component;]]> true 1 - + false @@ -32636,7 +32677,7 @@ return Component;]]> 1 - + false @@ -32687,7 +32728,7 @@ return Component;]]> 1 - + false @@ -32739,7 +32780,7 @@ return Component;]]> - + false @@ -32778,7 +32819,7 @@ return Component;]]> true 1 - + false @@ -32829,7 +32870,7 @@ return Component;]]> 1 - + true @@ -32883,7 +32924,7 @@ return Component;]]> true 1 - + false @@ -32944,7 +32985,7 @@ return Component;]]> 3 - + true @@ -32998,7 +33039,7 @@ return Component;]]> false 4 - + false @@ -33050,12 +33091,12 @@ return Component;]]> - + Options - + false @@ -33095,7 +33136,7 @@ return Component;]]> 1 - + false @@ -33146,7 +33187,7 @@ return Component;]]> 3 - + false @@ -33233,7 +33274,7 @@ return Component;]]> - + false @@ -33272,7 +33313,7 @@ return Component;]]> true 1 - + false @@ -33323,7 +33364,7 @@ return Component;]]> 1 - + false @@ -33362,7 +33403,7 @@ return Component;]]> true 1 - + false @@ -33423,7 +33464,7 @@ return Component;]]> 1 - + false @@ -33463,7 +33504,7 @@ return Component;]]> 1 - + true @@ -33519,7 +33560,7 @@ return Component;]]> - + false @@ -33558,7 +33599,7 @@ return Component;]]> true 1 - + false @@ -33609,7 +33650,7 @@ return Component;]]> 1 - + false @@ -33648,7 +33689,7 @@ return Component;]]> true 1 - + false @@ -33688,7 +33729,7 @@ return Component;]]> 1 - + false @@ -33749,7 +33790,7 @@ return Component;]]> 1 - + true @@ -33805,7 +33846,7 @@ return Component;]]> - + false @@ -33844,7 +33885,7 @@ return Component;]]> true 1 - + false @@ -33885,7 +33926,7 @@ return Component;]]> - + false @@ -33937,7 +33978,7 @@ return Component;]]> - + true @@ -33976,7 +34017,7 @@ return Component;]]> true 1 - + false @@ -34015,7 +34056,7 @@ return Component;]]> true 1 - + false @@ -34055,7 +34096,7 @@ return Component;]]> 1 - + false @@ -34106,7 +34147,7 @@ return Component;]]> 1 - + false @@ -34158,7 +34199,7 @@ return Component;]]> - + false @@ -34197,7 +34238,7 @@ return Component;]]> false 1 - + false @@ -34248,7 +34289,7 @@ return Component;]]> 1 - + true @@ -34302,7 +34343,7 @@ return Component;]]> true 1 - + false @@ -34363,7 +34404,7 @@ return Component;]]> 3 - + true @@ -34417,7 +34458,7 @@ return Component;]]> false 4 - + false @@ -34469,12 +34510,12 @@ return Component;]]> - + Options - + false @@ -34514,7 +34555,7 @@ return Component;]]> 1 - + false @@ -34565,7 +34606,7 @@ return Component;]]> 3 - + false @@ -34652,7 +34693,7 @@ return Component;]]> - + false @@ -34691,7 +34732,7 @@ return Component;]]> false 1 - + false @@ -34742,7 +34783,7 @@ return Component;]]> 1 - + false @@ -34781,7 +34822,7 @@ return Component;]]> true 1 - + false @@ -34842,7 +34883,7 @@ return Component;]]> 1 - + false @@ -34882,7 +34923,7 @@ return Component;]]> 1 - + true @@ -34937,7 +34978,7 @@ return Component;]]> - + false @@ -34976,7 +35017,7 @@ return Component;]]> true 1 - + false @@ -35037,7 +35078,7 @@ return Component;]]> 1 - + false @@ -35077,7 +35118,7 @@ return Component;]]> 1 - + true @@ -35132,7 +35173,7 @@ return Component;]]> - + false @@ -35171,7 +35212,7 @@ return Component;]]> true 1 - + false @@ -35232,7 +35273,7 @@ return Component;]]> 1 - + false @@ -35272,7 +35313,7 @@ return Component;]]> 1 - + true @@ -35328,7 +35369,7 @@ return Component;]]> - + false @@ -35367,7 +35408,7 @@ return Component;]]> false 1 - + true @@ -35422,7 +35463,7 @@ return Component;]]> 1 - + false @@ -35463,7 +35504,7 @@ return Component;]]> - + false @@ -35502,7 +35543,7 @@ return Component;]]> false 1 - + false @@ -35553,7 +35594,7 @@ return Component;]]> 1 - + true @@ -35607,7 +35648,7 @@ return Component;]]> 1 - + false @@ -35646,7 +35687,7 @@ return Component;]]> true 1 - + false @@ -35686,7 +35727,7 @@ return Component;]]> 1 - + false @@ -35726,7 +35767,7 @@ return Component;]]> 1 - + false @@ -35767,7 +35808,7 @@ return Component;]]> - + false @@ -35808,7 +35849,7 @@ return Component;]]> - + false @@ -35848,7 +35889,7 @@ return Component;]]> 1 - + false @@ -35887,7 +35928,7 @@ return Component;]]> false 1 - + false @@ -35938,7 +35979,7 @@ return Component;]]> 1 - + true @@ -35992,7 +36033,7 @@ return Component;]]> 1 - + false @@ -36031,7 +36072,7 @@ return Component;]]> true 1 - + false @@ -36071,7 +36112,7 @@ return Component;]]> 1 - + false @@ -36111,7 +36152,7 @@ return Component;]]> 1 - + false @@ -36152,7 +36193,7 @@ return Component;]]> - + false @@ -36193,7 +36234,7 @@ return Component;]]> - + false @@ -36232,7 +36273,7 @@ return Component;]]> false 1 - + true @@ -36287,7 +36328,7 @@ return Component;]]> 1 - + false @@ -36328,7 +36369,7 @@ return Component;]]> - + false @@ -36367,7 +36408,7 @@ return Component;]]> false 1 - + false @@ -36418,7 +36459,7 @@ return Component;]]> 1 - + false @@ -36457,7 +36498,7 @@ return Component;]]> true 1 - + false @@ -36497,7 +36538,7 @@ return Component;]]> 1 - + false @@ -36549,7 +36590,7 @@ return Component;]]> - + true @@ -36613,7 +36654,7 @@ return Component;]]> true 1 - + false @@ -36655,7 +36696,7 @@ return Component;]]> - + false @@ -36706,7 +36747,7 @@ return Component;]]> 1 - + false @@ -36745,7 +36786,7 @@ return Component;]]> false 1 - + false @@ -36796,7 +36837,7 @@ return Component;]]> 1 - + false @@ -36835,7 +36876,7 @@ return Component;]]> true 1 - + false @@ -36896,7 +36937,7 @@ return Component;]]> 1 - + false @@ -36936,7 +36977,7 @@ return Component;]]> 1 - + true @@ -36991,7 +37032,7 @@ return Component;]]> - + false @@ -37030,7 +37071,7 @@ return Component;]]> true 1 - + false @@ -37091,7 +37132,7 @@ return Component;]]> 1 - + false @@ -37131,7 +37172,7 @@ return Component;]]> 1 - + true @@ -37186,7 +37227,7 @@ return Component;]]> - + false @@ -37225,7 +37266,7 @@ return Component;]]> true 1 - + false @@ -37286,7 +37327,7 @@ return Component;]]> 1 - + false @@ -37326,7 +37367,7 @@ return Component;]]> 1 - + true @@ -37383,7 +37424,7 @@ return Component;]]> - + true @@ -37422,7 +37463,7 @@ return Component;]]> true 1 - + false @@ -37461,7 +37502,7 @@ return Component;]]> true 1 - + false @@ -37512,7 +37553,7 @@ return Component;]]> 1 - + false @@ -37553,7 +37594,7 @@ return Component;]]> - + false @@ -37592,7 +37633,7 @@ return Component;]]> false 1 - + false @@ -37631,7 +37672,7 @@ return Component;]]> true 1 - + false @@ -37670,7 +37711,7 @@ return Component;]]> true 1 - + false @@ -37731,7 +37772,7 @@ return Component;]]> 1 - + true @@ -37786,7 +37827,7 @@ return Component;]]> - + false @@ -37825,7 +37866,7 @@ return Component;]]> true 1 - + true @@ -37879,7 +37920,7 @@ return Component;]]> 2 - + false @@ -37941,7 +37982,7 @@ return Component;]]> - + false @@ -37980,7 +38021,7 @@ return Component;]]> true 1 - + true @@ -38034,7 +38075,7 @@ return Component;]]> 2 - + false @@ -38096,7 +38137,7 @@ return Component;]]> - + false @@ -38148,7 +38189,7 @@ return Component;]]> - + false @@ -38199,7 +38240,7 @@ return Component;]]> 1 - + false @@ -38240,7 +38281,7 @@ return Component;]]> - + false @@ -38279,7 +38320,7 @@ return Component;]]> true 1 - + false @@ -38318,7 +38359,7 @@ return Component;]]> true 1 - + false @@ -38370,7 +38411,7 @@ return Component;]]> - + false @@ -38409,7 +38450,7 @@ return Component;]]> true 1 - + false @@ -38470,7 +38511,7 @@ return Component;]]> 1 - + true @@ -38524,7 +38565,7 @@ return Component;]]> 2 - + false @@ -38566,7 +38607,7 @@ return Component;]]> - + false @@ -38605,7 +38646,7 @@ return Component;]]> true 1 - + false @@ -38656,7 +38697,7 @@ return Component;]]> 1 - + false @@ -38707,7 +38748,7 @@ return Component;]]> 1 - + false @@ -38748,7 +38789,7 @@ return Component;]]> - + false @@ -38787,7 +38828,7 @@ return Component;]]> true 1 - + false @@ -38826,7 +38867,7 @@ return Component;]]> true 1 - + false @@ -38878,7 +38919,7 @@ return Component;]]> - + false @@ -38917,7 +38958,7 @@ return Component;]]> true 1 - + false @@ -38968,7 +39009,7 @@ return Component;]]> 2 - + false @@ -39029,7 +39070,7 @@ return Component;]]> 1 - + true @@ -39084,7 +39125,7 @@ return Component;]]> 2 - + false @@ -39125,7 +39166,7 @@ return Component;]]> - + false @@ -39164,7 +39205,7 @@ return Component;]]> true 1 - + false @@ -39215,7 +39256,7 @@ return Component;]]> 2 - + false @@ -39276,7 +39317,7 @@ return Component;]]> 1 - + true @@ -39331,7 +39372,7 @@ return Component;]]> 2 - + false @@ -39372,7 +39413,7 @@ return Component;]]> - + false @@ -39411,7 +39452,7 @@ return Component;]]> true 1 - + false @@ -39462,7 +39503,7 @@ return Component;]]> 2 - + false @@ -39523,7 +39564,7 @@ return Component;]]> 1 - + true @@ -39578,7 +39619,7 @@ return Component;]]> 2 - + false @@ -39621,7 +39662,7 @@ return Component;]]> - + true @@ -39660,7 +39701,7 @@ return Component;]]> true 1 - + false @@ -39699,7 +39740,7 @@ return Component;]]> true 1 - + false @@ -39739,7 +39780,7 @@ return Component;]]> 1 - + false @@ -39790,7 +39831,7 @@ return Component;]]> 1 - + false @@ -39842,7 +39883,7 @@ return Component;]]> - + false @@ -39881,7 +39922,7 @@ return Component;]]> true 1 - + false @@ -39932,7 +39973,7 @@ return Component;]]> 1 - + true @@ -39986,7 +40027,7 @@ return Component;]]> true 1 - + false @@ -40047,7 +40088,7 @@ return Component;]]> 3 - + true @@ -40101,7 +40142,7 @@ return Component;]]> false 4 - + false @@ -40153,12 +40194,12 @@ return Component;]]> - + Options - + false @@ -40198,7 +40239,7 @@ return Component;]]> 1 - + false @@ -40249,7 +40290,7 @@ return Component;]]> 3 - + false @@ -40336,7 +40377,7 @@ return Component;]]> - + false @@ -40375,7 +40416,7 @@ return Component;]]> true 1 - + false @@ -40415,7 +40456,7 @@ return Component;]]> 1 - + false @@ -40468,7 +40509,7 @@ return Component;]]> - + true @@ -40507,7 +40548,7 @@ return Component;]]> true 1 - + false @@ -40546,7 +40587,7 @@ return Component;]]> true 1 - + false @@ -40586,7 +40627,7 @@ return Component;]]> 1 - + false @@ -40637,7 +40678,7 @@ return Component;]]> 1 - + false @@ -40689,7 +40730,7 @@ return Component;]]> - + false @@ -40729,7 +40770,7 @@ return Component;]]> 1 - + true @@ -40783,7 +40824,7 @@ return Component;]]> true 1 - + false @@ -40833,7 +40874,7 @@ return Component;]]> false 1 - + false @@ -40876,7 +40917,7 @@ return Component;]]> - + true @@ -40915,7 +40956,7 @@ return Component;]]> true 1 - + false @@ -40954,7 +40995,7 @@ return Component;]]> true 1 - + false @@ -40993,7 +41034,7 @@ return Component;]]> true 1 - + false @@ -41033,7 +41074,7 @@ return Component;]]> 1 - + true @@ -41088,7 +41129,7 @@ return Component;]]> 2 - + false @@ -41149,7 +41190,7 @@ return Component;]]> 1 - + false @@ -41201,7 +41242,7 @@ return Component;]]> - + false @@ -41240,7 +41281,7 @@ return Component;]]> true 1 - + false @@ -41280,7 +41321,7 @@ return Component;]]> 1 - + true @@ -41335,7 +41376,7 @@ return Component;]]> 2 - + false @@ -41396,7 +41437,7 @@ return Component;]]> 1 - + false @@ -41448,7 +41489,7 @@ return Component;]]> - + false @@ -41487,7 +41528,7 @@ return Component;]]> true 1 - + false @@ -41540,7 +41581,7 @@ return Component;]]> - + false @@ -41579,7 +41620,7 @@ return Component;]]> true 1 - + false @@ -41619,7 +41660,7 @@ return Component;]]> 1 - + false @@ -41670,7 +41711,7 @@ return Component;]]> 1 - + false @@ -41722,7 +41763,7 @@ return Component;]]> - + false @@ -41761,7 +41802,7 @@ return Component;]]> true 1 - + false @@ -41800,7 +41841,7 @@ return Component;]]> true 1 - + false @@ -41840,7 +41881,7 @@ return Component;]]> 1 - + true @@ -41894,7 +41935,7 @@ return Component;]]> 2 - + false @@ -41956,7 +41997,7 @@ return Component;]]> - + false @@ -41995,7 +42036,7 @@ return Component;]]> true 1 - + false @@ -42048,7 +42089,7 @@ return Component;]]> - + false @@ -42087,7 +42128,7 @@ return Component;]]> false 1 - + false @@ -42127,7 +42168,7 @@ return Component;]]> 1 - + false @@ -42178,7 +42219,7 @@ return Component;]]> 1 - + false @@ -42217,7 +42258,7 @@ return Component;]]> true 1 - + false @@ -42268,7 +42309,7 @@ return Component;]]> 1 - + false @@ -42307,7 +42348,7 @@ return Component;]]> true 1 - + true @@ -42361,7 +42402,7 @@ return Component;]]> 2 - + false @@ -42423,7 +42464,7 @@ return Component;]]> - + false @@ -42462,7 +42503,7 @@ return Component;]]> true 1 - + true @@ -42516,7 +42557,7 @@ return Component;]]> 2 - + false @@ -42578,7 +42619,7 @@ return Component;]]> - + false @@ -42617,7 +42658,7 @@ return Component;]]> true 1 - + true @@ -42671,7 +42712,7 @@ return Component;]]> 2 - + false @@ -42735,7 +42776,7 @@ return Component;]]> - + false @@ -42774,7 +42815,7 @@ return Component;]]> true 1 - + false @@ -42814,7 +42855,7 @@ return Component;]]> 1 - + false @@ -42867,7 +42908,7 @@ return Component;]]> - + true @@ -42906,7 +42947,7 @@ return Component;]]> true 1 - + false @@ -42945,7 +42986,7 @@ return Component;]]> true 1 - + false @@ -42984,7 +43025,7 @@ return Component;]]> true 1 - + false @@ -43024,7 +43065,7 @@ return Component;]]> 1 - + true @@ -43079,7 +43120,7 @@ return Component;]]> 2 - + false @@ -43140,7 +43181,7 @@ return Component;]]> 1 - + false @@ -43192,7 +43233,7 @@ return Component;]]> - + false @@ -43231,7 +43272,7 @@ return Component;]]> true 1 - + false @@ -43271,7 +43312,7 @@ return Component;]]> 1 - + true @@ -43326,7 +43367,7 @@ return Component;]]> 2 - + false @@ -43387,7 +43428,7 @@ return Component;]]> 1 - + false @@ -43439,7 +43480,7 @@ return Component;]]> - + false @@ -43478,7 +43519,7 @@ return Component;]]> true 1 - + false @@ -43518,7 +43559,7 @@ return Component;]]> 1 - + true @@ -43573,7 +43614,7 @@ return Component;]]> 2 - + false @@ -43634,7 +43675,7 @@ return Component;]]> 1 - + false @@ -43686,7 +43727,7 @@ return Component;]]> - + false @@ -43725,7 +43766,7 @@ return Component;]]> true 1 - + false @@ -43778,7 +43819,7 @@ return Component;]]> - + false @@ -43817,7 +43858,7 @@ return Component;]]> true 1 - + false @@ -43857,7 +43898,7 @@ return Component;]]> 1 - + false @@ -43908,7 +43949,7 @@ return Component;]]> 1 - + false @@ -43960,7 +44001,7 @@ return Component;]]> - + false @@ -43999,7 +44040,7 @@ return Component;]]> true 1 - + false @@ -44038,7 +44079,7 @@ return Component;]]> true 1 - + false @@ -44078,7 +44119,7 @@ return Component;]]> 1 - + true @@ -44132,7 +44173,7 @@ return Component;]]> 2 - + false @@ -44194,7 +44235,7 @@ return Component;]]> - + false @@ -44233,7 +44274,7 @@ return Component;]]> true 1 - + false @@ -44286,7 +44327,7 @@ return Component;]]> - + false @@ -44325,7 +44366,7 @@ return Component;]]> false 1 - + false @@ -44365,7 +44406,7 @@ return Component;]]> 1 - + false @@ -44416,7 +44457,7 @@ return Component;]]> 1 - + false @@ -44455,7 +44496,7 @@ return Component;]]> true 1 - + false @@ -44506,7 +44547,7 @@ return Component;]]> 1 - + false @@ -44545,7 +44586,7 @@ return Component;]]> true 1 - + true @@ -44599,7 +44640,7 @@ return Component;]]> 2 - + false @@ -44661,7 +44702,7 @@ return Component;]]> - + false @@ -44700,7 +44741,7 @@ return Component;]]> true 1 - + true @@ -44754,7 +44795,7 @@ return Component;]]> 2 - + false @@ -44816,7 +44857,7 @@ return Component;]]> - + false @@ -44855,7 +44896,7 @@ return Component;]]> true 1 - + true @@ -44909,7 +44950,7 @@ return Component;]]> 2 - + false @@ -44973,7 +45014,7 @@ return Component;]]> - + false @@ -45012,7 +45053,7 @@ return Component;]]> true 1 - + false @@ -45052,7 +45093,7 @@ return Component;]]> 1 - + false @@ -45105,7 +45146,7 @@ return Component;]]> - + true @@ -45144,7 +45185,7 @@ return Component;]]> true 1 - + false @@ -45183,7 +45224,7 @@ return Component;]]> true 1 - + false @@ -45223,7 +45264,7 @@ return Component;]]> 1 - + false @@ -45274,7 +45315,7 @@ return Component;]]> 1 - + false @@ -45326,7 +45367,7 @@ return Component;]]> - + false @@ -45365,7 +45406,7 @@ return Component;]]> true 1 - + false @@ -45416,7 +45457,7 @@ return Component;]]> 1 - + true @@ -45470,7 +45511,7 @@ return Component;]]> true 1 - + false @@ -45531,7 +45572,7 @@ return Component;]]> 3 - + true @@ -45585,7 +45626,7 @@ return Component;]]> false 4 - + false @@ -45637,12 +45678,12 @@ return Component;]]> - + Options - + false @@ -45682,7 +45723,7 @@ return Component;]]> 1 - + false @@ -45733,7 +45774,7 @@ return Component;]]> 3 - + false @@ -45820,7 +45861,7 @@ return Component;]]> - + false @@ -45859,7 +45900,7 @@ return Component;]]> true 1 - + false @@ -45910,7 +45951,7 @@ return Component;]]> 1 - + true @@ -45964,7 +46005,7 @@ return Component;]]> true 1 - + false @@ -46025,7 +46066,7 @@ return Component;]]> 3 - + true @@ -46079,7 +46120,7 @@ return Component;]]> false 4 - + false @@ -46131,12 +46172,12 @@ return Component;]]> - + Options - + false @@ -46176,7 +46217,7 @@ return Component;]]> 1 - + false @@ -46227,7 +46268,7 @@ return Component;]]> 3 - + false @@ -46314,7 +46355,7 @@ return Component;]]> - + false @@ -46353,7 +46394,7 @@ return Component;]]> true 1 - + false @@ -46393,7 +46434,7 @@ return Component;]]> 1 - + false @@ -46446,7 +46487,7 @@ return Component;]]> - + true @@ -46485,7 +46526,7 @@ return Component;]]> true 1 - + false @@ -46524,7 +46565,7 @@ return Component;]]> true 1 - + false @@ -46564,7 +46605,7 @@ return Component;]]> 1 - + false @@ -46615,7 +46656,7 @@ return Component;]]> 1 - + false @@ -46667,7 +46708,7 @@ return Component;]]> - + false @@ -46706,7 +46747,7 @@ return Component;]]> true 1 - + false @@ -46757,7 +46798,7 @@ return Component;]]> 1 - + true @@ -46811,7 +46852,7 @@ return Component;]]> true 1 - + false @@ -46872,7 +46913,7 @@ return Component;]]> 3 - + true @@ -46926,7 +46967,7 @@ return Component;]]> false 4 - + false @@ -46978,12 +47019,12 @@ return Component;]]> - + Options - + false @@ -47023,7 +47064,7 @@ return Component;]]> 1 - + false @@ -47074,7 +47115,7 @@ return Component;]]> 3 - + false @@ -47161,7 +47202,7 @@ return Component;]]> - + false @@ -47200,7 +47241,7 @@ return Component;]]> false 1 - + false @@ -47251,7 +47292,7 @@ return Component;]]> 1 - + false @@ -47290,7 +47331,7 @@ return Component;]]> true 1 - + false @@ -47351,7 +47392,7 @@ return Component;]]> 1 - + false @@ -47391,7 +47432,7 @@ return Component;]]> 1 - + true @@ -47446,7 +47487,7 @@ return Component;]]> - + false @@ -47485,7 +47526,7 @@ return Component;]]> true 1 - + false @@ -47546,7 +47587,7 @@ return Component;]]> 1 - + false @@ -47586,7 +47627,7 @@ return Component;]]> 1 - + true @@ -47642,7 +47683,7 @@ return Component;]]> - + false @@ -47682,7 +47723,7 @@ return Component;]]> 1 - + false @@ -47721,7 +47762,7 @@ return Component;]]> true 1 - + false @@ -47772,7 +47813,7 @@ return Component;]]> 1 - + false @@ -47811,7 +47852,7 @@ return Component;]]> true 1 - + false @@ -47872,7 +47913,7 @@ return Component;]]> 1 - + false @@ -47912,7 +47953,7 @@ return Component;]]> 1 - + true @@ -47968,7 +48009,7 @@ return Component;]]> - + false @@ -48007,7 +48048,7 @@ return Component;]]> true 1 - + false @@ -48058,7 +48099,7 @@ return Component;]]> 1 - + false @@ -48097,7 +48138,7 @@ return Component;]]> true 1 - + false @@ -48137,7 +48178,7 @@ return Component;]]> 1 - + true @@ -48192,7 +48233,7 @@ return Component;]]> 2 - + false @@ -48253,7 +48294,7 @@ return Component;]]> 1 - + false @@ -48305,7 +48346,7 @@ return Component;]]> - + false @@ -48344,7 +48385,7 @@ return Component;]]> true 1 - + true @@ -48399,7 +48440,7 @@ return Component;]]> 2 - + false @@ -48460,7 +48501,7 @@ return Component;]]> 1 - + false @@ -48511,7 +48552,7 @@ return Component;]]> 1 - + false @@ -48553,7 +48594,7 @@ return Component;]]> - + false @@ -48592,7 +48633,7 @@ return Component;]]> true 1 - + false @@ -48643,7 +48684,7 @@ return Component;]]> 1 - + false @@ -48682,7 +48723,7 @@ return Component;]]> true 1 - + false @@ -48722,7 +48763,7 @@ return Component;]]> 1 - + false @@ -48762,7 +48803,7 @@ return Component;]]> 1 - + false @@ -48803,7 +48844,7 @@ return Component;]]> - + false @@ -48843,7 +48884,7 @@ return Component;]]> 1 - + true @@ -48898,7 +48939,7 @@ return Component;]]> - + false @@ -48937,7 +48978,7 @@ return Component;]]> false 1 - + true @@ -48992,7 +49033,7 @@ return Component;]]> 1 - + false @@ -49033,7 +49074,7 @@ return Component;]]> - + false @@ -49072,7 +49113,7 @@ return Component;]]> true 1 - + true @@ -49127,7 +49168,7 @@ return Component;]]> 1 - + false @@ -49168,7 +49209,7 @@ return Component;]]> - + false @@ -49220,7 +49261,7 @@ return Component;]]> - + true @@ -49259,7 +49300,7 @@ return Component;]]> true 1 - + false @@ -49298,7 +49339,7 @@ return Component;]]> true 1 - + false @@ -49338,7 +49379,7 @@ return Component;]]> 1 - + false @@ -49389,7 +49430,7 @@ return Component;]]> 1 - + false @@ -49441,7 +49482,7 @@ return Component;]]> - + false @@ -49480,7 +49521,7 @@ return Component;]]> true 1 - + true @@ -49534,7 +49575,7 @@ return Component;]]> true 1 - + false @@ -49575,7 +49616,7 @@ return Component;]]> - + true @@ -49629,7 +49670,7 @@ return Component;]]> true 1 - + false @@ -49671,7 +49712,7 @@ return Component;]]> - + false @@ -49710,7 +49751,7 @@ return Component;]]> true 1 - + false @@ -49750,7 +49791,7 @@ return Component;]]> 1 - + false @@ -49803,7 +49844,7 @@ return Component;]]> - + true @@ -49842,7 +49883,7 @@ return Component;]]> false 1 - + false @@ -49881,7 +49922,7 @@ return Component;]]> false 1 - + false @@ -49932,7 +49973,7 @@ return Component;]]> 1 - + false @@ -49983,7 +50024,7 @@ return Component;]]> 1 - + false @@ -50022,7 +50063,7 @@ return Component;]]> true 1 - + false @@ -50062,7 +50103,7 @@ return Component;]]> 1 - + false @@ -50102,7 +50143,7 @@ return Component;]]> 1 - + false @@ -50142,7 +50183,7 @@ return Component;]]> 1 - + false @@ -50182,7 +50223,7 @@ return Component;]]> 1 - + false @@ -50224,7 +50265,7 @@ return Component;]]> - + false @@ -50263,7 +50304,7 @@ return Component;]]> false 1 - + false @@ -50314,7 +50355,7 @@ return Component;]]> 1 - + false @@ -50353,7 +50394,7 @@ return Component;]]> true 1 - + false @@ -50393,7 +50434,7 @@ return Component;]]> 1 - + false @@ -50433,7 +50474,7 @@ return Component;]]> 1 - + false @@ -50473,7 +50514,7 @@ return Component;]]> 1 - + false @@ -50513,7 +50554,7 @@ return Component;]]> 1 - + false @@ -50555,7 +50596,7 @@ return Component;]]> - + false @@ -50594,7 +50635,7 @@ return Component;]]> false 1 - + true @@ -50649,7 +50690,7 @@ return Component;]]> 1 - + false @@ -50690,7 +50731,7 @@ return Component;]]> - + false @@ -50729,7 +50770,7 @@ return Component;]]> true 1 - + false @@ -50768,7 +50809,7 @@ return Component;]]> true 1 - + false @@ -50808,7 +50849,7 @@ return Component;]]> 1 - + false @@ -50848,7 +50889,7 @@ return Component;]]> 1 - + false @@ -50888,7 +50929,7 @@ return Component;]]> 1 - + false @@ -50928,7 +50969,7 @@ return Component;]]> 1 - + false @@ -50969,7 +51010,7 @@ return Component;]]> - + false @@ -51020,7 +51061,7 @@ return Component;]]> 1 - + false @@ -51059,7 +51100,7 @@ return Component;]]> true 1 - + false @@ -51099,7 +51140,7 @@ return Component;]]> 1 - + false @@ -51139,7 +51180,7 @@ return Component;]]> 1 - + false @@ -51179,7 +51220,7 @@ return Component;]]> 1 - + false @@ -51219,7 +51260,7 @@ return Component;]]> 1 - + false @@ -51260,7 +51301,7 @@ return Component;]]> - + true @@ -51314,7 +51355,7 @@ return Component;]]> true 1 - + false @@ -51356,7 +51397,7 @@ return Component;]]> - + false @@ -51434,7 +51475,7 @@ return Component;]]> - + false @@ -51473,7 +51514,7 @@ return Component;]]> false 1 - + false @@ -51512,7 +51553,7 @@ return Component;]]> false 1 - + false @@ -51552,7 +51593,7 @@ return Component;]]> 1 - + true @@ -51607,7 +51648,7 @@ return Component;]]> 1 - + true @@ -51662,7 +51703,7 @@ return Component;]]> 1 - + false @@ -51702,7 +51743,7 @@ return Component;]]> 1 - + false @@ -51741,7 +51782,7 @@ return Component;]]> true 1 - + false @@ -51792,14 +51833,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -51838,7 +51879,7 @@ return Component;]]> false 1 - + false @@ -51889,13 +51930,13 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -51947,7 +51988,7 @@ return Component;]]> - + false @@ -52002,7 +52043,7 @@ return Component;]]> - + false @@ -52041,7 +52082,7 @@ return Component;]]> false 1 - + false @@ -52081,7 +52122,7 @@ return Component;]]> 1 - + true @@ -52136,7 +52177,7 @@ return Component;]]> 1 - + true @@ -52191,7 +52232,7 @@ return Component;]]> 1 - + false @@ -52231,7 +52272,7 @@ return Component;]]> 1 - + false @@ -52270,7 +52311,7 @@ return Component;]]> true 1 - + false @@ -52321,14 +52362,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -52367,7 +52408,7 @@ return Component;]]> false 1 - + false @@ -52418,14 +52459,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52480,7 +52521,7 @@ return Component;]]> - + false @@ -52519,7 +52560,7 @@ return Component;]]> false 1 - + false @@ -52559,7 +52600,7 @@ return Component;]]> 1 - + true @@ -52614,7 +52655,7 @@ return Component;]]> 1 - + true @@ -52669,7 +52710,7 @@ return Component;]]> 1 - + false @@ -52709,7 +52750,7 @@ return Component;]]> 1 - + false @@ -52748,7 +52789,7 @@ return Component;]]> true 1 - + false @@ -52799,14 +52840,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52845,7 +52886,7 @@ return Component;]]> false 1 - + false @@ -52896,7 +52937,7 @@ return Component;]]> 1 - + false @@ -52947,14 +52988,14 @@ return Component;]]> 1 - + NotificationSize 110 - + false @@ -53009,7 +53050,7 @@ return Component;]]> - + 1 1 @@ -53022,7 +53063,7 @@ return Component;]]> 0 - + false @@ -53083,7 +53124,7 @@ return Component;]]> - + false @@ -53122,7 +53163,7 @@ return Component;]]> true 1 - + false @@ -53161,7 +53202,7 @@ return Component;]]> true 3 - + false @@ -53201,7 +53242,7 @@ return Component;]]> 3 - + false @@ -53243,7 +53284,7 @@ return Component;]]> - + false @@ -53282,7 +53323,7 @@ return Component;]]> true 1 - + false @@ -53322,7 +53363,7 @@ return Component;]]> 1 - + false @@ -53363,7 +53404,7 @@ return Component;]]> - + false @@ -53402,7 +53443,7 @@ return Component;]]> true 1 - + false @@ -53442,7 +53483,7 @@ return Component;]]> 2 - + false @@ -53481,7 +53522,7 @@ return Component;]]> true 3 - + false @@ -53521,7 +53562,7 @@ return Component;]]> 3 - + false @@ -53563,7 +53604,7 @@ return Component;]]> - + true @@ -53602,7 +53643,7 @@ return Component;]]> true 1 - + false @@ -53641,7 +53682,7 @@ return Component;]]> true 1 - + false @@ -53692,7 +53733,7 @@ return Component;]]> 1 - + true @@ -53756,7 +53797,7 @@ return Component;]]> true 1 - + false @@ -53806,7 +53847,7 @@ return Component;]]> false 10 - + false @@ -53866,7 +53907,7 @@ return Component.Start();]]> - + false @@ -53907,7 +53948,7 @@ return Component.Start();]]> - + false @@ -53947,7 +53988,7 @@ return Component.Start();]]> 1 - + false @@ -53987,7 +54028,7 @@ return Component.Start();]]> 1 - + false @@ -54026,7 +54067,7 @@ return Component.Start();]]> false 1 - + false @@ -54065,7 +54106,7 @@ return Component.Start();]]> true 1 - + false @@ -54105,7 +54146,7 @@ return Component.Start();]]> 1 - + false @@ -54145,7 +54186,7 @@ return Component.Start();]]> 1 - + false @@ -54185,7 +54226,7 @@ return Component.Start();]]> 1 - + false @@ -54225,7 +54266,7 @@ return Component.Start();]]> 1 - + false @@ -54266,7 +54307,7 @@ return Component.Start();]]> - + false @@ -54319,7 +54360,7 @@ return Component.Start();]]> true 1 - + false @@ -54358,7 +54399,7 @@ return Component.Start();]]> true 1 - + false @@ -54398,7 +54439,7 @@ return Component.Start();]]> 1 - + false @@ -54438,7 +54479,7 @@ return Component.Start();]]> 1 - + false @@ -54478,7 +54519,7 @@ return Component.Start();]]> 1 - + false @@ -54518,7 +54559,7 @@ return Component.Start();]]> 1 - + false @@ -54559,7 +54600,7 @@ return Component.Start();]]> - + false @@ -54598,7 +54639,7 @@ return Component.Start();]]> true 1 - + false @@ -54653,7 +54694,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54705,7 +54746,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54744,7 +54785,7 @@ roblox.com/library/142485815/import]]> true 1 - + false @@ -54801,7 +54842,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54853,7 +54894,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54904,7 +54945,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54957,7 +54998,7 @@ roblox.com/library/142485815/import]]> - + false @@ -55007,7 +55048,7 @@ roblox.com/library/142485815/import]]> false 10 - + false @@ -55071,7 +55112,7 @@ return Component;]]> - + true @@ -55136,7 +55177,7 @@ return Component;]]> 1 - + true @@ -55200,7 +55241,7 @@ return Component;]]> false 1 - + false @@ -55252,7 +55293,7 @@ return Component;]]> - + false @@ -55394,7 +55435,7 @@ Component.Ready = true; return Component;]]> - + false @@ -55433,7 +55474,7 @@ return Component;]]> true 1 - + false @@ -55472,7 +55513,7 @@ return Component;]]> false 1 - + false @@ -55511,7 +55552,7 @@ return Component;]]> true 1 - + false @@ -55551,7 +55592,7 @@ return Component;]]> 1 - + false @@ -55604,7 +55645,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -55657,7 +55698,7 @@ TIP: Press R while hovering over a part to copy its color.]]> - + false @@ -55696,7 +55737,7 @@ TIP: Press R while hovering over a part to copy its color.]]> false 1 - + false @@ -55735,7 +55776,7 @@ TIP: Press R while hovering over a part to copy its color.]]> true 1 - + false @@ -55775,7 +55816,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -55828,7 +55869,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55881,7 +55922,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55920,7 +55961,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55959,7 +56000,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55999,7 +56040,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -56050,7 +56091,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -56103,7 +56144,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -56142,7 +56183,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -56181,7 +56222,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -56221,7 +56262,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -56274,7 +56315,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -56327,7 +56368,7 @@ TIP: Press Enter to toggle anchor quickly.]]> - + false @@ -56366,7 +56407,7 @@ TIP: Press Enter to toggle anchor quickly.]]> false 1 - + false @@ -56405,7 +56446,7 @@ TIP: Press Enter to toggle anchor quickly.]]> true 1 - + false @@ -56445,7 +56486,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -56498,7 +56539,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -56551,7 +56592,7 @@ TIP: Click and drag where you want your part to be.]]> - + false @@ -56590,7 +56631,7 @@ TIP: Click and drag where you want your part to be.]]> false 1 - + false @@ -56629,7 +56670,7 @@ TIP: Click and drag where you want your part to be.]]> true 1 - + false @@ -56669,7 +56710,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -56724,7 +56765,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56777,7 +56818,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di - + false @@ -56816,7 +56857,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di false 1 - + false @@ -56855,7 +56896,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di true 1 - + false @@ -56895,7 +56936,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56952,7 +56993,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -57005,7 +57046,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]> - + false @@ -57044,7 +57085,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>false 1 - + false @@ -57083,7 +57124,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>true 1 - + false @@ -57123,7 +57164,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -57176,7 +57217,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57229,7 +57270,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -57268,7 +57309,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -57307,7 +57348,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -57347,7 +57388,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57398,7 +57439,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57451,7 +57492,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -57490,7 +57531,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -57529,7 +57570,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -57569,7 +57610,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -57624,7 +57665,7 @@ NOTE: This tool does not work in Roblox Studio.]]> 1 - + false @@ -57677,7 +57718,7 @@ NOTE: This tool does not work in Roblox Studio.]]> - + false @@ -57716,7 +57757,7 @@ NOTE: This tool does not work in Roblox Studio.]]> false 1 - + false @@ -57755,7 +57796,7 @@ NOTE: This tool does not work in Roblox Studio.]]> true 1 - + false @@ -57795,7 +57836,7 @@ NOTE: This tool does not work in Roblox Studio.]]> 1 - + false @@ -57848,7 +57889,7 @@ TIP: Press Enter to toggle collision quickly.]]> 1 - + false @@ -57901,7 +57942,7 @@ TIP: Press Enter to toggle collision quickly.]]> - + false @@ -58062,7 +58103,7 @@ end; return Component;]]> - + false @@ -58101,7 +58142,7 @@ return Component;]]> false 1 - + false @@ -58154,7 +58195,7 @@ return Component;]]> true 1 - + false @@ -58193,7 +58234,7 @@ return Component;]]> true 1 - + false @@ -58233,7 +58274,7 @@ return Component;]]> 1 - + false @@ -58288,7 +58329,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58339,7 +58380,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58390,7 +58431,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58442,7 +58483,7 @@ LAST - Relative to the last part selected]]> - + false @@ -58482,7 +58523,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -58521,7 +58562,7 @@ LAST - Relative to the last part selected]]> true 1 - + false @@ -58584,7 +58625,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -58636,7 +58677,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -58687,7 +58728,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -58740,7 +58781,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -58779,7 +58820,7 @@ TIP: Hit the - key to quickly type increments.]]> false 1 - + false @@ -58832,7 +58873,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -58872,7 +58913,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -58911,7 +58952,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -58974,7 +59015,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -59026,7 +59067,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen - + false @@ -59065,7 +59106,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen true 1 - + false @@ -59105,7 +59146,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -59160,7 +59201,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59211,7 +59252,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59262,7 +59303,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59314,7 +59355,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -59365,7 +59406,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59418,7 +59459,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -59457,7 +59498,7 @@ LAST - Each part around the center of the last part selected]]> false 1 - + false @@ -59510,7 +59551,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -59550,7 +59591,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -59589,7 +59630,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -59642,7 +59683,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -59694,7 +59735,7 @@ TIP: Click on a part to focus the handles on it.]]> - + false @@ -59733,7 +59774,7 @@ TIP: Click on a part to focus the handles on it.]]> true 1 - + false @@ -59784,7 +59825,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -59848,7 +59889,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -59899,7 +59940,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -59955,13 +59996,13 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + AutoUpdate true - + false @@ -60023,7 +60064,7 @@ if Model and #Model:GetChildren() > 0 then end;]]> - + -9.0008564 @@ -60060,7 +60101,7 @@ end;]]> 1 ThumbnailCamera - + true -0.5 @@ -60131,7 +60172,7 @@ end;]]> 0.200000003 - + true null @@ -60146,7 +60187,7 @@ end;]]> 0 0 - + false @@ -60208,7 +60249,7 @@ end;]]> - + false