local v0 = {};
local v1 = {};
local l_HttpService_0 = game:GetService("HttpService");
v0.Recycle = function(_, v4)
    local l_ClassName_0 = v4.ClassName;
    local v6 = v1[l_ClassName_0];
    if not v6 then
        v6 = {};
        v1[l_ClassName_0] = v6;
    end;
    local v7 = l_HttpService_0:GenerateGUID(false);
    v6[v4] = v7;
    delay(5, function()
        if v6[v4] == v7 then
            v6[v4] = nil;
            v4:Destroy();
        end;
    end);
    v4.Parent = nil;
end;
v0.RecycleObjects = function(v8, v9)
    for _, v11 in pairs(v9) do
        v8:Recycle(v11);
    end;
end;
v0.Pull = function(_, v13, v14)
    local v15 = nil;
    local v16 = v1[v13];
    if v16 then
        v15 = next(v16);
        if v15 then
            v16[v15] = nil;
        end;
    end;
    if not v15 then
        v15 = Instance.new(v13);
    end;
    if v14 then
        v15.Parent = v14;
    end;
    return v15;
end;
v0.Allocate = function(v17, v18, v19, v20)
    local v21 = {};
    local v22 = 0;
    for _, v24 in pairs(v20:GetChildren()) do
        if v24:IsA(v18) then
            v22 = v22 + 1;
            if v19 < v22 then
                v17:Recycle(v24);
            else
                v21[v22] = v24;
            end;
        end;
    end;
    while v22 < v19 do
        v22 = v22 + 1;
        v21[v22] = v17:Pull(v18, v20);
    end;
    return v21;
end;
return v0;


round = function(v0)
    return (math.floor(v0 + 0.5));
end;
roundToNearest = function(v1, v2)
    if not v2 or v2 == 0 then
        return v1;
    else
        local v3 = v1 + v2 / 2;
        return v3 - v3 % v2;
    end;
end;
roundVector3 = function(v4)
    return (Vector3.new(round(v4.X), round(v4.Y), round(v4.Z)));
end;
roundVector3ToNearest = function(v5, v6)
    return (Vector3.new(roundToNearest(v5.X, v6), roundToNearest(v5.Y, v6), roundToNearest(v5.Z, v6)));
end;
return {
    roundToNearest = roundToNearest,
    roundVector3ToNearest = roundVector3ToNearest
};


local v0 = require(script.Parent.Adornments);
local v1 = nil;
local v2 = {};
local v3 = {};
local v4 = false;
local v5 = nil;
local function v6(v7)
    if not v7:IsA("BasePart") then
        local l_v7_Children_0 = v7:GetChildren();
        for v9 = 1, #l_v7_Children_0 do
            local v10 = v6(l_v7_Children_0[v9]);
            if v10 then
                return v10;
            end;
        end;
        return nil;
    else
        return v7.CFrame;
    end;
end;
local function v11(v12, v13, v14, v15)
    local l_v12_Children_0 = v12:GetChildren();
    local l_CurrentCamera_0 = workspace.CurrentCamera;
    local v18 = v15 or {};
    for _, v20 in ipairs(l_v12_Children_0) do
        local v21 = nil;
        local v22 = false;
        if not v20:IsA("BasePart") then
            if not v20:IsA("Model") or v20:IsA("Workspace") then
                if not v20:IsA("Tool") then
                    if v20:IsA("Folder") then
                        v11(v20, v13, v14, v18);
                    end;
                else
                    v21 = v6(v20) and v21.p;
                    v22 = false;
                end;
            else
                v21 = if not v20.PrimaryPart then v20:GetModelCFrame().p else v20:GetPrimaryPartCFrame().p;
                v22 = false;
            end;
        else
            v21 = v20.CFrame.p;
            v22 = v20.Locked;
        end;
        if v21 and l_CurrentCamera_0.CoordinateFrame:pointToObjectSpace(v21).Z < 0 then
            local v23 = l_CurrentCamera_0:WorldToScreenPoint(v21);
            if (((not v22 and v23.X < math.max(v13.X, v14.X)) and math.min(v13.X, v14.X) < v23.X) and v23.Y < math.max(v13.Y, v14.Y)) and math.min(v13.Y, v14.Y) < v23.Y then
                table.insert(v18, v20);
            end;
        end;
    end;
    return v18;
end;
local function v24()
    return v4;
end;
startRubberbandDrag = function(v25)
    v4 = true;
    v0.setPlaneVisibility(false);
    v5 = v25;
    v3 = {};
    if not v1 then
        v1 = Instance.new("ScreenGui", game:GetService("CoreGui"));
        v2[1] = Instance.new("Frame", v1);
        v2[1].BorderSizePixel = 0;
        v2[1].BackgroundColor3 = Color3.new(0, 0, 0);
        v2[2] = Instance.new("Frame", v1);
        v2[2].BorderSizePixel = 0;
        v2[2].BackgroundColor3 = Color3.new(0, 0, 0);
        v2[3] = Instance.new("Frame", v1);
        v2[3].BorderSizePixel = 0;
        v2[3].BackgroundColor3 = Color3.new(0, 0, 0);
        v2[4] = Instance.new("Frame", v1);
        v2[4].BorderSizePixel = 0;
        v2[4].BackgroundColor3 = Color3.new(0, 0, 0);
    end;
end;
finishRubberbandDrag = function()
    if v4 then
        v4 = false;
        game:GetService("Selection"):Set(v3);
        v5 = nil;
        if v1 then
            v1:Destroy();
            v1 = nil;
        end;
        return ;
    else
        return ;
    end;
end;
updateRubberBand = function(v26)
    if v4 then
        local v27 = v26.X - v5.X;
        local v28 = v26.Y - v5.Y;
        v2[1].Size = UDim2.new(0, 2, 0, v28 + 2);
        v2[2].Size = UDim2.new(0, 2, 0, v28 + 2);
        v2[3].Size = UDim2.new(0, v27 + 2, 0, 2);
        v2[4].Size = UDim2.new(0, v27 + 2, 0, 2);
        v2[1].Position = UDim2.new(0, v5.X, 0, v5.Y);
        v2[2].Position = UDim2.new(0, v5.X + v27, 0, v5.Y);
        v2[3].Position = UDim2.new(0, v5.X, 0, v5.Y);
        v2[4].Position = UDim2.new(0, v5.X, 0, v5.Y + v28);
        v3 = v11(workspace, v5, v26);
        if #game:GetService("Selection"):Get() ~= #v3 then
            game:GetService("Selection"):Set(v3);
        end;
        return ;
    else
        return ;
    end;
end;
return {
    isRubberBandDragInProgress = v24,
    startRubberbandDrag = startRubberbandDrag,
    finishRubberbandDrag = finishRubberbandDrag,
    updateRubberBand = updateRubberBand
};


local v0 = require(script.Parent.Rubberband);
local v1 = require(script.Parent.Metapart);
local v2 = {};
local v3 = {};
local v4 = nil;
local function v9()
    local v5 = {};
    local v6 = 1;
    for _, v8 in ipairs(v2) do
        if not (((not v8:IsA("BasePart") and not v8:IsA("Model") or v8:IsA("Workspace")) or v8:IsA("Terrain")) or not v8:isDescendantOf(workspace)) then
            v5[v6] = v8;
            v6 = v6 + 1;
        end;
    end;
    return v5;
end;
return {
    updateSelection = function()
        v2 = game:GetService("Selection"):Get();
        if not v0.isRubberBandDragInProgress() then
            v3 = v9();
            if v4 then
                v4.Unsubscribe();
            end;
            v4 = v1.convertToPart(v3, true);
            return ;
        else
            return ;
        end;
    end,
    getCurrentSelection = function()
        return v2;
    end,
    getFilteredSelection = function()
        return v3;
    end,
    getFilteredSelectionMetapart = function()
        return v4;
    end
};


local l_StudioService_0 = game:GetService("StudioService");
local l_plugin_0 = plugin;
local _ = settings;
local l_Button_0 = l_plugin_0:CreateToolbar("Transform"):CreateButton("Transform", "Precision Dragger", "");
l_Button_0.Click:connect(function()
    l_plugin_0:Invoke("buttonClicked", "");
end);
l_plugin_0:OnInvoke("setActive", function(v4)
    l_Button_0:SetActive(v4 == "true");
end);
l_Button_0.Enabled = not l_StudioService_0.DraggerSolveConstraints;
l_StudioService_0.PromptTransformPluginCheckEnable:Connect(function()
    if l_StudioService_0.DraggerSolveConstraints then
        l_plugin_0:Invoke("Disable");
    end;
    l_Button_0.Enabled = not l_StudioService_0.DraggerSolveConstraints;
end);


min = function(...)
    local v0 = {
        ...
    };
    local v1 = nil;
    for _, v3 in ipairs(v0) do
        if v1 then
            if v3 then
                v1 = v3 < v1 and v3 or v1;
            end;
        else
            v1 = v3;
        end;
    end;
    return v1;
end;
max = function(...)
    local v4 = {
        ...
    };
    local v5 = nil;
    for _, v7 in ipairs(v4) do
        if v5 then
            if v7 then
                v5 = v5 < v7 and v7 or v5;
            end;
        else
            v5 = v7;
        end;
    end;
    return v5;
end;
minVector3 = function(...)
    local v8 = {
        ...
    };
    local v9 = nil;
    for _, v11 in ipairs(v8) do
        if v9 then
            if v11 then
                v9 = Vector3.new(min(v9.x, v11.x), min(v9.y, v11.y), min(v9.z, v11.z));
            end;
        else
            v9 = v11;
        end;
    end;
    return v9;
end;
maxVector3 = function(...)
    local v12 = {
        ...
    };
    local v13 = nil;
    for _, v15 in ipairs(v12) do
        if v13 then
            if v15 then
                v13 = Vector3.new(max(v13.x, v15.x), max(v13.y, v15.y), max(v13.z, v15.z));
            end;
        else
            v13 = v15;
        end;
    end;
    return v13;
end;
absVector3 = function(v16)
    return (Vector3.new(math.abs(v16.x), math.abs(v16.y), (math.abs(v16.z))));
end;
distanceVector3 = function(v17, v18)
    return (math.sqrt((math.pow(v18.x - v17.x, 2) + math.pow(v18.y - v17.y, 2)) + math.pow(v18.z - v17.z, 2)));
end;
cleanVector3 = function(v19, v20)
    if not v20 then
        v20 = 0;
    end;
    return (Vector3.new(v19.X == v19.X and v19.X or v20, v19.Y == v19.Y and v19.Y or v20, v19.Z == v19.Z and v19.Z or v20));
end;
local function _(v21, v22, v23)
    return (math.max(math.min(v21, v23), v22));
end;
return {
    min = min,
    max = max,
    minVector3 = minVector3,
    maxVector3 = maxVector3,
    absVector3 = absVector3,
    distanceVector3 = distanceVector3,
    cleanVector3 = cleanVector3,
    getVector3Sign = function(v25)
        return (Vector3.new(v25.X / math.abs(v25.X == 0 and 1 or v25.X), v25.Y / math.abs(v25.Y == 0 and 1 or v25.Y), v25.Z / math.abs(v25.Z == 0 and 1 or v25.Z)));
    end,
    customToSymmetric = function(v26)
        local v27 = ((v26.X ~= 0 and v26.X or v26.Y ~= 0 and v26.Y) or v26.Z ~= 0 and v26.Z) or 0;
        return (Vector3.new(v27, v27, v27));
    end,
    smoothstep = function(v28, v29, v30)
        v30 = math.max(math.min((v30 - v28) / (v29 - v28), 1), 0);
        return (v30 * v30) * (3 - 2 * v30);
    end,
    colorMultiply = function(v31, v32)
        return Color3.new(v31.r * v32, v31.g * v32, v31.b * v32);
    end,
    colorAdd = function(v33, v34)
        return Color3.new(v33.r + v34.r, v33.g + v34.g, v33.b + v34.b);
    end
};


game:DefineFastFlag("TutorialsDraggerSteps", false);
game:DefineFastFlag("TutorialsStudioTour2LaunchFix", false);
return nil;


if game:GetService("StudioService"):HasInternalPermission() then
    require(script.Parent.Parent.Common.defineLuaFlags);
    if plugin then
        local l_Parent_0 = script.Parent.Parent.Parent;
        if not require(l_Parent_0.Packages.TestLoader).isCli() then
            if game:GetFastFlag("EnableStudioTutorials") then
                local function _()
                    plugin.Name = l_Parent_0.Name;
                end;
                plugin.Name = l_Parent_0.Name;
                return ;
            else
                return ;
            end;
        else
            return ;
        end;
    else
        return ;
    end;
else
    return ;
end;


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local v2 = require(l_Parent_0.Packages.Rodux);
local l_status_0, l_result_0 = pcall(function()
    return game:GetService("TutorialService");
end);
local v5 = if not l_status_0 then nil else l_result_0;
local l_RbxAnalyticsService_0 = game:GetService("RbxAnalyticsService");
local v7 = require(l_Parent_0.Src.Flags.getFFlagTutorialsUseExtensibilityApi)();
local v8 = require(l_Parent_0.Packages.Dash);
local l_join_0 = v8.join;
local l_collect_0 = v8.collect;
local v11 = require(l_Parent_0.Packages.Framework);
local l_Dialog_0 = v11.UI.Dialog;
local l_CrossPluginCommunication_0 = v11.Util.CrossPluginCommunication;
local l_ContextServices_0 = v11.ContextServices;
local l_Mouse_0 = l_ContextServices_0.Mouse;
local l_Store_0 = l_ContextServices_0.Store;
local v17 = require(l_Parent_0.Src.Util.Telemetry.TelemetryProtocol);
local v18 = require(l_Parent_0.Src.Util.Telemetry.SkipStep);
local v19 = require(l_Parent_0.Src.Util.Telemetry.StartStep);
local v20 = require(l_Parent_0.Src.Util.Telemetry.CompleteStep);
local v21 = require(l_Parent_0.Src.Util.Telemetry.IntermediateStep);
local v22 = require(l_Parent_0.Src.Util.Telemetry.ExtraAction);
local _ = require(l_Parent_0.Src.Util.Telemetry.TelemetryProtocolTypes);
local v24 = Vector2.new(460, 300);
local l_SourceStrings_0 = l_Parent_0.Src.Resources.Localization.SourceStrings;
local l_LocalizedStrings_0 = l_Parent_0.Src.Resources.Localization.LocalizedStrings;
local v27 = require(l_Parent_0.Src.Reducers.MainReducer);
local v28 = require(l_Parent_0.Src.Resources.MakeTheme);
local v29 = require(l_Parent_0.Src.Util.Tutorial);
local l_Components_0 = l_Parent_0.Src.Components;
local v31 = require(l_Components_0.CompletedTutorialDialog);
local v32 = require(l_Components_0.HintBar);
local v33 = require(l_Components_0.TourWidget);
local v34 = v1.PureComponent:extend("AssetRoot");
v34.init = function(v35, v36)
    v35.state = {
        tutorialData = nil,
        tutorialDialogEnabled = true,
        completed = false,
        completedDialogEnabled = false,
        pressedKeys = {},
        widget = nil
    };
    v35.store = v2.Store.new(v27, nil, {
        v2.thunkMiddleware
    }, nil);
    v35.telemetry = v17.new();
    v35.localization = l_ContextServices_0.Localization.new({
        stringResourceTable = l_SourceStrings_0,
        translationResourceTable = l_LocalizedStrings_0,
        pluginName = "Tutorials",
        libraries = {
            [v11.Resources.LOCALIZATION_PROJECT_NAME] = {
                stringResourceTable = v11.Resources.SourceStrings,
                translationResourceTable = v11.Resources.LocalizedStrings
            }
        }
    });
    v35.analytics = l_ContextServices_0.Analytics.new(function()
        return {};
    end, {});
    v35.log = function(v37, v38)
        v35.telemetry:logRobloxTelemetryEvent(v37, nil, l_join_0({
            tutorialId = v35.tutorial.data.id,
            currentStep = v35.tutorial.currentStep,
            stepId = v35.tutorial:getCurrentStep().data.id,
            studioSid = l_RbxAnalyticsService_0:GetSessionId(),
            clientId = l_RbxAnalyticsService_0:GetClientId(),
            mainViewSessionId = v5:GetMainViewSessionId()
        }, v38));
    end;
    v35.toolboxConnection = l_CrossPluginCommunication_0.new("Toolbox");
    local l_FirstChild_0 = l_Parent_0.Src.Tutorials:FindFirstChild((v5:GetTutorialIDToLaunch()));
    if not (not l_FirstChild_0 or not l_FirstChild_0:IsA("ModuleScript")) then
        v35.tutorial = v29.new(game, require(l_FirstChild_0), v35.localization, v35.toolboxConnection, if not v7 then nil else v36.Plugin);
        v35:loadTutorial(v35.tutorial);
    end;
    v35.onBack = function()
        v35.tutorial:back();
    end;
    v35.onNext = function()
        v35.tutorial:increment(not v35.state.tutorialData.showNext);
    end;
    v35.onQuit = function()
        v5:PromptClosePlace();
    end;
    v35.onSelectTopic = function(v40)
        v35.tutorial:selectTopic(v40);
    end;
end;
v34.didMount = function(v41)
    if not (not (v41.tutorial.data.id ~= "StudioTour") or v41.state.widget) then
        local v42 = v41:createWidget();
        v41:setState({
            widget = v42
        });
        v41.tutorial:setWidget(v42);
    end;
    local l_Plugin_0 = v41.props.Plugin;
    v41.connection = l_Plugin_0:OnInvoke("GetPlayStep", function()
        l_Plugin_0:Invoke("SendPlayStep", v41.state.tutorialData);
    end);
end;
v34.createWidget = function(v44)
    local l_QWidgetPluginGui_0 = v44.props.Plugin:CreateQWidgetPluginGui("TourWidget", {
        Callout = true,
        MinSize = Vector2.new(275, 350),
        Modal = false,
        InitialEnabled = true,
        Size = Vector2.new(275, 350),
        Title = "TourWidget"
    });
    l_QWidgetPluginGui_0.Name = "TourWidget";
    return l_QWidgetPluginGui_0;
end;
v34.willUnmount = function(v46)
    if v46.connection then
        v46.connection:Disconnect();
    end;
end;
v34.loadTutorial = function(v47, v48)
    local l_props_0 = v47.props;
    v48.onCompleted = function()
        v47:setState({
            completed = true,
            completedDialogEnabled = true
        });
    end;
    v48.onStepChanged = function(v50)
        local l_None_0 = v1.None;
        if v50.step.kind == "Focus" then
            l_None_0 = {
                {
                    key = "F",
                    index = 1,
                    pressed = false
                }
            };
        elseif v50.step.keys then
            l_None_0 = l_collect_0(v50.step.keys, function(v52, v53)
                return v53.Name, {
                    key = v53.Name,
                    index = v52,
                    pressed = false
                };
            end);
        end;
        v47:setState({
            tutorialData = v50,
            pressedKeys = l_None_0
        });
        if v50.step.kind == "Skipped" then
            v47.log(v18);
        elseif v50.step.kind == "Completed" then
            v47.log(v20);
        else
            v47.log(v19);
        end;
        v47.props.Plugin:Invoke("SendPlayStep", v50);
    end;
    v48.onKeyPressed = function(v54)
        v47.log(v21, {
            action = "KeyPress",
            actionKeyCode = v54.Name
        });
        v47:setState(function(v55)
            local v56 = v55.pressedKeys or {};
            return {
                pressedKeys = l_join_0(v56, {
                    [v54.Name] = if not v56[v54.Name] then nil else l_join_0(v56[v54.Name], {
                        pressed = true
                    })
                })
            };
        end);
    end;
    local l_FocusedDataModelSession_0 = l_props_0.Plugin.MultipleDocumentInterfaceInstance.FocusedDataModelSession;
    v47.connection = l_FocusedDataModelSession_0.CurrentDataModelTypeChanged:Connect(function()
        if not (l_FocusedDataModelSession_0.CurrentDataModelType == Enum.StudioDataModelType.PlayClient) or not v48.startPlaying then
            if not (not (l_FocusedDataModelSession_0.CurrentDataModelType == Enum.StudioDataModelType.Edit) or not v48.stopPlaying) then
                v48.stopPlaying();
                v47.log(v22, {
                    action = "StopPlaytest"
                });
            end;
            return ;
        else
            v48.startPlaying();
            v47.log(v22, {
                action = "StartPlaytest"
            });
            return ;
        end;
    end);
    l_props_0.Plugin.Unloading:Connect(function()
        for v58 in pairs(v48.callouts) do
            v58:Destroy();
        end;
    end);
    v48:start();
    v47.tutorial.dataModel:GetService("Workspace").ChildAdded:Connect(function(v59)
        v47.log(v22, {
            action = "InsertObject",
            actionKeyCode = v59.ClassName
        });
        v59.Changed:Connect(function(v60)
            if not (v60 ~= "Color") or v60 == "Material" then
                v47.log(v22, {
                    action = "ChangeProperty",
                    actionKeyCode = v60
                });
            end;
        end);
    end);
end;
v34.render = function(v61)
    local l_props_1 = v61.props;
    local l_state_0 = v61.state;
    local l_Plugin_1 = l_props_1.Plugin;
    local l_completed_0 = l_state_0.completed;
    local l_completedDialogEnabled_0 = l_state_0.completedDialogEnabled;
    local v67 = v61.localization:getText(v61.tutorial.data.id, "Title");
    return l_ContextServices_0.provide({
        l_ContextServices_0.Plugin.new(l_Plugin_1),
        l_Store_0.new(v61.store),
        l_Mouse_0.new(l_Plugin_1:getMouse()),
        v28(),
        v61.localization,
        v61.analytics
    }, {
        View = if not l_completedDialogEnabled_0 then if l_completed_0 then nil else if v61.tutorial.data.id ~= "StudioTour" then if l_state_0.widget then v1.createElement(v33, {
            OnBack = v61.onBack,
            OnNext = v61.onNext,
            OnQuit = v61.onQuit,
            OnSelectTopic = v61.onSelectTopic,
            Plugin = if not v7 then nil else l_Plugin_1,
            PressedKeys = l_state_0.pressedKeys,
            StepData = l_state_0.tutorialData,
            Widget = l_state_0.widget
        }) else nil else v1.createElement(v32, {
            PressedKeys = l_state_0.pressedKeys,
            TutorialData = l_state_0.tutorialData,
            Title = v67,
            OnNext = function()
                v61.tutorial:increment();
            end,
            OnSkip = function()
                v61.tutorial:increment(true);
            end
        }) else v1.createElement(l_Dialog_0, {
            Title = v61.localization:getText("Completed", "Title"):format(v67),
            Enabled = l_completedDialogEnabled_0,
            Modal = true,
            Size = v24,
            OnClose = function()
                v61:setState({
                    completedDialogEnabled = false
                });
            end
        }, {
            Content = v1.createElement(v31, {
                Name = v67,
                OnClose = function()
                    v61:setState({
                        completedDialogEnabled = false
                    });
                end,
                OnReturn = function()
                    v61:setState({
                        completedDialogEnabled = false
                    });
                    v5:PromptClosePlace();
                end
            })
        })
    });
end;
return v34;


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local v2 = require(l_Parent_0.Packages.Framework);
local l_ContextServices_0 = v2.ContextServices;
local l_withContext_0 = l_ContextServices_0.withContext;
local l_Analytics_0 = l_ContextServices_0.Analytics;
local l_Localization_0 = l_ContextServices_0.Localization;
local v7 = require(l_Parent_0.Src.Util.counter);
local l_UI_0 = v2.UI;
local l_Button_0 = l_UI_0.Button;
local l_Pane_0 = l_UI_0.Pane;
local l_TextLabel_0 = l_UI_0.TextLabel;
local v12 = v1.PureComponent:extend("CompletedTutorialDialog");
v12.render = function(v13)
    local l_props_0 = v13.props;
    local l_Localization_1 = l_props_0.Localization;
    local v16 = v7();
    return v1.createElement(l_Pane_0, {
        Layout = Enum.FillDirection.Vertical,
        Padding = 50,
        Spacing = 20
    }, {
        Title = v1.createElement(l_TextLabel_0, {
            AutomaticSize = Enum.AutomaticSize.XY,
            LayoutOrder = v16(),
            Text = l_Localization_1:getText("Completed", "Title"):format(l_props_0.Name),
            Style = "Title"
        }),
        Description = v1.createElement(l_TextLabel_0, {
            AutomaticSize = Enum.AutomaticSize.XY,
            LayoutOrder = v16(),
            Text = l_Localization_1:getText("Completed", "Description"),
            TextWrapped = true,
            Style = "Subtitle"
        }),
        Row = v1.createElement(l_Pane_0, {
            AutomaticSize = Enum.AutomaticSize.XY,
            Layout = Enum.FillDirection.Horizontal,
            LayoutOrder = v16(),
            Spacing = 20
        }, {
            Dashboard = v1.createElement(l_Button_0, {
                LayoutOrder = v16(),
                Text = l_Localization_1:getText("Completed", "Back"),
                Style = "Round",
                OnClick = function()
                    v13.props.OnReturn();
                end,
                Size = UDim2.fromOffset(150, 32)
            }),
            Continue = v1.createElement(l_Button_0, {
                LayoutOrder = v16(),
                Text = l_Localization_1:getText("Completed", "Continue"),
                Style = "RoundPrimary",
                OnClick = function()
                    v13.props.OnClose();
                end,
                Size = UDim2.fromOffset(80, 32)
            })
        })
    });
end;
return (l_withContext_0({
    Analytics = l_Analytics_0,
    Localization = l_Localization_0
})(v12));


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local l_UI_0 = require(l_Parent_0.Packages.Framework).UI;
local l_Image_0 = l_UI_0.Image;
local l_Pane_0 = l_UI_0.Pane;
local l_TextLabel_0 = l_UI_0.TextLabel;
local v6 = require(l_Parent_0.Src.Util.counter);
return function(v7)
    local v8 = v6();
    return v1.createElement(l_Pane_0, {
        AutomaticSize = Enum.AutomaticSize.XY,
        Layout = Enum.FillDirection.Horizontal,
        LayoutOrder = v7.LayoutOrder,
        Padding = 20,
        Spacing = 10,
        ref = v7.PaneRef,
        [v1.Change.AbsoluteSize] = v7[v1.Change.AbsoluteSize]
    }, {
        Image = v1.createElement(l_Image_0, {
            LayoutOrder = v8(),
            Image = v7.Image,
            Size = v7.IconSize
        }),
        Text = v1.createElement(l_TextLabel_0, {
            AutomaticSize = Enum.AutomaticSize.XY,
            LayoutOrder = v8(),
            Style = "Bold",
            Text = v7.Text
        })
    });
end;


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local v2 = require(l_Parent_0.Packages.Framework);
local l_CoreGui_0 = game:GetService("CoreGui");
local l_ContextServices_0 = v2.ContextServices;
local l_withContext_0 = l_ContextServices_0.withContext;
local l_Stylizer_0 = l_ContextServices_0.Stylizer;
local l_Localization_0 = l_ContextServices_0.Localization;
local v8 = require(l_Parent_0.Src.Components.HintKeys);
local v9 = require(l_Parent_0.Src.Util.counter);
local l_UI_0 = v2.UI;
local l_Button_0 = l_UI_0.Button;
local l_Image_0 = l_UI_0.Image;
local l_LoadingBar_0 = l_UI_0.LoadingBar;
local l_Pane_0 = l_UI_0.Pane;
local l_TextLabel_0 = l_UI_0.TextLabel;
local v16 = v1.PureComponent:extend("HintBar");
v16.init = function(v17)
    v17.guiRef = v1.createRef();
end;
v16.didMount = function(v18)
    local l_Tutorial_0 = l_CoreGui_0:FindFirstChild("Tutorial");
    if l_Tutorial_0 then
        l_Tutorial_0:Destroy();
    end;
    v18.guiRef.current.Parent = l_CoreGui_0;
end;
v16.render = function(v20)
    local l_props_0 = v20.props;
    local l_Localization_1 = l_props_0.Localization;
    local v23 = v9();
    local l_TutorialData_0 = l_props_0.TutorialData;
    local v25 = if not l_TutorialData_0 then nil else l_TutorialData_0.step;
    local v26 = v25 and v25.kind == "Dialog";
    local l_PressedKeys_0 = l_props_0.PressedKeys;
    return v1.createElement("ScreenGui", {
        Name = "Tutorial",
        ref = v20.guiRef
    }, {
        Content = if not (not v25 or v25.callout) and v25.kind ~= "Playtest" then v1.createElement(l_Pane_0, {
            AnchorPoint = if not v26 then Vector2.new(0.5, 1) else Vector2.new(0.5, 0.5),
            ClipsDescendants = true,
            AutomaticSize = Enum.AutomaticSize.XY,
            Layout = Enum.FillDirection.Vertical,
            Style = "Box",
            BackgroundTransparency = 0.05,
            Spacing = 20,
            Position = if not v26 then UDim2.new(0.5, 0, 1, -48) else UDim2.fromScale(0.5, 0.5)
        }, {
            Corner = v1.createElement("UICorner", {
                CornerRadius = UDim.new(0, 16)
            }),
            MaxSize = v1.createElement("UISizeConstraint", {
                MaxSize = Vector2.new(500, 500)
            }),
            Hint = v1.createElement(l_Pane_0, {
                AutomaticSize = Enum.AutomaticSize.XY,
                Layout = Enum.FillDirection.Vertical,
                Padding = 20,
                Spacing = 20
            }, {
                Tick = if v25.kind == "Completed" then v1.createElement(l_Image_0, {
                    LayoutOrder = v23(),
                    Image = "rbxasset://textures/Tutorials/Tick.png",
                    Size = UDim2.fromOffset(52, 52)
                }) else nil,
                Keys = if not l_PressedKeys_0 then nil else v1.createElement(v8, {
                    LayoutOrder = v23(),
                    PressedKeys = l_PressedKeys_0
                }),
                Title = if not not v25.title and v25.kind == "Dialog" then v1.createElement(l_TextLabel_0, {
                    AutomaticSize = Enum.AutomaticSize.XY,
                    LayoutOrder = v23(),
                    TextWrapped = true,
                    Text = v25.title,
                    Font = Enum.Font.SourceSansBold,
                    TextSize = 26
                }) else nil,
                Subtitle = if not v25.description then nil else v1.createElement(l_TextLabel_0, {
                    AutomaticSize = Enum.AutomaticSize.XY,
                    LayoutOrder = v23(),
                    Text = v25.description,
                    TextSize = 22,
                    TextWrapped = true,
                    RichText = true
                }),
                ButtonRow = if not (v25.kind ~= "Dialog") or v25.showNext then v1.createElement(l_Pane_0, {
                    AutomaticSize = Enum.AutomaticSize.XY,
                    Layout = Enum.FillDirection.Horizontal,
                    LayoutOrder = v23(),
                    Spacing = 20
                }, {
                    Next = v1.createElement(l_Button_0, {
                        LayoutOrder = v23(),
                        Text = v25.nextText or l_Localization_1:getText("Tutorial", "Begin"),
                        Style = "RoundPrimary",
                        OnClick = l_props_0.OnNext,
                        Size = UDim2.fromOffset(80, 32)
                    })
                }) else nil
            })
        }) else nil,
        ProgressRow = l_TutorialData_0 and v1.createElement(l_Pane_0, {
            AnchorPoint = Vector2.new(0, 1),
            AutomaticSize = Enum.AutomaticSize.Y,
            BackgroundTransparency = 0.05,
            Layout = Enum.FillDirection.Horizontal,
            Position = UDim2.fromScale(0, 1),
            Padding = 5,
            Spacing = 10,
            Size = UDim2.fromScale(1, 0),
            Style = "Box"
        }, {
            Name = v1.createElement(l_TextLabel_0, {
                AutomaticSize = Enum.AutomaticSize.XY,
                Style = "Subtitle",
                Text = l_props_0.Title
            }),
            Progress = v1.createElement(l_LoadingBar_0, {
                LayoutOrder = v23(),
                Progress = (l_TutorialData_0.currentStep - 1) / l_TutorialData_0.stepCount,
                Size = UDim2.new(1, -300, 0, 20)
            }),
            Skip = v1.createElement(l_Button_0, {
                LayoutOrder = v23(),
                Text = l_Localization_1:getText("Tutorial", "SkipStep"),
                Style = "Round",
                OnClick = l_props_0.OnSkip,
                Size = UDim2.fromOffset(80, 32)
            })
        })
    });
end;
return (l_withContext_0({
    Localization = l_Localization_0,
    Stylizer = l_Stylizer_0
})(v16));


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local l_map_0 = require(l_Parent_0.Packages.Dash).map;
local v3 = require(l_Parent_0.Packages.Framework);
local l_Pane_0 = v3.UI.Pane;
local l_Stylizer_0 = v3.ContextServices.Stylizer;
local function v8(v6)
    local v7 = l_Stylizer_0:use("HintKeys");
    return v1.createElement("TextLabel", {
        AutomaticSize = Enum.AutomaticSize.XY,
        BackgroundColor3 = if not v6.Pressed then v7.HintKeyBackground else v7.HintKeyBackgroundPressed,
        Font = Enum.Font.SourceSansBold,
        LayoutOrder = v6.LayoutOrder,
        Size = UDim2.fromOffset(32, 32),
        Text = v6.Key == "LeftControl" and "Ctrl" or v6.Key,
        TextColor3 = if not v6.Pressed then v7.HintKeyTextColor else v7.HintKeyTextColorPressed,
        TextSize = 24
    }, {
        Corner = v1.createElement("UICorner", {
            CornerRadius = UDim.new(0, 8)
        }),
        Padding = v1.createElement("UIPadding", {
            PaddingLeft = UDim.new(0, 5),
            PaddingTop = UDim.new(0, 5),
            PaddingRight = UDim.new(0, 5),
            PaddingBottom = UDim.new(0, 5)
        }),
        Stroke = v1.createElement("UIStroke", {
            ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
            Color = if not v6.Pressed then v7.HintKeyBorder else v7.HintKeyBorderPressed,
            Thickness = 5
        })
    });
end;
return function(v9)
    return v1.createElement(l_Pane_0, {
        AutomaticSize = Enum.AutomaticSize.XY,
        Layout = Enum.FillDirection.Horizontal,
        LayoutOrder = v9.LayoutOrder,
        Padding = 10,
        Spacing = 20
    }, (l_map_0(v9.PressedKeys, function(v10)
        return v1.createElement(v8, {
            Key = v10.key,
            LayoutOrder = v10.index,
            Pressed = v10.pressed
        });
    end)));
end;


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local v2 = require(l_Parent_0.Packages.Framework);
local l_ContextServices_0 = v2.ContextServices;
local l_Mouse_0 = l_ContextServices_0.Mouse;
local l_Localization_0 = l_ContextServices_0.Localization;
local l_SourceStrings_0 = l_Parent_0.Src.Resources.Localization.SourceStrings;
local l_LocalizedStrings_0 = l_Parent_0.Src.Resources.Localization.LocalizedStrings;
local v8 = require(l_Parent_0.Src.Resources.MakeTheme);
local v9 = require(l_Parent_0.Src.Components.TourWidget);
local v10 = require(l_Parent_0.Src.Flags.getFFlagTutorialsUseExtensibilityApi)();
local v11 = {
    DataModel = "PlayClient",
    PluginType = "Standalone",
    PluginId = "Tutorials",
    Category = "Panels",
    ItemId = "PlaytestWidget"
};
local v12 = {
    PluginId = "MainWindow",
    Category = "Widgets",
    ItemId = "Main"
};
local v13 = v1.PureComponent:extend("PlayRoot");
v13.init = function(v14)
    v14.state = {
        stepData = nil,
        widget = nil
    };
    v14.localization = l_Localization_0.new({
        stringResourceTable = l_SourceStrings_0,
        translationResourceTable = l_LocalizedStrings_0,
        pluginName = "Tutorials",
        libraries = {
            [v2.Resources.LOCALIZATION_PROJECT_NAME] = {
                stringResourceTable = v2.Resources.SourceStrings,
                translationResourceTable = v2.Resources.LocalizedStrings
            }
        }
    });
end;
v13.didMount = function(v15)
    local l_Plugin_0 = v15.props.Plugin;
    local l_l_Plugin_0_QWidgetPluginGui_0 = l_Plugin_0:CreateQWidgetPluginGui(if not v10 then l_Plugin_0.Name .. "_Avatar" else "PlaytestWidget", {
        Size = Vector2.new(275, 350),
        MinSize = Vector2.new(275, 350),
        Modal = false,
        Callout = true,
        InitialEnabled = true
    });
    local l_StudioWidgetsService_0 = game:GetService("StudioWidgetsService");
    local v19 = nil;
    local v20 = nil;
    if not v10 then
        v20 = l_StudioWidgetsService_0:GetWidgetFromLabel("ideDocDocumentPanel");
        v19 = Instance.new("StudioAttachment");
        v19.IsArrowVisible = false;
        v19.SourceAnchorPoint = Vector2.new(0, 0);
        v19.TargetAnchorPoint = Vector2.new(0, 0);
        v19.Offset = Vector2.new(20, 20);
    else
        l_l_Plugin_0_QWidgetPluginGui_0.Name = "PlaytestWidget";
    end;
    v15.connection = l_Plugin_0:OnInvoke("SendPlayStep", function(v21)
        v15:setState({
            stepData = v21
        });
        if not v10 then
            l_StudioWidgetsService_0:AttachPluginGui(v20, l_l_Plugin_0_QWidgetPluginGui_0, v19);
            return ;
        else
            l_Plugin_0:GetPluginComponent("Panels"):SetAttachment(v11, {
                TargetWidgetUri = v12,
                SubjectAnchorPoint = Vector2.new(0, 0),
                TargetAnchorPoint = Vector2.new(0, 0),
                Offset = Vector2.new(20, 20)
            });
            return ;
        end;
    end);
    v15:setState({
        widget = l_l_Plugin_0_QWidgetPluginGui_0
    });
    l_Plugin_0:Invoke("GetPlayStep");
end;
v13.willUnmount = function(v22)
    if v22.connection then
        v22.connection:Disconnect();
    end;
end;
v13.render = function(v23)
    local l_props_0 = v23.props;
    local l_state_0 = v23.state;
    local l_Plugin_1 = l_props_0.Plugin;
    if not v10 or l_state_0.widget then
        return l_ContextServices_0.provide({
            l_ContextServices_0.Plugin.new(l_Plugin_1),
            l_Mouse_0.new(l_Plugin_1:getMouse()),
            v8(),
            v23.localization
        }, {
            Tour = v1.createElement(v9, {
                OnNext = function()
                end,
                OnSkip = function()
                    l_Plugin_1:Invoke("SkipStep");
                end,
                OnQuit = function()
                    game:GetService("TutorialService"):PromptClosePlace();
                end,
                Plugin = if not v10 then nil else l_Plugin_1,
                PressedKeys = {},
                StepData = l_state_0.stepData,
                Widget = l_state_0.widget
            })
        });
    else
        return nil;
    end;
end;
return v13;


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Packages.React);
local v2 = game:DefineFastFlag("StudioTourFixIconButtonAlignment", false);
local v3 = require(l_Parent_0.Src.Flags.getFFlagTutorialsUseExtensibilityApi)();
local v4 = require(l_Parent_0.Packages.Framework);
local l_ContextServices_0 = v4.ContextServices;
local l_withContext_0 = l_ContextServices_0.withContext;
local l_Stylizer_0 = l_ContextServices_0.Stylizer;
local l_Localization_0 = l_ContextServices_0.Localization;
local _ = require(l_Parent_0.Src.Util.TutorialTypes);
local l_UI_0 = v4.UI;
local l_DockWidget_0 = l_UI_0.DockWidget;
local l_IconButton_0 = l_UI_0.IconButton;
local l_PaginationDots_0 = l_UI_0.PaginationDots;
local l_Pane_0 = l_UI_0.Pane;
local l_StyledDialog_0 = l_UI_0.StyledDialog;
local l_Separator_0 = l_UI_0.Separator;
local l_TextLabel_0 = l_UI_0.TextLabel;
local v18 = require(l_Parent_0.Src.Components.Compliment);
local v19 = require(l_Parent_0.Src.Components.HintKeys);
local v20 = require(l_Parent_0.Src.Util.counter);
local l_join_0 = require(l_Parent_0.Packages.Dash).join;
local l_insert_0 = table.insert;
local v23 = v1.PureComponent:extend("TourWidget");
v23.init = function(v24)
    v24.state = {
        showTopics = false,
        jumpToTopic = nil
    };
    v24.windowRef = v1.createRef();
    v24.complimentRef = v1.createRef();
    v24.lastSize = nil;
    v24.onClose = not v3 and function()
        v24.props.OnQuit();
    end or nil;
    v24.onToggleTopics = function()
        v24:setState({
            showTopics = not v24.state.showTopics
        });
    end;
    v24.onSelectTopic = function(v25)
        if v25 < v24.props.StepData.topic then
            v24.props.OnSelectTopic(v25);
            v24:setState({
                showTopics = false,
                jumpToTopic = v1.None
            });
            return ;
        else
            v24:setState({
                jumpToTopic = v25
            });
            return ;
        end;
    end;
    v24.onJumpDialogAction = function(v26)
        if v26 == "accept" then
            v24.props.OnSelectTopic(v24.state.jumpToTopic);
            v24:setState({
                showTopics = false,
                jumpToTopic = v1.None
            });
            return ;
        else
            v24:setState({
                jumpToTopic = v1.None
            });
            return ;
        end;
    end;
    v24.onAbsoluteSizeChanged = function()
        local v27 = nil;
        local v28 = 0;
        if v24.complimentRef.current ~= nil then
            v27 = v24.complimentRef;
        else
            v27 = v24.windowRef;
            v28 = 275;
        end;
        if v27.current then
            if v24.lastSize ~= v27.current.AbsoluteSize then
                local l_AbsoluteSize_0 = v27.current.AbsoluteSize;
                l_AbsoluteSize_0 = Vector2.new(math.max(v28, l_AbsoluteSize_0.X), l_AbsoluteSize_0.Y);
                if not v3 then
                    game:GetService("StudioWidgetsService"):GetWidgetFromPluginGui(v24.props.Widget):SetFixedSize(l_AbsoluteSize_0.X, l_AbsoluteSize_0.Y);
                    v24.lastSize = l_AbsoluteSize_0;
                else
                    local l_props_0 = v24.props;
                    local l_Plugin_0 = l_props_0.Plugin;
                    l_Plugin_0:GetPluginComponent("Panels"):SetSize(l_join_0(l_Plugin_0:GetUri(), {
                        Category = "Panels",
                        ItemId = l_props_0.Widget.Name
                    }), l_AbsoluteSize_0);
                    return ;
                end;
            end;
            return ;
        else
            return ;
        end;
    end;
end;
v23.getTopicList = function(v32, v33)
    local l_props_1 = v32.props;
    local l_Localization_1 = l_props_1.Localization;
    local l_Stylizer_1 = l_props_1.Stylizer;
    local v37 = {};
    local v38 = v20();
    local l_StepData_0 = l_props_1.StepData;
    for v40, v41 in l_StepData_0.topics, nil, nil do
        local v42 = v40 == v33;
        local v43 = if not v42 then l_Stylizer_1.TopicTextColor else l_Stylizer_1.SelectedTopicTextColor;
        l_insert_0(v37, v1.createElement(l_Pane_0, {
            Layout = Enum.FillDirection.Horizontal,
            HorizontalAlignment = Enum.HorizontalAlignment.Left,
            Spacing = l_Stylizer_1.PaddingSmall,
            Size = UDim2.new(1, 0, 0, l_Stylizer_1.CircleSize + l_Stylizer_1.PaddingSmall)
        }, {
            Number = v1.createElement(l_Pane_0, {
                BackgroundColor3 = l_Stylizer_1.CircleColor,
                Padding = l_Stylizer_1.PaddingSmall,
                Size = UDim2.fromOffset(l_Stylizer_1.CircleSize, l_Stylizer_1.CircleSize)
            }, {
                Corner = v1.createElement("UICorner", {
                    CornerRadius = UDim.new(0, l_Stylizer_1.CircleSize)
                }),
                Text = v1.createElement(l_TextLabel_0, {
                    AnchorPoint = Vector2.new(0.5, 0.5),
                    AutomaticSize = Enum.AutomaticSize.XY,
                    Font = Enum.Font.SourceSansBold,
                    Position = UDim2.fromScale(0.5, 0.5),
                    Text = ("%d"):format(v40),
                    TextColor = v43
                })
            }),
            Title = v1.createElement(l_IconButton_0, {
                AutomaticSize = Enum.AutomaticSize.XY,
                Cursor = not v42 and "PointingHand" or nil,
                Disabled = v42,
                DisabledTextColor = v43,
                OnClick = function()
                    v32.onSelectTopic(v40);
                end,
                LayoutOrder = v38(),
                Style = "IconOnly",
                Text = l_Localization_1:getText(l_StepData_0.id, "topic_" .. v41),
                TextColor = v43
            })
        }));
    end;
    return v37;
end;
v23.render = function(v44)
    local l_props_2 = v44.props;
    local l_state_0 = v44.state;
    local v47 = v20();
    local l_Stylizer_2 = l_props_2.Stylizer;
    local l_Localization_2 = l_props_2.Localization;
    local l_StepData_1 = l_props_2.StepData;
    if l_StepData_1 then
        local l_step_0 = l_StepData_1.step;
        if l_step_0 then
            local v52 = l_step_0.kind == "Completed";
            local v53 = l_step_0.kind == "Skipped";
            return v1.createElement(l_DockWidget_0, {
                OnClose = if not v3 then v44.onClose else nil,
                ShouldRestore = true,
                Title = not v3 and "" or l_props_2.Widget.Name,
                Widget = l_props_2.Widget
            }, {
                Window = if not (v52 or v53) then v44:renderWindow() else v1.createElement(v18, {
                    IconSize = l_Stylizer_2.IconSize,
                    Image = l_Stylizer_2.CheckmarkImage,
                    LayoutOrder = v47(),
                    Text = if not v53 then l_Localization_2:getText(l_StepData_1.id, ("%s_Compliment"):format(l_step_0.id)) else l_step_0.description,
                    PaneRef = v44.complimentRef,
                    [v1.Change.AbsoluteSize] = v44.onAbsoluteSizeChanged
                }),
                Dialog = v1.createElement(l_StyledDialog_0, {
                    Buttons = {
                        {
                            Key = "accept",
                            Text = l_Localization_2:getText("Tutorial", "Skip")
                        },
                        {
                            Key = "cancel",
                            Text = l_Localization_2:getText("Tutorial", "Back")
                        }
                    },
                    Enabled = l_state_0.jumpToTopic ~= nil,
                    MinContentSize = Vector2.new(450, 100),
                    Modal = true,
                    OnClose = v44.onJumpDialogAction,
                    OnButtonPressed = v44.onJumpDialogAction,
                    Size = UDim2.fromOffset(450, 100),
                    Style = "AcceptCancel",
                    Title = l_Localization_2:getText(l_StepData_1.id, "Title")
                }, {
                    Content = v1.createElement(l_Pane_0, {
                        HorizontalAlignment = Enum.HorizontalAlignment.Left,
                        Layout = Enum.FillDirection.Vertical,
                        Spacing = 20
                    }, {
                        Title = v1.createElement(l_TextLabel_0, {
                            AutomaticSize = Enum.AutomaticSize.XY,
                            LayoutOrder = v47(),
                            Style = "Title",
                            Text = l_Localization_2:getText("SkipDialog", "Title"),
                            TextXAlignment = Enum.TextXAlignment.Left
                        }),
                        Text = v1.createElement(l_TextLabel_0, {
                            AutomaticSize = Enum.AutomaticSize.Y,
                            LayoutOrder = v47(),
                            Size = UDim2.fromScale(1, 0),
                            Text = l_Localization_2:getText("SkipDialog", "Text"),
                            TextWrapped = true,
                            TextXAlignment = Enum.TextXAlignment.Left
                        })
                    })
                })
            });
        else
            return nil;
        end;
    else
        return nil;
    end;
end;
v23.renderWindow = function(v54)
    local l_props_3 = v54.props;
    local l_state_1 = v54.state;
    local v57 = v20();
    local l_StepData_2 = l_props_3.StepData;
    local l_step_1 = l_StepData_2.step;
    local l_Stylizer_3 = l_props_3.Stylizer;
    local l_Localization_3 = l_props_3.Localization;
    local v62 = l_Localization_3:getText(l_StepData_2.id, "topic_" .. l_StepData_2.topics[l_StepData_2.topic]);
    local v63 = l_Localization_3:getText("Tutorial", "TopicNumber"):format(l_StepData_2.topic, #l_StepData_2.topics);
    local l_PressedKeys_0 = l_props_3.PressedKeys;
    local l_showNext_0 = l_StepData_2.showNext;
    local v66 = false;
    if l_StepData_2.topic == 1 then
        v66 = l_StepData_2.topicStep == 1;
    end;
    return v1.createElement(l_Pane_0, {
        AutomaticSize = Enum.AutomaticSize.Y,
        Layout = Enum.FillDirection.Vertical,
        HorizontalAlignment = Enum.HorizontalAlignment.Left,
        Padding = l_Stylizer_3.Padding,
        Spacing = l_Stylizer_3.Padding,
        Style = "Box",
        VerticalAlignment = Enum.VerticalAlignment.Top,
        ref = v54.windowRef,
        [v1.Change.AbsoluteSize] = v54.onAbsoluteSizeChanged
    }, {
        TopicBar = v1.createElement(l_Pane_0, {
            AutomaticSize = Enum.AutomaticSize.Y,
            Layout = Enum.FillDirection.Horizontal,
            LayoutOrder = v57(),
            Size = UDim2.fromScale(1, 0),
            Spacing = l_Stylizer_3.PaddingSmall
        }, {
            CurrentTopic = v1.createElement(l_Pane_0, {
                AutomaticSize = Enum.AutomaticSize.Y,
                HorizontalAlignment = Enum.HorizontalAlignment.Left,
                LayoutOrder = v57(),
                Layout = Enum.FillDirection.Vertical,
                Size = UDim2.new(1, -60, 0, 0),
                Spacing = l_Stylizer_3.PaddingSmall
            }, {
                TopicNumber = v1.createElement(l_TextLabel_0, {
                    AutomaticSize = Enum.AutomaticSize.XY,
                    LayoutOrder = v57(),
                    Text = v63,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Style = "Label"
                }),
                TopicName = v1.createElement(l_TextLabel_0, {
                    AutomaticSize = Enum.AutomaticSize.XY,
                    LayoutOrder = v57(),
                    Text = v62,
                    TextXAlignment = Enum.TextXAlignment.Left,
                    Style = "Semibold"
                })
            }),
            List = v1.createElement(l_IconButton_0, {
                Cursor = "PointingHand",
                OnClick = v54.onToggleTopics,
                LayoutOrder = v57(),
                LeftIcon = if not l_state_1.showTopics then l_Stylizer_3.ListImage else l_Stylizer_3.ListSelectedImage,
                Size = l_Stylizer_3.IconSize,
                Style = "IconOnly",
                Text = not v2 and "" or nil
            }),
            Close = v1.createElement(l_IconButton_0, {
                Cursor = "PointingHand",
                OnClick = v54.props.OnQuit,
                LayoutOrder = v57(),
                LeftIcon = l_Stylizer_3.CloseImage,
                Size = l_Stylizer_3.IconSize,
                Style = "IconOnly",
                Text = not v2 and "" or nil
            })
        }),
        Separator = v1.createElement(l_Separator_0, {
            LayoutOrder = v57()
        }),
        Scroller = v1.createElement(l_Pane_0, {
            AutomaticSize = Enum.AutomaticSize.Y,
            HorizontalAlignment = Enum.HorizontalAlignment.Left,
            Layout = Enum.FillDirection.Vertical,
            LayoutOrder = v57(),
            Padding = 0,
            Spacing = UDim.new(0, l_Stylizer_3.Padding)
        }, if not l_state_1.showTopics then {
            StepTitle = if not l_step_1.title then nil else v1.createElement(l_TextLabel_0, {
                AutomaticSize = Enum.AutomaticSize.XY,
                LayoutOrder = v57(),
                Style = "Title",
                Text = l_step_1.title
            }),
            StepDescription = v1.createElement(l_TextLabel_0, {
                AutomaticSize = Enum.AutomaticSize.Y,
                LayoutOrder = v57(),
                RichText = true,
                Size = UDim2.fromScale(1, 0),
                Text = l_step_1.description,
                TextWrapped = true,
                TextXAlignment = Enum.TextXAlignment.Left
            }),
            Keys = if not l_PressedKeys_0 then nil else v1.createElement(v19, {
                LayoutOrder = v57(),
                PressedKeys = l_PressedKeys_0
            })
        } else v54:getTopicList(l_StepData_2.topic)),
        NavigationRow = v1.createElement(l_Pane_0, {
            AutomaticSize = Enum.AutomaticSize.Y,
            LayoutOrder = v57()
        }, {
            Back = if v66 then nil else v1.createElement(l_IconButton_0, {
                AutomaticSize = Enum.AutomaticSize.XY,
                Cursor = "PointingHand",
                OnClick = l_props_3.OnBack,
                LayoutOrder = v57(),
                Style = "Link",
                Text = l_Localization_3:getText("Tutorial", "Back")
            }),
            PaginationDots = v1.createElement(l_Pane_0, {
                AnchorPoint = Vector2.new(0.5, 0.5),
                HorizontalAlignment = Enum.HorizontalAlignment.Center,
                Layout = Enum.FillDirection.Horizontal,
                Position = UDim2.fromScale(0.5, 0.5),
                VerticalAlignment = Enum.VerticalAlignment.Center
            }, {
                Child = v1.createElement(l_PaginationDots_0, {
                    Count = l_StepData_2.topicStepCount,
                    OnSelected = function()
                    end,
                    SelectedIndex = l_StepData_2.topicStep
                })
            }),
            Next = v1.createElement(l_IconButton_0, {
                AnchorPoint = Vector2.new(1, 0),
                AutomaticSize = Enum.AutomaticSize.XY,
                Cursor = "PointingHand",
                LayoutOrder = v57(),
                OnClick = l_props_3.OnNext,
                Position = UDim2.fromScale(1, 0),
                Style = not l_showNext_0 and "Link" or "Primary",
                Text = if not l_showNext_0 then l_Localization_3:getText("Tutorial", "Skip") else l_Localization_3:getText("Plugin", "Next")
            })
        })
    });
end;
return (l_withContext_0({
    Localization = l_Localization_0,
    Stylizer = l_Stylizer_0
})(v23));


return function()
    return game:DefineFastFlag("TutorialsUseExtensibilityApi", false);
end;


return function()
    return game:DefineFastFlag("TutorialsUseLuaRibbon", false);
end;


local l_Style_0 = require(script.Parent.Parent.Parent.Packages.Framework).Style;
local l_StudioTheme_0 = l_Style_0.Themes.StudioTheme;
local l_StyleKey_0 = l_Style_0.StyleKey;
local v3 = {
    ContentHeight = UDim2.new(1, 0, 1, -130),
    SelectedTopicTextColor = l_StyleKey_0.MainText,
    TopicTextColor = l_StyleKey_0.SubText,
    CircleColor = l_StyleKey_0.ForegroundContrast,
    CircleSize = 24,
    HintKeyBorder = l_StyleKey_0.SubText,
    HintKeyBackground = l_StyleKey_0.ForegroundContrast,
    HintKeyBorderPressed = l_StyleKey_0.MainText,
    HintKeyBackgroundPressed = l_StyleKey_0.SubText,
    HintKeyTextColor = l_StyleKey_0.MainText,
    HintKeyTextColorPressed = l_StyleKey_0.TextContrast,
    IconSize = UDim2.fromOffset(16, 16),
    Padding = 15,
    PaddingSmall = 5
};
local v4 = {
    CheckmarkImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Light/Standard/Checkmark.png",
    ListSelectedImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Light/Standard/List-Selected.png",
    ListImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Light/Standard/List.png",
    CloseImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Light/Standard/Close.png"
};
local v5 = {
    CheckmarkImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Dark/Standard/Checkmark.png",
    ListSelectedImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Dark/Standard/List-Selected.png",
    ListImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Dark/Standard/List.png",
    CloseImage = "rbxasset://studio_svg_textures/Lua/Tutorials/Dark/Standard/Close.png"
};
return function(v6)
    local _ = nil;
    return (if not v6 then l_StudioTheme_0.new(v5, v4) else l_StudioTheme_0.mock()):extend(v3);
end;


return {
    id = "StudioTour",
    steps = {
        {
            id = "welcome",
            kind = "Dialog"
        },
        {
            id = "parts",
            kind = "Insert",
            callout = {
                target = "placePartAction",
                anchorPoint = Vector2.new(0.5, 0)
            },
            className = "Part",
            widgets = "Ribbon-Home"
        },
        {
            id = "focus",
            kind = "Focus",
            onBind = function()
                game:GetService("TutorialService"):SetTutorialCompletionStatus(true);
            end
        },
        {
            id = "color",
            kind = "Edit",
            callout = {
                target = "actionColorSelector",
                anchorPoint = Vector2.new(0.5, 0)
            },
            className = "Part",
            changes = {
                Color = true
            },
            widgets = "Ribbon-Home"
        },
        {
            id = "moveCamera",
            kind = "Input",
            keys = {
                Enum.KeyCode.W,
                Enum.KeyCode.A,
                Enum.KeyCode.S,
                Enum.KeyCode.D
            }
        },
        {
            id = "panCamera",
            kind = "Input",
            keys = {
                Enum.KeyCode.E,
                Enum.KeyCode.Q
            }
        },
        {
            id = "zoomCamera",
            kind = "Input",
            inputs = {
                Enum.UserInputType.MouseWheel
            }
        },
        {
            id = "rotateCamera",
            kind = "Input",
            inputs = {
                Enum.UserInputType.MouseButton2
            },
            keys = {
                Enum.KeyCode.LeftControl
            }
        },
        {
            id = "explorer",
            callout = {
                target = "explorerWidgetPanel",
                hideArrow = true
            },
            showNext = true,
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "workspace",
            path = "Workspace",
            callout = {
                target = "explorerWidgetPanel",
                rowName = "Workspace",
                hideArrow = true
            },
            showNext = true,
            onBind = function(v0)
                local l_dataModel_0 = v0.dataModel;
                l_dataModel_0:GetService("Selection"):Set({
                    l_dataModel_0:GetService("Workspace")
                });
            end,
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "select",
            kind = "Select",
            path = "Part",
            callout = {
                target = "explorerWidgetPanel",
                rowName = "Part",
                hideArrow = true
            },
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "properties",
            callout = {
                target = "propertiesWidgetPanel",
                hideArrow = true
            },
            showNext = true,
            widgets = "Ribbon-Home,Explorer,Properties"
        },
        {
            id = "material",
            kind = "Edit",
            callout = {
                target = "propertiesWidgetPanel",
                hideArrow = true
            },
            className = "Part",
            changes = {
                Material = true
            },
            widgets = "Ribbon-Home,Explorer,Properties"
        },
        {
            id = "playtest",
            kind = "Playtest",
            widgets = "Ribbon-Home"
        }
    }
};


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = game:DefineFastFlag("StudioTourCarSpeed", false);
local l_LabelRibbonControlGroups_0 = game:GetFastFlag("LabelRibbonControlGroups");
local v3 = require(l_Parent_0.Src.Flags.getFFlagTutorialsUseExtensibilityApi)();
local v4 = require(l_Parent_0.Src.Flags.getFFlagTutorialsUseLuaRibbon)();
local l_Workspace_0 = game:GetService("Workspace");
local v6 = Vector3.new(362.373, 4.115, 247.495);
local v7 = {
    assetIds = {
        14215126016
    },
    positionOverride = v6,
    scriptWarningOverride = true
};
local v8 = Vector3.new(360, 1.5, 216);
local v9 = Vector3.new(364, 3.6, 216);
local v10 = Vector3.new(343, 1.5, 250);
local function v17(_)
    local l_Car_0 = l_Workspace_0:FindFirstChild("Car");
    if not l_Car_0 then
        local l_InsertService_0 = game:GetService("InsertService");
        local l_status_0, l_result_0 = pcall(function()
            return l_InsertService_0:LoadAsset(14215126016);
        end);
        if not l_status_0 or not l_result_0 then
            return nil;
        else
            local l_Car_1 = l_result_0:FindFirstChild("Car");
            l_Car_1.PrimaryPart.Position = v6;
            l_Car_1.Parent = l_Workspace_0;
            return l_Car_1;
        end;
    else
        return l_Car_0;
    end;
end;
local function v21(v18)
    local l_Part_0 = l_Workspace_0:FindFirstChild("Part");
    if l_Part_0 and l_Part_0.Shape == Enum.PartType.Wedge then
        v18.instances.wedge = l_Part_0;
        return l_Part_0;
    else
        local l_Part_1 = Instance.new("Part");
        l_Part_1.Shape = Enum.PartType.Wedge;
        l_Part_1.Position = v8;
        l_Part_1.Parent = l_Workspace_0;
        v18.instances.wedge = l_Part_1;
        return l_Part_1;
    end;
end;
return {
    id = "StudioTour2",
    onStart = function(v22)
        v22.instances.camera = l_Workspace_0.CurrentCamera;
        for _, v24 in l_Workspace_0:GetDescendants() do
            if v24:IsA("BasePart") then
                v24.Locked = true;
            end;
        end;
    end,
    onComplete = function(_)
        for _, v27 in l_Workspace_0:GetDescendants() do
            if v27:IsA("BasePart") then
                v27.Locked = false;
            end;
        end;
    end,
    steps = {
        {
            id = "moveCamera",
            kind = "Input",
            keys = {
                Enum.KeyCode.W,
                Enum.KeyCode.A,
                Enum.KeyCode.S,
                Enum.KeyCode.D
            },
            topic = "navigation",
            widgets = ""
        },
        {
            id = "panCamera",
            kind = "Input",
            keys = {
                Enum.KeyCode.E,
                Enum.KeyCode.Q
            },
            topic = "navigation"
        },
        {
            id = "zoomCamera",
            kind = "Input",
            inputs = {
                Enum.UserInputType.MouseWheel
            },
            topic = "navigation"
        },
        {
            id = "rotateCamera",
            kind = "Rotate",
            topic = "navigation",
            instanceId = "camera"
        },
        {
            id = "marketplace",
            topic = "marketplace",
            widgets = "Toolbox",
            showNext = true,
            spotlight = {
                target = "edit_builtin_Toolbox.rbxm_Toolbox",
                showBox = true,
                showHighlight = true,
                showShadows = true
            },
            toolboxLimits = v7
        },
        {
            id = "searchMarketplace",
            kind = "ToolboxSearch",
            search = "car",
            toolboxLimits = v7,
            topic = "marketplace",
            widgets = "Toolbox"
        },
        {
            id = "insertMarketplace",
            kind = "ToolboxInsert",
            toolboxLimits = v7,
            topic = "marketplace",
            onSkip = function(v28)
                v17(v28);
            end,
            widgets = "Toolbox"
        },
        {
            id = "wedge",
            kind = "Insert",
            topic = "parts",
            callout = if not v4 then {
                target = not l_LabelRibbonControlGroups_0 and "Insert" or "placePartActionRibbonControl",
                offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(5, -20) else Vector2.new(0, 5)
            } else {
                TargetWidgetUri = {
                    DataModel = "Standalone",
                    PluginType = "Standalone",
                    PluginId = "Ribbon",
                    Category = "Widgets",
                    ItemId = "Tabs/Home/Part"
                },
                Offset = Vector2.new(5, 20)
            },
            spotlight = if not v4 then {
                target = not l_LabelRibbonControlGroups_0 and "Insert" or "placePartActionRibbonControl",
                showHighlight = true
            } else nil,
            instanceId = "wedge",
            className = "Part",
            properties = {
                Shape = Enum.PartType.Wedge
            },
            onBind = function()
                game:GetService("TutorialService"):SetTutorialCompletionStatus(true);
            end,
            onSkip = function(v29)
                local v30 = v21(v29);
                if v30 then
                    v30.Position = v10;
                end;
            end,
            onUnbind = function(v31)
                local v32 = v21(v31);
                task.delay(0.1, function()
                    v32.Position = v10;
                end);
            end,
            hideWidgets = "Toolbox",
            widgets = "Ribbon-Home"
        },
        {
            id = "move",
            kind = "Move",
            topic = "parts",
            callout = if not v4 then {
                target = "advTranslateAction",
                offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(0, -5) else Vector2.new(0, 5)
            } else {
                TargetWidgetUri = {
                    DataModel = "Standalone",
                    PluginType = "Standalone",
                    PluginId = "Ribbon",
                    Category = "Widgets",
                    ItemId = "Tabs/Home/Move"
                },
                Offset = Vector2.new(0, 20)
            },
            spotlight = if not v4 then {
                target = "advTranslateAction",
                showHighlight = true
            } else nil,
            position = Vector3.new(360, 1, 200),
            distance = 20,
            instanceId = "wedge",
            onSkip = function(v33)
                local v34 = v21(v33);
                if v34 then
                    v34.Position = v8;
                end;
            end,
            widgets = "Ribbon-Home"
        },
        {
            id = "rotate",
            kind = "Rotate",
            topic = "parts",
            callout = if not v4 then {
                target = "advRotateAction",
                offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(0, -5) else Vector2.new(0, 5)
            } else {
                TargetWidgetUri = {
                    DataModel = "Standalone",
                    PluginType = "Standalone",
                    PluginId = "Ribbon",
                    Category = "Widgets",
                    ItemId = "Tabs/Home/Rotate"
                },
                Offset = Vector2.new(0, 20)
            },
            spotlight = if not v4 then {
                target = "advRotateAction",
                showHighlight = true
            } else nil,
            rotation = Vector3.new(180, 0, 180),
            distance = 30,
            instanceId = "wedge",
            onSkip = function(v35)
                local v36 = v21(v35);
                if v36 then
                    v36.Rotation = Vector3.new(180, 0, 180);
                end;
            end,
            widgets = "Ribbon-Home"
        },
        {
            id = "scale",
            kind = "Scale",
            topic = "parts",
            callout = if not v4 then {
                target = "resizeAction",
                offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(0, -5) else Vector2.new(0, 5)
            } else {
                TargetWidgetUri = {
                    DataModel = "Standalone",
                    PluginType = "Standalone",
                    PluginId = "Ribbon",
                    Category = "Widgets",
                    ItemId = "Tabs/Home/Scale"
                },
                Offset = Vector2.new(0, 20)
            },
            spotlight = if not v4 then {
                target = "resizeAction",
                showHighlight = true
            } else nil,
            minSize = Vector3.new(5, 3, 5),
            instanceId = "wedge",
            onSkip = function(v37)
                local v38 = v21(v37);
                if v38 then
                    v38.Position = v9;
                    v38.Size = Vector3.new(15, 5, 15);
                end;
            end,
            widgets = "Ribbon-Home"
        },
        {
            id = "color",
            kind = "Edit",
            topic = "properties",
            callout = if not v4 then {
                target = "actionColorSelector",
                offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(0, -5) else Vector2.new(0, 5)
            } else {
                TargetWidgetUri = {
                    DataModel = "Standalone",
                    PluginType = "Standalone",
                    PluginId = "Ribbon",
                    Category = "Widgets",
                    ItemId = "Tabs/Home/Color"
                },
                Offset = Vector2.new(5, 20)
            },
            spotlight = if not v4 then {
                target = "actionColorSelector",
                showHighlight = true
            } else nil,
            className = "Part",
            changes = {
                Color = true
            },
            onSkip = function(v39)
                local v40 = v21(v39);
                if v40 then
                    v40.Color = Color3.fromRGB(129, 246, 136);
                end;
            end,
            widgets = "Ribbon-Home"
        },
        {
            id = "anchor",
            kind = "Edit",
            topic = "properties",
            callout = if not v4 then {
                target = "anchorAction",
                offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(0, -5) else Vector2.new(0, 5)
            } else {
                TargetWidgetUri = {
                    DataModel = "Standalone",
                    PluginType = "Standalone",
                    PluginId = "Ribbon",
                    Category = "Widgets",
                    ItemId = "Tabs/Home/Anchor"
                },
                Offset = Vector2.new(0, -5)
            },
            spotlight = if not v3 then {
                target = "anchorAction",
                showHighlight = true
            } else nil,
            className = "Part",
            changes = {
                Anchored = true
            },
            onSkip = function(v41)
                local v42 = v21(v41);
                if v42 then
                    v42.Anchored = true;
                end;
            end,
            widgets = "Ribbon-Home"
        },
        {
            id = "explorer",
            callout = if not v3 then {
                target = "explorerWidgetPanel",
                sourceAnchorPoint = Vector2.new(1, 0),
                targetAnchorPoint = Vector2.new(0, 0),
                offset = Vector2.new(-10, 20),
                hideArrow = true
            } else {
                TargetWidgetUri = {
                    PluginId = "Explorer",
                    Category = "Widgets",
                    ItemId = "Main"
                },
                SubjectAnchorPoint = Vector2.new(1, 0),
                TargetAnchorPoint = Vector2.new(0, 0),
                Offset = Vector2.new(-10, 20)
            },
            spotlight = if not v3 then {
                target = "explorerWidgetPanel",
                showBox = true,
                showHighlight = true,
                showShadows = true
            } else nil,
            topic = "explorer",
            showNext = true,
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "workspace",
            path = "Workspace",
            topic = "explorer",
            callout = if not v3 then {
                target = "explorerWidgetPanel",
                rowName = "Workspace",
                sourceAnchorPoint = Vector2.new(1, 0),
                targetAnchorPoint = Vector2.new(0, 0),
                offset = Vector2.new(-10, 20),
                hideArrow = true
            } else {
                TargetWidgetUri = {
                    PluginId = "Explorer",
                    Category = "Widgets",
                    ItemId = "Main"
                },
                SubjectAnchorPoint = Vector2.new(1, 0),
                TargetAnchorPoint = Vector2.new(0, 0),
                Offset = Vector2.new(-10, 20)
            },
            spotlight = if not v3 then {
                target = "explorerWidgetPanel",
                rowName = "Workspace",
                showBox = true,
                showHighlight = true,
                showShadows = true
            } else nil,
            showNext = true,
            onBind = function(v43)
                local l_dataModel_0 = v43.dataModel;
                l_dataModel_0:GetService("Selection"):Set({
                    l_dataModel_0:GetService("Workspace")
                });
            end,
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "select",
            kind = "Select",
            path = "Car",
            topic = "selection",
            callout = if not v3 then {
                target = "explorerWidgetPanel",
                sourceAnchorPoint = Vector2.new(1, 0),
                targetAnchorPoint = Vector2.new(0, 0),
                offset = Vector2.new(-10, 0),
                hideArrow = true
            } else {
                TargetWidgetUri = {
                    PluginId = "Explorer",
                    Category = "Widgets",
                    ItemId = "Main"
                },
                SubjectAnchorPoint = Vector2.new(1, 0),
                TargetAnchorPoint = Vector2.new(0, 0),
                Offset = Vector2.new(-10, 0)
            },
            onSkip = function(v45)
                local v46 = v17(v45);
                if v46 then
                    game:GetService("Selection"):Set({
                        v46
                    });
                end;
            end,
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "focus",
            topic = "selection",
            kind = "Focus",
            onSkip = function(v47)
                local v48 = v17(v47);
                if v48 then
                    game:GetService("Selection"):Set({
                        v48
                    });
                end;
            end,
            widgets = "Ribbon-Home,Explorer"
        },
        {
            id = "properties",
            topic = "attributes",
            callout = if not v3 then {
                target = "propertiesWidgetPanel",
                sourceAnchorPoint = Vector2.new(1, 1),
                targetAnchorPoint = Vector2.new(0, 1),
                offset = Vector2.new(-10, 0),
                hideArrow = true
            } else {
                TargetWidgetUri = {
                    PluginId = "Properties",
                    Category = "Widgets",
                    ItemId = "Main"
                },
                SubjectAnchorPoint = Vector2.new(1, 1),
                TargetAnchorPoint = Vector2.new(0, 1),
                Offset = Vector2.new(-10, 0)
            },
            spotlight = if not v3 then {
                target = "propertiesWidgetPanel",
                showBox = true,
                showHighlight = true,
                showShadows = true
            } else nil,
            showNext = true,
            widgets = "Ribbon-Home,Explorer,Properties"
        },
        {
            id = "maxSpeed",
            topic = "attributes",
            kind = "Edit",
            callout = if not v3 then {
                target = "propertiesWidgetPanel",
                sourceAnchorPoint = Vector2.new(1, 1),
                targetAnchorPoint = Vector2.new(0, 1),
                offset = Vector2.new(-10, 0),
                hideArrow = true
            } else {
                TargetWidgetUri = {
                    PluginId = "Properties",
                    Category = "Widgets",
                    ItemId = "Main"
                },
                SubjectAnchorPoint = Vector2.new(1, 1),
                TargetAnchorPoint = Vector2.new(0, 1),
                Offset = Vector2.new(-10, 0)
            },
            className = "Model",
            changes = {
                Attributes = {
                    MaxSpeed = true
                }
            },
            onSkip = function(v49)
                local v50 = v17(v49);
                if v50 then
                    v50:SetAttribute("MaxSpeed", not v1 and 250 or 60);
                end;
            end,
            widgets = "Ribbon-Home,Explorer,Properties"
        },
        {
            id = "playtest",
            topic = "playtest",
            kind = "StartPlaytest",
            widgets = "Ribbon-Home,Explorer,Properties",
            spotlight = if not v3 then if l_LabelRibbonControlGroups_0 then {
                target = "playGameActionGroupRibbonControl",
                showHighlight = true
            } else nil else nil
        },
        {
            id = "avatar",
            topic = "playtest",
            kind = "Avatar",
            state = Enum.HumanoidStateType.Seated,
            widgets = "Ribbon-Home,Explorer,Properties"
        },
        {
            id = "stopPlaytest",
            topic = "playtest",
            kind = "StopPlaytest",
            widgets = "Ribbon-Home,Explorer,Properties"
        }
    }
};


local v0 = require(script.Parent.TelemetryProtocol);
return {
    eventName = "StudioTutorialCompleteStep",
    backends = {
        v0.TelemetryBackends.EventIngest
    },
    throttlingPercentage = v0.ONE_HUNDRED_PERCENT,
    lastUpdated = {
        23,
        6,
        22
    },
    description = "Complete a step in a Studio Tutorial.",
    links = "https://roblox.atlassian.net/wiki/spaces/developer/pages/2076443597/Onboarding+API+Discussion"
};


local v0 = require(script.Parent.TelemetryProtocol);
return {
    eventName = "StudioTutorialExtraAction",
    backends = {
        v0.TelemetryBackends.EventIngest
    },
    throttlingPercentage = v0.ONE_HUNDRED_PERCENT,
    lastUpdated = {
        23,
        7,
        3
    },
    description = "Perform an extra action in a Studio Tutorial.",
    links = "https://roblox.atlassian.net/wiki/spaces/developer/pages/2076443597/Onboarding+API+Discussion"
};


local v0 = require(script.Parent.TelemetryProtocol);
return {
    eventName = "StudioTutorialIntermediateStep",
    backends = {
        v0.TelemetryBackends.EventIngest
    },
    throttlingPercentage = v0.ONE_HUNDRED_PERCENT,
    lastUpdated = {
        23,
        6,
        22
    },
    description = "Make intermediate progress during a step in a Studio Tutorial.",
    links = "https://roblox.atlassian.net/wiki/spaces/developer/pages/2076443597/Onboarding+API+Discussion"
};


local v0 = require(script.Parent.TelemetryProtocol);
return {
    eventName = "StudioTutorialSkipStep",
    backends = {
        v0.TelemetryBackends.EventIngest
    },
    throttlingPercentage = v0.ONE_HUNDRED_PERCENT,
    lastUpdated = {
        23,
        6,
        14
    },
    description = "Skip a step in a Studio Tutorial.",
    links = "https://roblox.atlassian.net/wiki/spaces/developer/pages/2076443597/Onboarding+API+Discussion"
};


local v0 = require(script.Parent.TelemetryProtocol);
return {
    eventName = "StudioTutorialStartStep",
    backends = {
        v0.TelemetryBackends.EventIngest
    },
    throttlingPercentage = v0.ONE_HUNDRED_PERCENT,
    lastUpdated = {
        23,
        6,
        14
    },
    description = "Start a step in a Studio Tutorial.",
    links = "https://roblox.atlassian.net/wiki/spaces/developer/pages/2076443597/Onboarding+API+Discussion"
};


local l_Parent_0 = script.Parent.Parent.Parent.Parent.Parent;
local v1 = require(script.Parent.TutorialStep).extend("Avatar");
v1.showComplete = true;
v1.bind = function(v2)
    v2.connection = l_Parent_0:OnInvoke("ChangeHumanoidState", function(v3)
        if v3 == v2.data.state then
            v2:complete();
        end;
    end);
end;
v1.unbind = function(v4)
    v4.connection:Disconnect();
end;
return v1;


local v0 = require(script.Parent.TutorialStep).extend("Dialog");
v0.bind = function(_)
end;
v0.unbind = function(_)
end;
return v0;


local l_some_0 = require(script.Parent.Parent.Parent.Parent.Packages.Dash).some;
local l_TutorialsDraggerSteps_0 = game:GetFastFlag("TutorialsDraggerSteps");
local l_insert_0 = table.insert;
local v3 = require(script.Parent.TutorialStep).extend("Edit");
v3.showComplete = true;
v3.bind = function(v4)
    local l_Workspace_0 = v4.tutorial.dataModel:GetService("Workspace");
    v4.connections = {};
    v4.watches = {};
    l_insert_0(v4.connections, (v4.tutorial:syncChildren(l_Workspace_0, v4.data.className, function(v6)
        local v7 = {};
        for v8, v9 in v4.data.changes, nil, nil do
            if l_TutorialsDraggerSteps_0 and v8 == "Attributes" then
                v7.Attributes = {};
                for v10 in v9, nil, nil do
                    v7.Attributes[v10] = v6:GetAttribute(v10);
                end;
            else
                v7[v8] = v6[v8];
            end;
        end;
        l_insert_0(v4.watches, {
            instance = v6,
            initialValues = v7
        });
        l_insert_0(v4.connections, v6.Changed:Connect(function()
            v4:update();
        end));
    end)));
end;
v3.update = function(v11)
    if l_some_0(v11.watches, function(v12)
        return not l_some_0(v11.data.changes, function(v13, v14)
            if l_TutorialsDraggerSteps_0 and v14 == "Attributes" then
                return (l_some_0(v13, function(v15, v16)
                    if v15 == true then
                        return v12.instance:GetAttribute(v16) == v12.initialValues.Attributes[v16];
                    else
                        return v12.instance:GetAttribute(v16) ~= v13;
                    end;
                end));
            elseif v13 == true then
                return v12.instance[v14] == v12.initialValues[v14];
            else
                return v12.instance[v14] ~= v13;
            end;
        end);
    end) then
        v11:complete();
    end;
end;
v3.unbind = function(v17)
    for _, v19 in ipairs(v17.connections) do
        v19:Disconnect();
    end;
end;
return v3;


local v0 = require(script.Parent.TutorialStep).extend("Focus");
v0.showComplete = true;
v0.bind = function(v1)
    v1.connection = v1.tutorial.dataModel:GetService("Workspace").CurrentCamera.Changed:Connect(function(...)
        v1:complete();
    end);
end;
v0.unbind = function(v2)
    v2.connection:Disconnect();
end;
return v0;


local l_Parent_0 = script.Parent.Parent.Parent.Parent;
local v1 = require(script.Parent.TutorialStep);
local l_some_0 = require(l_Parent_0.Packages.Dash).some;
local v3 = v1.extend("Input");
v3.showComplete = true;
v3.bind = function(v4)
    local l_UserInputService_0 = v4.tutorial.dataModel:GetService("UserInputService");
    v4.keys = {};
    if v4.data.keys then
        v4.hasKeys = true;
        for _, v7 in ipairs(v4.data.keys) do
            v4.keys[v7] = false;
        end;
    end;
    v4.inputs = {};
    if v4.data.inputs then
        v4.hasInputs = true;
        for _, v9 in ipairs(v4.data.inputs) do
            v4.inputs[v9] = false;
        end;
    end;
    v4.inputBeganConnection = l_UserInputService_0.InputBegan:Connect(function(v10)
        if v10.UserInputType == Enum.UserInputType.Keyboard then
            if v4.keys[v10.KeyCode] == false then
                v4.keys[v10.KeyCode] = true;
                v4.tutorial.onKeyPressed(v10.KeyCode);
                v4:update();
                return ;
            end;
        elseif v4.inputs[v10.UserInputType] == false then
            v4.inputs[v10.UserInputType] = true;
            v4:update();
        end;
    end);
    v4.inputChangedConnection = l_UserInputService_0.InputChanged:Connect(function(v11)
        if v11.UserInputType == Enum.UserInputType.Keyboard then
            if v4.keys[v11.KeyCode] == false then
                v4.keys[v11.KeyCode] = true;
                v4:update();
                return ;
            end;
        elseif v4.inputs[v11.UserInputType] == false then
            v4.inputs[v11.UserInputType] = true;
            v4:update();
        end;
    end);
end;
v3.update = function(v12)
    if not (not v12.hasKeys or l_some_0(v12.keys, function(v13)
        return v13 == false;
    end)) then
        v12:complete();
    end;
    if not (not v12.hasInputs or l_some_0(v12.inputs, function(v14)
        return v14 == false;
    end)) then
        v12:complete();
    end;
end;
v3.unbind = function(v15)
    v15.inputBeganConnection:Disconnect();
    v15.inputChangedConnection:Disconnect();
end;
return v3;


local v0 = require(script.Parent.TutorialStep);
local l_TutorialsDraggerSteps_0 = game:GetFastFlag("TutorialsDraggerSteps");
local v2 = v0.extend("Insert");
v2.showComplete = true;
v2.bind = function(v3)
    v3.connection = v3.tutorial.dataModel:GetService("Workspace").ChildAdded:Connect(function(v4)
        if v4:IsA(v3.data.className) then
            if not (not l_TutorialsDraggerSteps_0 or not v3.data.properties) then
                for v5, v6 in v3.data.properties, nil, nil do
                    if v4[v5] ~= v6 then
                        return ;
                    end;
                end;
            end;
            if v3.data.instanceId then
                v3.tutorial.instances[v3.data.instanceId] = v4;
            end;
            v3:complete();
        end;
    end);
end;
v2.unbind = function(v7)
    v7.connection:Disconnect();
end;
return v2;


local v0 = require(script.Parent.TutorialStep).extend("Move");
v0.showComplete = true;
v0.bind = function(v1)
    local v2 = v1.tutorial.instances[v1.data.instanceId];
    if v2 then
        v1.connection = v2:GetPropertyChangedSignal("Position"):Connect(function()
            if (v2:GetPivot().Position - v1.data.position).Magnitude < v1.data.distance then
                v1:complete();
            end;
        end);
    end;
end;
v0.unbind = function(v3)
    if v3.connection then
        v3.connection:Disconnect();
    end;
end;
return v0;


local v0 = require(script.Parent.TutorialStep).extend("Playtest");
v0.bind = function(v1)
    v1.tutorial.startPlaying = function()
        v1.callout:Destroy();
        v1.callout = v1.tutorial:showCallout({
            title = v1.tutorial.localization:getText("Tutorial", "StopPlaytest_Title"),
            description = v1.tutorial.localization:getText("Tutorial", "StopPlaytest_Description"),
            target = "simulationResetAction",
            anchorPoint = Vector2.new(0.5, 0)
        });
    end;
    v1.tutorial.stopPlaying = function()
        v1:complete();
    end;
    v1.callout = v1.tutorial:showCallout({
        title = v1.data.title,
        description = v1.data.description,
        target = "playGameActionGroup",
        anchorPoint = Vector2.new(0.5, 0)
    });
end;
v0.unbind = function(v2)
    v2.callout:Destroy();
    v2.tutorial.startPlaying = nil;
    v2.tutorial.stopPlaying = nil;
end;
return v0;


local v0 = require(script.Parent.TutorialStep).extend("Rotate");
v0.showComplete = true;
v0.bind = function(v1)
    local v2 = v1.tutorial.instances[v1.data.instanceId];
    if v2 then
        local l_LookVector_0 = v2.CFrame.LookVector;
        v1.connection = v2:GetPropertyChangedSignal("CFrame"):Connect(function()
            if l_LookVector_0 == v2.CFrame.LookVector then
                return ;
            else
                if not v1.data.distance then
                    v1:complete();
                else
                    local l_rotation_0 = v1.data.rotation;
                    if math.deg((math.acos((v2.CFrame.LookVector:Dot(CFrame.Angles(math.rad(l_rotation_0.X), math.rad(l_rotation_0.Y), (math.rad(l_rotation_0.Z))).LookVector))))) < v1.data.distance then
                        v1:complete();
                        return ;
                    end;
                end;
                return ;
            end;
        end);
    end;
end;
v0.unbind = function(v5)
    if v5.connection then
        v5.connection:Disconnect();
    end;
end;
return v0;


local v0 = require(script.Parent.TutorialStep).extend("Scale");
v0.showComplete = true;
v0.bind = function(v1)
    local v2 = v1.tutorial.instances[v1.data.instanceId];
    if v2 then
        v1.connection = v2:GetPropertyChangedSignal("Size"):Connect(function()
            local l_Size_0 = v2.Size;
            local l_minSize_0 = v1.data.minSize;
            if (l_minSize_0.X <= l_Size_0.X and l_minSize_0.Y <= l_Size_0.Y) and l_minSize_0.Z <= l_Size_0.Z then
                v1:complete();
            end;
        end);
    end;
end;
v0.unbind = function(v5)
    if v5.connection then
        v5.connection:Disconnect();
    end;
end;
return v0;


local v0 = require(script.Parent.TutorialStep).extend("Select");
v0.showComplete = true;
v0.bind = function(v1)
    local l_Selection_0 = v1.tutorial.dataModel:GetService("Selection");
    v1.connection = l_Selection_0.SelectionChanged:Connect(function()
        for _, v4 in ipairs(l_Selection_0:Get()) do
            if v4.Name == v1.data.path then
                v1:complete();
            end;
        end;
    end);
end;
v0.unbind = function(v5)
    v5.connection:Disconnect();
end;
return v0;


local v0 = require(script.Parent:FindFirstAncestor("Tutorials").Src.Flags.getFFlagTutorialsUseLuaRibbon)();
local l_LabelRibbonControlGroups_0 = game:GetFastFlag("LabelRibbonControlGroups");
local v2 = require(script.Parent.TutorialStep).extend("StartPlaytest");
v2.bind = function(v3)
    v3.tutorial.startPlaying = function()
        v3:complete();
    end;
    v3.tutorial:attachTo(if not v0 then {
        target = not l_LabelRibbonControlGroups_0 and "simulationToggleAccuratePlaySoloAction" or "playGameActionGroupRibbonControl",
        offset = if not l_LabelRibbonControlGroups_0 then Vector2.new(-35, 50) else Vector2.new(0, 5)
    } else {
        TargetWidgetUri = {
            DataModel = "Standalone",
            PluginType = "Standalone",
            PluginId = "Ribbon",
            Category = "Widgets",
            ItemId = "LeftMezzanine/PlayControls/1"
        },
        SubjectAnchorPoint = Vector2.new(0, 0),
        TargetAnchorPoint = Vector2.new(0, 1),
        Offset = Vector2.new(0, 20)
    });
end;
v2.unbind = function(v4)
    v4.tutorial.startPlaying = nil;
end;
return v2;


local v0 = require(script.Parent.TutorialStep).extend("StopPlaytest");
v0.bind = function(v1)
    v1.tutorial.stopPlaying = function()
        v1:complete();
    end;
    v1.tutorial:resetAttachment();
end;
v0.unbind = function(v2)
    v2.tutorial.stopPlaying = nil;
end;
return v0;


local v0 = require(script.Parent.TutorialStep).extend("ToolboxInsert");
v0.showComplete = true;
v0.bind = function(v1)
    local l_toolboxConnection_0 = v1.tutorial.toolboxConnection;
    l_toolboxConnection_0:ensureEventExists("AssetInserted");
    v1.connection = l_toolboxConnection_0:Connect("AssetInserted", function(_)
        v1:complete();
    end);
end;
v0.unbind = function(v4)
    v4.connection:Disconnect();
end;
return v0;


local v0 = require(script.Parent.TutorialStep).extend("ToolboxSearch");
v0.bind = function(v1)
    local l_toolboxConnection_0 = v1.tutorial.toolboxConnection;
    l_toolboxConnection_0:ensureEventExists("SearchRequested");
    v1.connection = l_toolboxConnection_0:Connect("SearchRequested", function(_)
        v1:complete();
    end);
end;
v0.unbind = function(v4)
    v4.connection:Disconnect();
end;
return v0;


local _ = require(script.Parent.Parent.Parent.Parent.Src.Util.TutorialTypes);
local v1 = {};
local v2 = {
    __index = v1
};
v1.new = function(v3, v4)
    return (setmetatable({
        tutorial = v3,
        data = v4,
        completed = false
    }, v2));
end;
v1.bind = function()
end;
v1.unbind = function()
end;
v1.extend = function(v5)
    local v6 = {
        kind = v5
    };
    setmetatable(v6, v2);
    local v7 = {
        __index = v6
    };
    v6.new = function(v8, v9)
        return (setmetatable(v1.new(v8, v9), v7));
    end;
    return v6;
end;
v1.complete = function(v10)
    v10.completed = true;
    if v10.tutorial:getCurrentStep() == v10 then
        v10.tutorial:increment();
    end;
end;
return v1;


local v0 = {};
for _, v2 in ipairs(script:GetChildren()) do
    if v2:IsA("ModuleScript") then
        local v3 = require(v2);
        if v3.kind then
            v0[v3.kind] = v3;
        end;
    end;
end;
return v0;


local l_Parent_0 = script.Parent.Parent.Parent;
local v1 = require(l_Parent_0.Src.Components.PlayRoot);
local v2 = require(l_Parent_0.Packages.React);
local v3 = require(l_Parent_0.Packages.ReactRoblox);
return function(v4)
    while game.Players.LocalPlayer == nil do
        game.Players:GetPropertyChangedSignal("LocalPlayer"):Wait();
    end;
    local l_LocalPlayer_0 = game.Players.LocalPlayer;
    local v6 = (l_LocalPlayer_0.Character or l_LocalPlayer_0.CharacterAdded:Wait()):WaitForChild("Humanoid", 20);
    if v6 then
        v6.StateChanged:Connect(function(_, v8)
            v4:Invoke("ChangeHumanoidState", v8);
        end);
    end;
    local v9 = v3.createRoot(Instance.new("Frame"));
    v9:render(v2.createElement(v1, {
        Plugin = v4
    }));
    return v9;
end;