Created
August 4, 2024 18:54
-
-
Save AndrewHazelden/2f473b7042a485bcb8d4ca7e82a5df5e to your computer and use it in GitHub Desktop.
Gradient Data Nodes.comp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Composition { | |
CurrentTime = 2, | |
RenderRange = { 1, 144 }, | |
GlobalRange = { 1, 144 }, | |
CurrentID = 81, | |
HiQ = true, | |
PlaybackUpdateMode = 0, | |
StereoMode = false, | |
Version = "Fusion Studio 19.0 build 44", | |
SavedOutputs = 1, | |
HeldTools = 0, | |
DisabledTools = 0, | |
LockedTools = 0, | |
AudioOffset = 0, | |
AutoRenderRange = true, | |
Resumable = true, | |
OutputClips = { | |
}, | |
Tools = { | |
Background1 = Background { | |
Inputs = { | |
GlobalIn = Input { Value = 1, }, | |
GlobalOut = Input { Value = 144, }, | |
Width = Input { Value = 1920, }, | |
Height = Input { Value = 1080, }, | |
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, }, | |
Type = Input { Value = FuID { "Gradient" }, }, | |
Gradient = Input { | |
SourceOp = "vGradientDoString1", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { 165, 82.5 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
vGradientDoString1 = Fuse.vGradientDoString { | |
CtrlWZoom = false, | |
NameSet = true, | |
CurrentSettings = 2, | |
CustomData = { | |
Settings = { | |
[1] = { | |
Tools = ordered() { | |
vGradientDoString3_1 = Fuse.vGradientDoString { | |
Inputs = { | |
Input = Input { Value = "local grad = {}\nlocal totalColors = 32\n\nfor index = 0, totalColors, 1 do\n local R = math.cos(index / totalColors)\n local G = 0\n local B = 0\n local A = 1\n\n table.insert(grad, {P = tonumber(index / totalColors), R = tonumber(R), G = tonumber(G), B = tonumber(B), A = tonumber(A)})\nend\n\nreturn grad\n" }, | |
ShowDump = Input { Value = 1 }, | |
DisplayLines = Input { Value = 38 }, | |
ShowCode = Input { Value = 1 } | |
}, | |
CtrlWZoom = false, | |
ViewInfo = OperatorInfo { Pos = { 650.386, 149.306 } }, | |
CustomData = { | |
} | |
} | |
} | |
} | |
} | |
}, | |
Inputs = { | |
Input = Input { Value = "-- Create a sinewave like curve as the gradient output\nlocal grad = {}\nlocal totalColors = 32\n\nlocal height = 0.25\nlocal offset = 0.5\n\nfor index = 0, totalColors, 1 do\n local R = math.sin(index) * height + offset\n local G = 0\n local B = index / totalColors\n local A = 1\n\n table.insert(grad, {P = tonumber(index / totalColors), R = tonumber(R), G = tonumber(G), B = tonumber(B), A = tonumber(A)})\nend\n\nreturn grad\n", }, | |
DisplayLines = Input { Value = 18, }, | |
ShowCode = Input { Value = 1, }, | |
ShowDump = Input { Value = 1, } | |
}, | |
ViewInfo = OperatorInfo { Pos = { 55, 49.5 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
Note1 = Note { | |
Inputs = { | |
Comments = Input { Value = "Use a DoString node to run inline Lua code. This is used to generate a Fusion gradient object. Then have Vonk Ultra data nodes output a CSV spreadsheet from the gradient color samples.", } | |
}, | |
ViewInfo = StickyNoteInfo { | |
Pos = { 113.436, 14.9441 }, | |
Flags = { | |
Expanded = true | |
}, | |
Size = { 209.333, 25.4545 } | |
}, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
vTextToClipboard1 = Fuse.vTextToClipboard { | |
Inputs = { | |
Text = Input { | |
SourceOp = "vTextViewer", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { 275, 49.5 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
Underlay1 = Underlay { | |
ViewInfo = UnderlayInfo { | |
Pos = { 165, 0.409092 }, | |
Size = { 349.271, 131.788 } | |
}, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
GradientToCSVSpreadsheet = GroupOperator { | |
CtrlWZoom = false, | |
NameSet = true, | |
Inputs = ordered() { | |
MainInput1 = InstanceInput { | |
SourceOp = "vGradientCreate1", | |
Source = "Gradient", | |
}, | |
Input1 = InstanceInput { | |
SourceOp = "vTextViewer", | |
Source = "UISeparator1", | |
}, | |
Input4 = InstanceInput { | |
SourceOp = "vTextViewer", | |
Source = "FontSize", | |
Default = 0, | |
}, | |
Input5 = InstanceInput { | |
SourceOp = "vTextViewer", | |
Source = "DisplayLines", | |
Default = 14, | |
}, | |
Input6 = InstanceInput { | |
SourceOp = "vTextViewer", | |
Source = "WrapLines", | |
Default = 1, | |
}, | |
MainInput2 = InstanceInput { | |
SourceOp = "vTextViewer", | |
Source = "Input", | |
Page = "Controls", | |
}, | |
Input2 = InstanceInput { | |
SourceOp = "vGradientCreate1", | |
Source = "ShowInput", | |
Default = 0, | |
} | |
}, | |
Outputs = { | |
MainOutput1 = InstanceOutput { | |
SourceOp = "vTextViewer", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = GroupInfo { | |
Pos = { 165, 49.5 }, | |
Flags = { | |
AllowPan = false, | |
AutoSnap = true | |
}, | |
Size = { 824.875, 228.295, 412.438, 24.2424 }, | |
Direction = "Horizontal", | |
PipeStyle = "Direct", | |
Scale = 1, | |
Offset = { 0, 0 } | |
}, | |
Tools = ordered() { | |
PipeRouter1_1 = PipeRouter { | |
CtrlWShown = false, | |
Inputs = { | |
Input = Input { | |
SourceOp = "vGradientCreate1", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = PipeRouterInfo { Pos = { -302.938, 7.25758 } }, | |
}, | |
vNumberCompReqTime1 = Fuse.vNumberCompReqTime { | |
CtrlWShown = false, | |
ViewInfo = OperatorInfo { Pos = { -247.938, 40.2576 } }, | |
}, | |
vGradientToNumber1 = Fuse.vGradientToNumber { | |
CtrlWShown = false, | |
Inputs = { | |
Gradient = Input { | |
SourceOp = "vGradientCreate1", | |
Source = "Output", | |
}, | |
Index = Input { | |
SourceOp = "vNumberCompReqTime1", | |
Source = "Output", | |
}, | |
ShowInput = Input { Value = 1, } | |
}, | |
ViewInfo = OperatorInfo { Pos = { -247.938, 73.2576 } }, | |
}, | |
vGradientCreate1 = Fuse.vGradientCreate { | |
CtrlWShown = false, | |
Inputs = { | |
Gradient = Input { | |
SourceOp = "vGradientDoString1", | |
Source = "Output", | |
}, | |
ShowInput = Input { Value = 1, } | |
}, | |
ViewInfo = OperatorInfo { Pos = { -357.938, 73.2576 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
R = Fuse.vTextFromNumber { | |
CtrlWShown = false, | |
NameSet = true, | |
Inputs = { | |
Number = Input { | |
SourceOp = "vGradientToNumber1", | |
Source = "OutputR", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { -82.9375, 73.2576 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
vGradientColorCount1 = Fuse.vGradientColorCount { | |
CtrlWShown = false, | |
Inputs = { | |
Gradient = Input { | |
SourceOp = "PipeRouter1_1", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { -82.9375, 7.25758 } }, | |
}, | |
G = Fuse.vTextFromNumber { | |
CtrlWShown = false, | |
NameSet = true, | |
Inputs = { | |
Number = Input { | |
SourceOp = "vGradientToNumber1", | |
Source = "OutputG", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { -82.9375, 106.258 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
vTextMerge1 = Fuse.vTextMerge { | |
CtrlWShown = false, | |
Inputs = { | |
Which = Input { Value = 1, }, | |
Text1 = Input { | |
SourceOp = "R", | |
Source = "Output", | |
}, | |
Separator = Input { Value = ",", }, | |
Text2 = Input { | |
SourceOp = "G", | |
Source = "Output", | |
}, | |
Text3 = Input { | |
SourceOp = "B", | |
Source = "Output", | |
}, | |
Text4 = Input { | |
SourceOp = "A", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { 27.0625, 73.2576 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
PipeRouter1 = PipeRouter { | |
CtrlWShown = false, | |
Inputs = { | |
Input = Input { | |
SourceOp = "vGradientColorCount1", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = PipeRouterInfo { Pos = { 27.0625, 7.25758 } }, | |
}, | |
B = Fuse.vTextFromNumber { | |
CtrlWShown = false, | |
NameSet = true, | |
Inputs = { | |
Number = Input { | |
SourceOp = "vGradientToNumber1", | |
Source = "OutputB", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { -82.9375, 139.258 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
vTextAccumulator1 = Fuse.vTextAccumulator { | |
CtrlWShown = false, | |
Inputs = { | |
Text = Input { | |
SourceOp = "vTextMerge1", | |
Source = "Output", | |
}, | |
StartFrame = Input { Value = 1, }, | |
EndFrame = Input { | |
SourceOp = "PipeRouter1", | |
Source = "Output", | |
}, | |
RemoveDuplicates = Input { Value = 1, }, | |
ShowInput = Input { Value = 1, } | |
}, | |
ViewInfo = OperatorInfo { Pos = { 137.062, 73.2576 } }, | |
}, | |
A = Fuse.vTextFromNumber { | |
CtrlWShown = false, | |
NameSet = true, | |
Inputs = { | |
Number = Input { | |
SourceOp = "vGradientToNumber1", | |
Source = "OutputA", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { -82.9375, 172.258 } }, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
}, | |
CSV_vTextMerge2 = Fuse.vTextMerge { | |
CtrlWShown = false, | |
NameSet = true, | |
Inputs = { | |
Which = Input { Value = 1, }, | |
Text1 = Input { | |
SourceOp = "CSV_Header", | |
Source = "Output", | |
}, | |
Text2 = Input { | |
SourceOp = "vTextAccumulator1", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { 247.062, 73.2576 } }, | |
}, | |
CSV_Header = Fuse.vTextCreate { | |
CtrlWShown = false, | |
NameSet = true, | |
Inputs = { | |
Text = Input { Value = "R,G,B,A", } | |
}, | |
ViewInfo = OperatorInfo { Pos = { 247.062, 40.2576 } }, | |
}, | |
vTextViewer = Fuse.vTextViewer { | |
CtrlWZoom = false, | |
CtrlWShown = false, | |
Inputs = { | |
Which = Input { Value = 1, }, | |
FontSize = Input { Value = 0, }, | |
DisplayLines = Input { Value = 14, }, | |
Input = Input { | |
SourceOp = "CSV_vTextMerge2", | |
Source = "Output", | |
} | |
}, | |
ViewInfo = OperatorInfo { Pos = { 357.062, 73.2576 } }, | |
UserControls = ordered() { | |
Input = { | |
TEC_ReadOnly = false, | |
INPID_InputControl = "TextEditControl", | |
TEC_Lines = 25, | |
LINKS_Name = "Input", | |
LINKID_DataType = "Text", | |
IC_NoLabel = true, | |
INP_Passive = true, | |
ICS_ControlPage = "Controls", | |
TEC_Wrap = false, | |
} | |
} | |
} | |
}, | |
Colors = { TileColor = { R = 0.266666666666667, G = 0.56078431372549, B = 0.396078431372549 }, } | |
} | |
}, | |
Frames = { | |
{ | |
FrameTypeID = "ChildFrame", | |
Mode = 3, | |
LayoutPreset = 0, | |
PresetName = "Default", | |
Left = 0, | |
Top = 27, | |
Width = 2119, | |
Height = 1062, | |
ZoneInfo = { | |
AuxRight = { Expanded = true }, | |
["!Left"] = { | |
}, | |
AuxLeft = { Expanded = true }, | |
Right = { Expanded = true, }, | |
Left = { Expanded = false, }, | |
["!Right"] = { | |
} | |
}, | |
ViewInfo = { | |
Viewer1 = { Show = true, RatioX = 1.00121212121212, RatioY = 0.01, MRU = 1, Adjust = false, }, | |
InnerLeft = { | |
}, | |
MainSplit = { | |
RatioX = 100, | |
RatioY = 1, | |
}, | |
CenterSplit = { | |
RatioX = 0.928312816799421, | |
RatioY = 100, | |
}, | |
Viewer2 = { Show = true, RatioX = 0.998787878787878, RatioY = 0.01, MRU = 1, Adjust = false, }, | |
Comments = { Show = false }, | |
Time = { Show = true, RatioX = 100, }, | |
InnerColumns = { | |
RatioX = 100, | |
RatioY = 2, | |
}, | |
Keyframes = { Show = false, }, | |
LayoutStrip = { Show = true, RatioX = 100, }, | |
Inspector = { Show = true, RatioY = 1, RatioX = 100, }, | |
InnerRight = { | |
}, | |
MediaPool = { Show = false, }, | |
OuterColumns = { | |
RatioX = 100, | |
RatioY = 1, | |
}, | |
Effects = { Show = false, Adjust = true, RatioY = 100, MRU = 0, RatioX = 1, }, | |
Clips = { Show = false, }, | |
Metadata = { Show = false, }, | |
OuterLeft = { | |
}, | |
ViewerSplit = { | |
RatioX = 100, | |
RatioY = 1, | |
}, | |
Nodes = { Show = true, RatioY = 100, RatioX = 1, }, | |
OuterRight = { | |
PixelX = 519, | |
RatioY = 100, | |
}, | |
ActionStrip = { Show = false, RatioX = 100, MRU = 0, Adjust = true, }, | |
Spline = { Show = false, } | |
}, | |
Views = ordered() { | |
Effects = MultiView { | |
Active = "EffectView", | |
ViewList = ordered() { | |
EffectView = "EffectView" | |
}, | |
}, | |
Nodes = MultiView { | |
Active = "FlowView", | |
ViewList = ordered() { | |
FlowView = "FlowView" | |
}, | |
FlowView = FlowView { | |
Flags = { | |
Navigator = true, | |
AutoHideNavigator = true, | |
AutoSnap = true | |
}, | |
NavigatorSize = { 200, 140 }, | |
Direction = "Horizontal", | |
PipeStyle = "Direct", | |
RootScale = 2, | |
RootOffset = { 176.231, 11.7225 } | |
} | |
}, | |
Keyframes = MultiView { | |
Active = "TimelineView", | |
ViewList = ordered() { | |
TimelineView = "TimelineView" | |
}, | |
TimelineView = TimelineView { | |
TreeControlState = { | |
}, | |
DisplayMode = "All Tools", | |
ShowCurrentTimeTools = false, | |
Filter = "Show All", | |
ShowSelectedTools = false, | |
ShowAnimatedToolsOnly = false, | |
ShowEditBoxes = false, | |
KeyFrameView = { | |
Position = { Left = 232, Bottom = 320 }, | |
ScaleX = 0.306627680311891, | |
OffsetX = -6.13255360623782, | |
OffsetY = 0, | |
AutoScaling = "scroll", | |
AutoSnapTo = "frame", | |
AutoSnapToGuidelines = false, | |
GuidelinesGrabEnabled = true, | |
GuidelinesSnapTo = "frame" | |
}, | |
Spreadsheet = { LeftPos = 232, Visible = false } | |
} | |
}, | |
Spline = MultiView { | |
Active = "SplineView", | |
ViewList = ordered() { | |
SplineView = "SplineEditorView" | |
}, | |
SplineView = SplineEditorView { | |
LeftPos = 264, | |
ScaleX = 0.2, | |
ScaleY = 0.00338983050847458, | |
OffsetX = -3.4, | |
OffsetY = 0, | |
AutoScaling = "scroll", | |
AutoSnapTo = "frame", | |
AutoSnapToGuidelines = false, | |
GuidelinesSnapTo = "frame", | |
ShowKeyMarkers = false, | |
IndependentHandles = false, | |
ShowNonSplineModifiers = false, | |
GuidelinesGrabEnabled = true, | |
ShowOneToolOnly = false, | |
ShowSelectedTools = false, | |
ShowAllInputs = false, | |
Filter = "Show All" | |
} | |
}, | |
Inspector = MultiView { | |
Active = "Tools", | |
ViewList = ordered() { | |
Tools = "ControlView", | |
Modifiers = "ModifierView" | |
}, | |
}, | |
Viewer1 = MultiView { | |
Active = "LeftView", | |
ViewList = ordered() { | |
LeftView = "PreviewContainer" | |
}, | |
}, | |
Viewer2 = MultiView { | |
Active = "RightView", | |
ViewList = ordered() { | |
RightView = "PreviewContainer" | |
}, | |
}, | |
Time = "TimeView", | |
ActionStrip = "ActionStripView", | |
LayoutStrip = "LayoutStripView" | |
}, | |
Layout = { | |
{ ID = "LayoutStrip", FixedY = 36, Resolve = false, Flat = true }, | |
{ | |
{ | |
{ ID = "MediaPool", Fusion = false, RatioX = 1 }, | |
{ ID = "Effects", RatioX = 1 }, | |
Zone = "Left", | |
Rows = 2, | |
PaneID = "OuterLeft", | |
PixelX = 420 | |
}, | |
{ | |
{ | |
{ | |
{ ID = "MediaPool", Fusion = false, RatioX = 1 }, | |
{ ID = "Effects", RatioX = 1 }, | |
PaneID = "InnerLeft", | |
MaxViews = 1, | |
PixelX = 420, | |
Rows = 2, | |
Zone = "!Left" | |
}, | |
{ | |
{ | |
{ ID = "Viewer1", RatioY = 0.01, RatioX = 1 }, | |
{ ID = "Viewer2", RatioX = 1 }, | |
RatioY = 1, | |
Columns = 2, | |
PaneID = "ViewerSplit" | |
}, | |
{ ID = "Time", FixedY = 83, Flat = true }, | |
RatioX = 1, | |
Rows = 2 | |
}, | |
{ | |
{ ID = "Inspector", RatioY = 1 }, | |
{ ID = "Metadata", RatioY = 1, Fusion = false }, | |
PaneID = "InnerRight", | |
MaxViews = 1, | |
PixelX = 420, | |
Rows = 2, | |
Zone = "!Right" | |
}, | |
RatioY = 2, | |
Columns = 3, | |
PaneID = "InnerColumns" | |
}, | |
{ ID = "ActionStrip", FixedY = 50, Flat = true }, | |
{ | |
{ ID = "Nodes", RatioX = 1 }, | |
{ ID = "Spline", RatioX = 1 }, | |
{ ID = "Keyframes", RatioX = 1 }, | |
RatioY = 1, | |
Columns = 3, | |
PaneID = "MainSplit" | |
}, | |
{ Fusion = false, ID = "Clips", LARGE_FixedY = 160, MEDIUM_FixedY = 138, SMALL_FixedY = 110 }, | |
RatioX = 1, | |
Rows = 4, | |
PaneID = "CenterSplit" | |
}, | |
{ | |
{ ID = "Inspector", RatioY = 1 }, | |
{ ID = "Metadata", RatioY = 1, Fusion = false }, | |
Zone = "Right", | |
Rows = 2, | |
PaneID = "OuterRight", | |
PixelX = 420 | |
}, | |
RatioY = 1, | |
Columns = 3, | |
PaneID = "OuterColumns" | |
}, | |
RatioX = 1, | |
Rows = 2, | |
RatioY = 1 | |
}, | |
TopBar = { | |
Left = { "Left", "MediaPool", "Effects", "Clips", "Nodes", "Console" }, | |
Right = { "Spline", "Keyframes", "Metadata", "Inspector", "Right" } | |
} | |
} | |
}, | |
Prefs = { | |
Comp = { | |
Views = { | |
RightView = { | |
SideB = { | |
PrevCtrlInactiveColor = 4278255360, | |
PickW = 1, | |
PickH = 1, | |
PrevCtrlActiveColor = 4278190335, | |
Viewer = { | |
EnableLUTs = false, | |
LUTPlugin = "FusionViewLUT", | |
NearZ = 0, | |
FitMarginX = 0, | |
FitMarginType = 0, | |
FarZ = -1000, | |
FitMarginY = 0 | |
} | |
}, | |
}, | |
LeftView = { | |
SideB = { | |
PrevCtrlInactiveColor = 4278255360, | |
PickW = 1, | |
PickH = 1, | |
PrevCtrlActiveColor = 4278190335, | |
Viewer = { | |
EnableLUTs = false, | |
LUTPlugin = "FusionViewLUT", | |
NearZ = 0, | |
FitMarginX = 0, | |
FitMarginType = 0, | |
FarZ = -1000, | |
FitMarginY = 0 | |
} | |
}, | |
}, | |
View1 = { | |
PrevCtrlInactiveColor = 4278255360, | |
FullScreen = false, | |
PickW = 1, | |
PickH = 1, | |
AlwaysOnTop = true, | |
PrevCtrlActiveColor = 4278190335, | |
SideB = { | |
PrevCtrlInactiveColor = 4278255360, | |
PickW = 1, | |
PickH = 1, | |
PrevCtrlActiveColor = 4278190335, | |
Viewer = { | |
EnableLUTs = false, | |
LUTPlugin = "FusionViewLUT", | |
NearZ = 0, | |
FitMarginX = 0, | |
FitMarginType = 0, | |
FarZ = -1000, | |
FitMarginY = 0 | |
} | |
} | |
}, | |
View2 = { | |
PickH = 1, | |
PickW = 1, | |
AlwaysOnTop = true, | |
FullScreen = false | |
} | |
}, | |
Paths = { | |
Map = { | |
}, | |
EnableReverseMapping = true | |
}, | |
FrameFormat = { | |
GuideRatio = 1.77777777777778, | |
DepthFull = 3, | |
DepthPreview = 3, | |
DepthInteractive = 3, | |
}, | |
Unsorted = { | |
GlobalStart = 1, | |
GlobalEnd = 144 | |
}, | |
FlowView = { | |
RemoveRouters = false | |
}, | |
QuickTime = { | |
}, | |
} | |
}, | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment