Þ ¥bonds€¬cell_resultsÞ AÙ$836cc4be-e6d7-11ea-2a6e-436c187304daŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙE<div class="markdown"><h2>Step 1: Select submission files</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý;�°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$836cc4be-e6d7-11ea-2a6e-436c187304da¹depends_on_disabled_cellsÂ§runtimeÎ r^µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$728d1ca8-f865-11ea-1a3e-33cb0a44b9ddŠ¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix¦String¨elements’’’Ù,"/home/fonsi/hw1/submissions/hw1 - fonsi.jl"ªtext/plain’’Ù/"/home/fonsi/hw1/submissions/hw1 - template.jl"ªtext/plain¤type¥Array¬prefix_short ¨objectid¯33898dcf67bfdcd¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee¸submission_files_EXAMPLE²last_run_timestampËAÚý^c™°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$728d1ca8-f865-11ea-1a3e-33cb0a44b9dd¹depends_on_disabled_cellsÂ§runtimeÍ8µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$65d601a6-fe45-11ea-22c6-270bf7d353bcŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýL5ß°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$65d601a6-fe45-11ea-22c6-270bf7d353bc¹depends_on_disabled_cellsÂ§runtimeÏ   ®†W±µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙÖ<div class="markdown"><p>You need to write some code that returns the <strong>absolute paths</strong> to the students&#39; homework submissions. The following code works for me, but probably not for you.</p>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<9°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532¹depends_on_disabled_cellsÂ§runtimeÎ ƒ$µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$5ca8fb02-e6e3-11ea-0ad6-158746799400Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyƒ¤rows�¨objectid°eef7e23edd3e996f¦schema‚¥names�¥types�¤mimeÙ"application/vnd.pluto.table+object¬rootassignee´autograde_results_df²last_run_timestampËAÚýpa³°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$5ca8fb02-e6e3-11ea-0ad6-158746799400¹depends_on_disabled_cellsÂ§runtimeÎâ-¬µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$0ae5802c-f856-11ea-11ac-31a3ba67606cŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙp<bond def="reset_results" unique_id="S&#43;THkzfLiua6"><input type="button" value="Reset manual results"></bond>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚýN�Ü°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$0ae5802c-f856-11ea-11ac-31a3ba67606c¹depends_on_disabled_cellsÂ§runtimeÎK&Âµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$e5d3fa7c-f687-11ea-044f-6b00f0321da8Š¦queuedÂ¤logs�§runningÂ¦output†¤body±ManualCheckAction¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý®<°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$e5d3fa7c-f687-11ea-044f-6b00f0321da8¹depends_on_disabled_cellsÂ§runtimeÎ µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$633ee8e4-f68a-11ea-271e-433eafd12a62Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýRÝÎ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$633ee8e4-f68a-11ea-271e-433eafd12a62¹depends_on_disabled_cellsÂ§runtimeÍW2µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$1a999dfe-e6e1-11ea-12f4-ed24f03245e0Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ7UndefVarError: inspected_notebook_index_str not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#1a999dfe-e6e1-11ea-12f4-ed24f03245e0®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#1a999dfe-e6e1-11ea-12f4-ed24f03245e0¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassignee¸inspected_notebook_index²last_run_timestampËAÚýTµ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$1a999dfe-e6e1-11ea-12f4-ed24f03245e0¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$657f23ce-f687-11ea-13c0-f9959437ddf5Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙB<div class="markdown"><h2>Step 2: manual grade actions</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<¹°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$657f23ce-f687-11ea-13c0-f9959437ddf5¹depends_on_disabled_cellsÂ§runtimeÎ „›µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$3fb6b20c-e6e1-11ea-35eb-e74598e31dafŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ;<div class="markdown"><h1>Part 2: manual review</h1>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<‡8°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$3fb6b20c-e6e1-11ea-35eb-e74598e31daf¹depends_on_disabled_cellsÂ§runtimeÎ ‡ãµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÚ,MethodError: no method matching Main.workspace#3.GradedStudent(::SubString{String})
[0mClosest candidates are:
[0m  Main.workspace#3.GradedStudent(::Any, [91m::Any[39m, [91m::Any[39m) at ~/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#0796b462-f85c-11ea-1bf2-53ad24ec447c:2ªstacktrace–Œªcall_short£#29§inlinedÃ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#c7553450-f85b-11ea-1dbd-3d72253a58d6®source_packageÀ¤call£#29ªlinfo_type§Nothing¤line¤fileÙ2updated.jl#==#c7553450-f85b-11ea-1dbd-3d72253a58d6¤func£#29­parent_moduleÀ¦from_cÂŒªcall_short§iterate§inlinedÃ£urlÀ¤path®./generator.jl®source_packageÀ¤call§iterateªlinfo_type§Nothing¤line/¤file¬generator.jl¤func§iterate­parent_moduleÀ¦from_cÂŒªcall_shortÙ±_collect(c::Vector{SubString{String}}, itr::Base.Generator{Vector{SubString{String}}, var"#29#30"{typeof(split), DataType}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1})§inlinedÂ£urlÙchttps://github.com/JuliaLang/julia/tree/742b9abb4dd4621b667ec5bb3434b8b3602f96fd/base/array.jl#L741¤pathª./array.jl®source_packageÀ¤callÙ±_collect(c::Vector{SubString{String}}, itr::Base.Generator{Vector{SubString{String}}, var"#29#30"{typeof(split), DataType}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1})ªlinfo_type³Core.MethodInstance¤lineÍè¤file¨array.jl¤func¨_collect­parent_moduleÀ¦from_cÂŒªcall_shortÙ†collect_similar(cont::Vector{SubString{String}}, itr::Base.Generator{Vector{SubString{String}}, var"#29#30"{typeof(split), DataType}})§inlinedÂ£urlÙchttps://github.com/JuliaLang/julia/tree/742b9abb4dd4621b667ec5bb3434b8b3602f96fd/base/array.jl#L653¤pathª./array.jl®source_packageÀ¤callÙ†collect_similar(cont::Vector{SubString{String}}, itr::Base.Generator{Vector{SubString{String}}, var"#29#30"{typeof(split), DataType}})ªlinfo_type³Core.MethodInstance¤lineÍ�¤file¨array.jl¤func¯collect_similar­parent_moduleÀ¦from_cÂŒªcall_shortÙ.map(f::Function, A::Vector{SubString{String}})§inlinedÂ£urlÙlhttps://github.com/JuliaLang/julia/tree/742b9abb4dd4621b667ec5bb3434b8b3602f96fd/base/abstractarray.jl#L2867¤path²./abstractarray.jl®source_packageÀ¤callÙ.map(f::Function, A::Vector{SubString{String}})ªlinfo_type³Core.MethodInstance¤lineÍ3¤file°abstractarray.jl¤func£map­parent_moduleÀ¦from_cÂŒªcall_short¯top-level scope§inlinedÃ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#c7553450-f85b-11ea-1dbd-3d72253a58d6®source_packageÀ¤call¯top-level scopeªlinfo_type§Nothing¤line¤fileÙ2updated.jl#==#c7553450-f85b-11ea-1dbd-3d72253a58d6¤func»##function_wrapped_cell#446­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassignee§graders²last_run_timestampËAÚýßÛ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$427f19de-e6d2-11ea-10a8-5d3552224b31Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙmIOError: readdir("/home/fons/disorganised-mess/autograding/submissions/"): no such file or directory (ENOENT)ªstacktrace“Œªcall_short¨uv_error§inlinedÃ£urlÀ¤pathª./libuv.jl®source_packageÀ¤call¨uv_errorªlinfo_type§Nothing¤linea¤file¨libuv.jl¤func¨uv_error­parent_moduleÀ¦from_cÂŒªcall_shortÙ,readdir(dir::String; join::Bool, sort::Bool)§inlinedÂ£urlÙbhttps://github.com/JuliaLang/julia/tree/742b9abb4dd4621b667ec5bb3434b8b3602f96fd/base/file.jl#L844¤path©./file.jl®source_packageÀ¤callÙ,readdir(dir::String; join::Bool, sort::Bool)ªlinfo_type³Core.MethodInstance¤lineÍS¤file§file.jl¤func«#readdir#28­parent_moduleÀ¦from_cÂŒªcall_short¯top-level scope§inlinedÃ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#427f19de-e6d2-11ea-10a8-5d3552224b31®source_packageÀ¤call¯top-level scopeªlinfo_type§Nothing¤line¤fileÙ2updated.jl#==#427f19de-e6d2-11ea-10a8-5d3552224b31¤func»##function_wrapped_cell#298­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassignee°submission_files²last_run_timestampËAÚý,Ui°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$427f19de-e6d2-11ea-10a8-5d3552224b31¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ3UndefVarError: inspected_manual_results not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#e9b4c316-f852-11ea-3840-e7b1428df4e9®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#e9b4c316-f852-11ea-3840-e7b1428df4e9¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚýÅ€ñ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$a0776916-f865-11ea-387a-bf2e3094a182Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙV<div class="markdown"><p>I have already written these, you can ignore this.</p>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<L¡°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$a0776916-f865-11ea-387a-bf2e3094a182¹depends_on_disabled_cellsÂ§runtimeÎ   µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ1eval_in_notebook (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýÜ‹¨°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481¹depends_on_disabled_cellsÂ§runtimeÎ _Nµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$06edecc6-f864-11ea-03b0-03db23d2c780Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý>2ä°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$06edecc6-f864-11ea-03b0-03db23d2c780¹depends_on_disabled_cellsÂ§runtimeÎ –µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙE<div class="markdown"><h2>Step 3: autograde all notebooks</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<a(°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767¹depends_on_disabled_cellsÂ§runtimeÎ …–µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ,displayname (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýÑÝÎ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936¹depends_on_disabled_cellsÂ§runtimeÎ ì
µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$0796b462-f85c-11ea-1bf2-53ad24ec447cŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý±ˆ/°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$0796b462-f85c-11ea-1bf2-53ad24ec447c¹depends_on_disabled_cellsÂ§runtimeÎ Voµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$9057dc04-e6d2-11ea-196b-1519cac7d248Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý_’ó°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$9057dc04-e6d2-11ea-196b-1519cac7d248¹depends_on_disabled_cellsÂ§runtimeÎ Ùrµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙC<div class="markdown"><h2>Step 1: start notebook server</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<¤/°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3¹depends_on_disabled_cellsÂ§runtimeÎ 
Žµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$ca945d02-f686-11ea-03b4-393858220381Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ4<div class="markdown"><h4>Manual grading</h4>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý>,°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$ca945d02-f686-11ea-03b4-393858220381¹depends_on_disabled_cellsÂ§runtimeÎ Ùµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$9c1c40f0-e6de-11ea-08d8-77acb2a550d4Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙÅ<div class="markdown"><p><strong>Click to start notebook server:</strong></p>
<p><bond def="run_server" unique_id="SuaJnkq7SA8J"><input type="checkbox"></bond> run notebook server</p>
<hr />
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý*°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$9c1c40f0-e6de-11ea-08d8-77acb2a550d4¹depends_on_disabled_cellsÂ§runtimeÎ =µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙÖ<a href="data:text/csv;base64," download="autograde_results.csv" style="text-decoration: none; font-weight: normal; font-size: .75em; font-family: sans-serif;"><button>Download...</button> autograde_results.csv</a>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý©ò™°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675¹depends_on_disabled_cellsÂ§runtimeÎþ÷Fµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bcŠ¦queuedÂ¤logs�§runningÂ¦output†¤body¢""¤mimeªtext/plain¬rootassignee«graders_raw²last_run_timestampËAÚý¹W¬°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bc¹depends_on_disabled_cellsÂ§runtimeÍ)^µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$9815b7f4-f686-11ea-0760-05b34811be7fŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙM<div class="markdown"><h4>Autograde results for selected homework</h4>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý=áô°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$9815b7f4-f686-11ea-0760-05b34811be7f¹depends_on_disabled_cellsÂ§runtimeÎ ŽÒµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875cŠ¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix³Pluto.ServerSession¨elements•’±connected_clients’…¦prefixÙ!Dict{Symbol, Pluto.ClientSession}¨elements�¤type¤Dict¬prefix_short¤Dict¨objectid°f32b6b0056905248Ù!application/vnd.pluto.tree+object’©notebooks’…¦prefix¿Dict{Base.UUID, Pluto.Notebook}¨elements�¤type¤Dict¬prefix_short¤Dict¨objectid¯97c33cf0331ef41Ù!application/vnd.pluto.tree+object’¦secret’ª"Kp8OReI8"ªtext/plain’¬binder_token’§nothingªtext/plain’§options’…¦prefix»Pluto.Configuration.Options¨elements”’¦server’…¦prefixÙ!Pluto.Configuration.ServerOptions¨elementsÜ ’¨root_url’§nothingªtext/plain’¨base_url’£"/"ªtext/plain’¤host’«"127.0.0.1"ªtext/plain’¤port’¤2468ªtext/plain’©port_hint’¤1234ªtext/plain’®launch_browser’¥falseªtext/plain’»dismiss_update_notification’¥falseªtext/plain’°show_file_system’¤trueªtext/plain’¸notebook_path_suggestion’ÙD"/home/runner/work/disorganised-mess/disorganised-mess/autograding/"ªtext/plain’¾disable_writing_notebook_files’¥falseªtext/plain’µauto_reload_from_file’¥falseªtext/plain’¾auto_reload_from_file_cooldown’£0.4ªtext/plain’Ù auto_reload_from_file_ignore_pkg’¥falseªtext/plain’¨notebook’§nothingªtext/plain’µinit_with_file_viewer’¥falseªtext/plain’­simulated_lag’£0.0ªtext/plain’±simulated_pkg_lag’£0.0ªtext/plain’¼injected_javascript_data_url’¾"data:text/javascript;base64,"ªtext/plain’¨on_event’Ù##1 (generic function with 1 method)ªtext/plain¤type¦struct¬prefix_short­ServerOptions¨objectid¯d28e5618c554722Ù!application/vnd.pluto.tree+object’¨security’…¦prefixÙ#Pluto.Configuration.SecurityOptions¨elements“’½require_secret_for_open_links’¥falseªtext/plain’¹require_secret_for_access’¥falseªtext/plain’¹warn_about_untrusted_code’¤trueªtext/plain¤type¦struct¬prefix_short¯SecurityOptions¨objectid°4203dd9deaabaadaÙ!application/vnd.pluto.tree+object’ªevaluation’…¦prefixÙ%Pluto.Configuration.EvaluationOptions¨elements–’´run_notebook_on_load’¤trueªtext/plain’¹workspace_use_distributed’¥falseªtext/plain’Ù workspace_use_distributed_stdlib’§nothingªtext/plain’·lazy_workspace_creation’¥falseªtext/plain’®capture_stdout’¤trueªtext/plain’½workspace_custom_startup_expr’§nothingªtext/plain¤type¦struct¬prefix_short±EvaluationOptions¨objectid°c4587d4d82c15a15Ù!application/vnd.pluto.tree+object’¨compiler’…¦prefixÙ#Pluto.Configuration.CompilerOptions¨elementsÜ ’§compile’§nothingªtext/plain’©pkgimages’§nothingªtext/plain’°compiled_modules’§nothingªtext/plain’¨sysimage’§nothingªtext/plain’´sysimage_native_code’§nothingªtext/plain’¦banner’§nothingªtext/plain’§depwarn’§nothingªtext/plain’¨optimize’§nothingªtext/plain’¬min_optlevel’§nothingªtext/plain’¦inline’§nothingªtext/plain’¬check_bounds’§nothingªtext/plain’©math_mode’§nothingªtext/plain’®heap_size_hint’§nothingªtext/plain’¬startup_file’¤"no"ªtext/plain’¬history_file’¤"no"ªtext/plain’§threads’¡2ªtext/plain¤type¦struct¬prefix_short¯CompilerOptions¨objectid°631ebe8e9249f443Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short§Options¨objectid°6ac2adbe43b45a14Ù!application/vnd.pluto.tree+object¤type¦struct¬prefix_short­ServerSession¨objectid°a09bc63a30979219¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee­pluto_session²last_run_timestampËAÚýÈ§Ö°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c¹depends_on_disabled_cellsÂ§runtimeÎÉŠëµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$7b3bb8c8-f687-11ea-27bb-45ed5807090eŠ¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix¾Main.workspace#3.GradingAction¨elements•’’…¦prefix±ManualCheckAction¨elements“’¤name’´"3.1 - colored line"ªtext/plain’¬points_value’¡5ªtext/plain’¦rubric’ÙX<div class="markdown"><p>Did they write <code>colored_line&#40;v&#41;</code>?</p>
</div>©text/html¤type¦struct¬prefix_short±ManualCheckAction¨objectid°3991a4a16b289267Ù!application/vnd.pluto.tree+object’’…¦prefix±ManualScoreAction¨elements“’¤name’»"3.4 - make it interactive"ªtext/plain’¬points_value’¡8ªtext/plain’¦rubric’Ùi<div class="markdown"><p>Did they create a slider? Does the slider control the amount of blur?</p>
</div>©text/html¤type¦struct¬prefix_short±ManualScoreAction¨objectid°743b19e1bbfc60ffÙ!application/vnd.pluto.tree+object’’…¦prefix±ManualScoreAction¨elements“’¤name’¶"4.2 - convolve_image"ªtext/plain’¬points_value’¢20ªtext/plain’¦rubric’Ù=<div class="markdown"><p>Is convole_image correct?</p>
</div>©text/html¤type¦struct¬prefix_short±ManualScoreAction¨objectid°555c990811a75263Ù!application/vnd.pluto.tree+object’’…¦prefix±ManualScoreAction¨elements“’¤name’µ"4.3 - Gaussian blur"ªtext/plain’¬points_value’¢10ªtext/plain’¦rubric’ÙE<div class="markdown"><p>Does the Gaussian blur look okay?</p>
</div>©text/html¤type¦struct¬prefix_short±ManualScoreAction¨objectid°48a78042952f516dÙ!application/vnd.pluto.tree+object’’…¦prefix±ManualScoreAction¨elements“’¤name’´"4.4 - Sobel filter"ªtext/plain’¬points_value’¢10ªtext/plain’¦rubric’ÙD<div class="markdown"><p>Does the Sobel filter look okay?</p>
</div>©text/html¤type¦struct¬prefix_short±ManualScoreAction¨objectid°71e3bbd0f43e0de4Ù!application/vnd.pluto.tree+object¤type¥Array¬prefix_short ¨objectid°4d27e73ff760fa86¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee¦manual²last_run_timestampËAÚý¶¬C°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$7b3bb8c8-f687-11ea-27bb-45ed5807090e¹depends_on_disabled_cellsÂ§runtimeÎ=HÌµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$144aa7ec-f864-11ea-35c4-43e19d898887Š¦queuedÂ¤logs�§runningÂ¦output†¤body¢53¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý¾N{°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$144aa7ec-f864-11ea-35c4-43e19d898887¹depends_on_disabled_cellsÂ§runtimeÎ w½,µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$eade89f2-e6de-11ea-11bb-531a6b65c666Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙBBoundsError: attempt to access 0-element Vector{Pair} at index [1]ªstacktrace•Œªcall_short¨getindex§inlinedÃ£urlÀ¤pathª./array.jl®source_packageÀ¤call¨getindexªlinfo_type§Nothing¤lineÍ]¤file¨array.jl¤func¨getindex­parent_moduleÀ¦from_cÂŒªcall_short¶first(a::Vector{Pair})§inlinedÂ£urlÙkhttps://github.com/JuliaLang/julia/tree/742b9abb4dd4621b667ec5bb3434b8b3602f96fd/base/abstractarray.jl#L398¤path²./abstractarray.jl®source_packageÀ¤call¶first(a::Vector{Pair})ªlinfo_type³Core.MethodInstance¤lineÍŽ¤file°abstractarray.jl¤func¥first­parent_moduleÀ¦from_cÂŒªcall_shortÙ,get(select::PlutoUI.BuiltinsNotebook.Select)§inlinedÂ£urlÙAfile:///home/runner/.julia/packages/PlutoUI/hjutS/src/Builtins.jl¤pathÙ:/home/runner/.julia/packages/PlutoUI/hjutS/src/Builtins.jl®source_packageÀ¤callÙ,get(select::PlutoUI.BuiltinsNotebook.Select)ªlinfo_type³Core.MethodInstance¤lineÍ›¤file«Builtins.jl¤func£get­parent_moduleÀ¦from_cÂŒªcall_short¯macro expansion§inlinedÃ£urlÀ¤pathÙv/home/runner/.julia/packages/Pluto/6smog/src/runner/PlutoRunner/src/bonds.jl#@#==#eade89f2-e6de-11ea-11bb-531a6b65c666®source_packageÀ¤call¯macro expansionªlinfo_type§Nothing¤line~¤fileÙ2bonds.jl#@#==#eade89f2-e6de-11ea-11bb-531a6b65c666¤func¯macro expansion­parent_moduleÀ¦from_cÂŒªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eade89f2-e6de-11ea-11bb-531a6b65c666®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#eade89f2-e6de-11ea-11bb-531a6b65c666¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚý=?â°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$eade89f2-e6de-11ea-11bb-531a6b65c666¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$bbcd528e-e6e5-11ea-2d9c-a50835477b2eŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ.<div class="markdown"><h2>Not used</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý>ƒñ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$bbcd528e-e6e5-11ea-2d9c-a50835477b2e¹depends_on_disabled_cellsÂ§runtimeÎ vÔµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$3f0aec92-e6e1-11ea-1b53-29b7b543674dŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý<râ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$3f0aec92-e6e1-11ea-1b53-29b7b543674d¹depends_on_disabled_cellsÂ§runtimeÎ Îµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$991ddb18-e6e6-11ea-220d-71b6794f39d8Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ3UndefVarError: inspected_notebook_index not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#991ddb18-e6e6-11ea-220d-71b6794f39d8®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#991ddb18-e6e6-11ea-220d-71b6794f39d8¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚý«×�°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$991ddb18-e6e6-11ea-220d-71b6794f39d8¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ?<div class="markdown"><h2>Step 2: autograde actions</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<7µ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6¹depends_on_disabled_cellsÂ§runtimeÎ …Ñµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71eŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýVÆ›°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e¹depends_on_disabled_cellsÂ§runtimeÎ HLµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$a6fe722e-e6da-11ea-21e8-1dea77b462efŠ¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix¦String¨elements�¤type¥Array¬prefix_short ¨objectid°8b6b502703ab3501¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee·submission_files_to_run²last_run_timestampËAÚýÉYÅ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$a6fe722e-e6da-11ea-21e8-1dea77b462ef¹depends_on_disabled_cellsÂ§runtimeÎ Kjµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$22fd661e-e6e7-11ea-2b4a-8981b17a790dŠ¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ-UndefVarError: inspected_notebook not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#22fd661e-e6e7-11ea-2b4a-8981b17a790d®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#22fd661e-e6e7-11ea-2b4a-8981b17a790d¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚýÃö²°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$22fd661e-e6e7-11ea-2b4a-8981b17a790d¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$a3e47050-e6de-11ea-2a91-0597143f71baŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý-[>°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$a3e47050-e6de-11ea-2a91-0597143f71ba¹depends_on_disabled_cellsÂ§runtimeÎ KËµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098eŠ¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix£Any¨elements�¤type¥Array¬prefix_short ¨objectid°2749b3b171fc12a6¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee©notebooks²last_run_timestampËAÚýíTe°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098e¹depends_on_disabled_cellsÂ§runtimeÎ P-µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ+UndefVarError: submission_files not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚýdðñ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$6b40e1d0-f865-11ea-3c2a-39fb643c8068Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙZ<div class="markdown"><p>It should return an arrays of strings, something like:</p>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<"¸°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$6b40e1d0-f865-11ea-3c2a-39fb643c8068¹depends_on_disabled_cellsÂ§runtimeÎ *îµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$e48f2a16-e6e1-11ea-070a-d58f87569b91Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ*<div class="markdown"><h2>Misc</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý>oÎ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$e48f2a16-e6e1-11ea-070a-d58f87569b91¹depends_on_disabled_cellsÂ§runtimeÎ «;µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6aŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ9<div class="markdown"><h1>Part 1: autograding</h1>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý:ñ�°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6a¹depends_on_disabled_cellsÂ§runtimeÎ v«µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$3abb56e4-e6d3-11ea-3337-392a434e1a21Š¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý_Îò°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$3abb56e4-e6d3-11ea-3337-392a434e1a21¹depends_on_disabled_cellsÂ§runtimeÎ Káµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ5<div class="markdown"><h2>Grading actions</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý>[Ñ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26¹depends_on_disabled_cellsÂ§runtimeÎ z2µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$7cb1c9bc-f684-11ea-00f3-dfd11c9b72efŠ¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ$UndefVarError: HTMLTable not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚýr=÷°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ,UndefVarError: manual_results_df not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#459687e0-e6e3-11ea-0c85-89516c7a2da0®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#459687e0-e6e3-11ea-0c85-89516c7a2da0¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚý¯ŸÇ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57aŠ¦queuedÂ¤logs�§runningÂ¦output†¤body¥107.5¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýœŒ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57a¹depends_on_disabled_cellsÂ§runtimeÎ/ö$µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ceŠ¦queuedÂ¤logs�§runningÂ¦output†¤body¥Pluto¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýÔyO°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ce¹depends_on_disabled_cellsÂ§runtimeÍ%Lµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$96917e4e-f687-11ea-2256-7b1057a3b523Š¦queuedÂ¤logs�§runningÂ¦output†¤body±ManualScoreAction¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚý­e
°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$96917e4e-f687-11ea-2256-7b1057a3b523¹depends_on_disabled_cellsÂ§runtimeÎ ;¤µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$469a28fc-f856-11ea-2a6b-a706e607cf9fŠ¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ6UndefVarError: updated_manual_results_dict not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#469a28fc-f856-11ea-2a6b-a706e607cf9f®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#469a28fc-f856-11ea-2a6b-a706e607cf9f¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassignee±manual_results_df²last_run_timestampËAÚý­Ü×°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$469a28fc-f856-11ea-2a6b-a706e607cf9f¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$b6b986c8-e6de-11ea-1d13-5d9d370eccdcŠ¦queuedÂ¤logs�§runningÂ¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýV¨°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$b6b986c8-e6de-11ea-1d13-5d9d370eccdc¹depends_on_disabled_cellsÂ§runtimeÎ µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$eaa49370-e6da-11ea-21d9-ddf11a7df51fŠ¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix¾Main.workspace#3.GradingAction¨elementsÜ ’’…¦prefix¨GetValue¨elements’’¤name’¦"name"ªtext/plain’¦getter’¯:(student.name)ªtext/plain¤type¦struct¬prefix_short¨GetValue¨objectid°11958f47ce963125Ù!application/vnd.pluto.tree+object’’…¦prefix¨GetValue¨elements’’¤name’­"kerberos_id"ªtext/plain’¦getter’¶:(student.kerberos_id)ªtext/plain¤type¦struct¬prefix_short¨GetValue¨objectid°7c88c5ffcc373c49Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’µ"1.1 - random vector"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’ÙÌquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:111 =#
    length(random_vect) == 10 && length(Set(random_vect)) == 10
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°8081aba1f05ea454Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¬"1.1 - mean"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ù¨quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:115 =#
    mean([-1, -1, 2]) â‰ˆ 0
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°887ff3910531f0e4Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’º"1.1 - mean of random vec"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Ù§quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:119 =#
    m == mean(random_vect)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°8e6a7676b100a674Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’·"1.1 - demean function"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ù¾quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:123 =#
    demean([1, 2, 3, 4, 5]) â‰ˆ [-2, -1, 0, 1, 2]
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°d3e328090c11c176Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’·"1.2 - create bar - 20"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Ú•quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:128 =#
    create_bar() â‰ˆ let
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:129 =#
            x = zeros(100)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:130 =#
            x[40:59] .= 1
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:131 =#
            x
        end
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°7e92b3b3064486e1Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’½"1.2 - create bar - 20 or 21"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’ÚÕquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:136 =#
    create_bar() â‰ˆ let
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:137 =#
                x = zeros(100)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:138 =#
                x[40:59] .= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:139 =#
                x
            end || create_bar() â‰ˆ let
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:142 =#
                x = zeros(100)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:143 =#
                x[40:60] .= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:144 =#
                x
            end
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°1700b0cc12a6668aÙ!application/vnd.pluto.tree+object’	’…¦prefix®AutoTestAction¨elements“’¤name’¸"1.3 - vecvec_to_matrix"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’ÚPquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:150 =#
    vecvec_to_matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == hcat([1, 2, 3], [4, 5, 6], [7, 8, 9]) || vecvec_to_matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == (hcat([1, 2, 3], [4, 5, 6], [7, 8, 9]))'
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°97f1317f7e027187Ù!application/vnd.pluto.tree+object’
’…¦prefix®AutoTestAction¨elements“’¤name’¸"1.3 - matrix_to_vecvec"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ú'quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:155 =#
    let
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:156 =#
        A = [1 2; 4 5; 7 8]
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:157 =#
        matrix_to_vecvec(A) == collect(eachcol(A)) || matrix_to_vecvec(A) == collect(eachrow(A))
    end
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°9defc1992e2a707fÙ!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’³"2.1 - mean colors"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ú0%quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:164 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:165 =#
    t = testimg()
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:166 =#
    mean_colors(t) == ((mean(t)).r, (mean(t)).g, (mean(t)).b) || mean_colors(t) == RGB((mean(t)).r, (mean(t)).g, (mean(t)).b)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°324a5a3d854d6fa8Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¸"2.2 - quantize::Number"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ù¯quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:172 =#
    quantize(3) â‰ˆ floor(30) / 10
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°e1e73d63064401fdÙ!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’·"2.3 - quantize::Color"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Úequote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:177 =#
    c = rand(RGB)
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:178 =#
    quantize(c) == RGB(quantize(c.r), quantize(c.g), quantize(c.b))
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°914adfbcd6ea8a63Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’Ù "2.4 - quantize::AbstractMatrix"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Ú/Çquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:183 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:184 =#
    t = testimg()
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:185 =#
    quantize(t) == quantize.(t)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°d401fd08ec056583Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’®"2.5 - invert"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’ÚQquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:190 =#
    c = rand(RGB)
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:191 =#
    invert(c) == RGB(1 - c.r, 1 - c.g, 1 - c.b)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°41f8eafef30919a3Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¿"2.6 - noisify::Number - noise"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Úquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:198 =#
    let
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:199 =#
        N = 10000
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:202 =#
        x = [noisify(0.5, 0.25) for _ = 1:N]
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:203 =#
        sample_mean = sum(x) / N
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:205 =#
        sample_var = sum((x .- sample_mean) .^ 2) / N
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:207 =#
        abs(sample_mean - 0.5) < 0.01 && abs(sample_var - 1 / 48) < 0.01
    end
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°83da5563cb0e0bdeÙ!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¿"2.6 - noisify::Number - clamp"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Úœquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:214 =#
    let
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:215 =#
        N = 10000
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:218 =#
        x = [noisify(0.5, 10) for _ = 1:N]
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:220 =#
        0.0 <= minimum(x) < maximum(x) <= 1.0
    end
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°cb956f9206ec62a2Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¶"2.6 - noisify::Color"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Ú:quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:226 =#
    c = rand(RGB)
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:227 =#
    noisify(c, 0.1) != c
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°ce1add80c52cd5c5Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¶"2.6 - noisify::Image"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Ú/Àquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:231 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:232 =#
    t = testimg()
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:233 =#
    noisify(t, 0.1) != t
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°67389e4da133bceeÙ!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’®"3.2 - extend"ªtext/plain’¬points_value’¢10ªtext/plain’¤test’Ú/>quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:241 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:242 =#
    extend(v, -5) == solution_extend(v, -5)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°dcd7d9121997efe4Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’¯"3.3 - blur_1D"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ú/>quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:247 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:248 =#
    blur_1D(v, 2) == solution_blur_1D(v, 2)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°d02d76e3ed762566Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’³"3.5 - convolution"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ú/Žquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:256 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:257 =#
    convolve_vector([1, 10, 100, 1000, 10000], [0, 1, 0]) == solution_convolve_vector([1, 10, 100, 1000, 10000], [0, 1, 0])
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°a197506a3e04e01eÙ!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’Ù""3.6 - gaussian_kernel - centered"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’Úçquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:262 =#
    K = gaussian_kernel(9)
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:264 =#
    center = length(K) Ã· 2
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:266 =#
    K[1] < K[center] > K[end]
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°4ec4e832fcbff6a1Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’Ù$"3.6 - gaussian_kernel - normalized"ªtext/plain’¬points_value’£2.5ªtext/plain’¤test’ÚAquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:271 =#
    K = gaussian_kernel(9)
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:272 =#
    0.9 < sum(K) < 1.1
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°75911f181df4f6d9Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’²"4.1 - extend mat"ªtext/plain’¬points_value’¢10ªtext/plain’¤test’Ú0quote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:277 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:278 =#
    M = rand(Float64, (3, 3))
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:279 =#
    all([extend_mat(M, i, j) â‰ˆ solution_extend_mat(M, i, j) for i = [-5, 4, 2], j = [-1, 1, 0, 10]])
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°5f4df90ebc4c8abdÙ!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’Ù%"4.3 - with_gaussian_blur - no error"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ú3ßquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:304 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:305 =#
    try
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:306 =#
            with_gaussian_blur(rand(Gray, (20, 10))) isa Array
        catch
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:308 =#
            false
        end || (try
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:310 =#
                with_gaussian_blur(rand(Float64, (20, 10))) isa Array
            catch
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:312 =#
                false
            end || try
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:314 =#
                with_gaussian_blur(rand(RGB, (20, 10))) isa Array
            catch
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:316 =#
                false
            end)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°b83be170be7abe18Ù!application/vnd.pluto.tree+object’’…¦prefix®AutoTestAction¨elements“’¤name’Ù$"4.4 - sobel_edge_detect - no error"ªtext/plain’¬points_value’¡5ªtext/plain’¤test’Ú3ëquote
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:322 =#
    begin
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
        function solution_extend(v, i)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:4 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:5 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:6 =#
                v[1]
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:7 =# i > length(v)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:8 =#
                v[end]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:10 =#
                v[i]
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
        function solution_blur_1D(v, l)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:14 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:15 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:16 =#
                    mean([extend(v, i + j) for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
        function solution_convolve_vector(v, k)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:20 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:21 =#
            l = (length(k) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:22 =#
            return map(eachindex(v)) do i
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:23 =#
                    sum([extend(v, i - j) * k[j + 1 + l] for j = -l:l])
                end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
        function solution_pascal(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:27 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:28 =#
            if n <= 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:29 =#
                [1.0]
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:31 =#
                prev = pascal(n - 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:32 =#
                0.5 * ([prev..., 0] .+ [0, prev...])
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
        function solution_gaussian_kernel(n)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:36 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:37 =#
            solution_pascal(2n + 1)
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
        function solution_extend_mat(M::AbstractMatrix, i, j)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:40 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:41 =#
            if i < 1
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:42 =#
                solution_extend_mat(M, 1, j)
            elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:43 =# i > size(M, 1)
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:44 =#
                solution_extend_mat(M, size(M, 1), j)
            else
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:46 =#
                if j < 1
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:47 =#
                    solution_extend_mat(M, i, 1)
                elseif #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:48 =# j > size(M, 2)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:49 =#
                    solution_extend_mat(M, i, size(M, 2))
                else
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:51 =#
                    M[i, j]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
        function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:56 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:57 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:59 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:60 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:62 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:64 =#
                    extend_mat(M, (i - offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
        function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:69 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:70 =#
            l = (size(K, 1) - 1) Ã· 2
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:72 =#
            map(CartesianIndices(M)) do i
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:73 =#
                sum(CartesianIndices(K)) do a
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:75 =#
                    offset = a - CartesianIndex(-l - 1, -l - 1)
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:77 =#
                    extend_mat(M, (i + offset).I...) * K[a]
                end
            end
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
        function solution_with_gaussian_blur(image; sigma = 3, l = 5)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:83 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
            gauss(x, y; sigma = 3) = begin
                    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:84 =#
                    (1 / (2 * pi * sigma ^ 2)) * exp(-((x ^ 2 + y ^ 2)) / (2 * sigma ^ 2))
                end
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:85 =#
            K_gauss = [gauss(xy...) for xy = Iterators.product(-l:l, -l:l)]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:86 =#
            convolve_image(image, K_gauss ./ sum(K_gauss))
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
        function solution_sobel_edge_detect(image)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:89 =#
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:90 =#
            K_sobol = [1 0 -1; 2 0 -2; 1 0 -1]
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:95 =#
            x = solution_convolve_image(image, K_sobol)
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:96 =#
            y = solution_convolve_image(image, K_sobol')
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:97 =#
            return x .* x .+ y .* y
        end
        #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
        testimg() = begin
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:100 =#
                rand(RGB, (10, 20))
            end
    end
    #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:323 =#
    try
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:324 =#
            with_sobel_edge_detect(rand(Gray, (20, 10))) isa Array
        catch
            #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:326 =#
            false
        end || (try
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:328 =#
                with_sobel_edge_detect(rand(Float64, (20, 10))) isa Array
            catch
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:330 =#
                false
            end || try
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:332 =#
                with_sobel_edge_detect(rand(RGB, (20, 10))) isa Array
            catch
                #= /home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#eaa49370-e6da-11ea-21d9-ddf11a7df51f:334 =#
                false
            end)
endªtext/plain¤type¦struct¬prefix_short®AutoTestAction¨objectid°8749ff750104fa58Ù!application/vnd.pluto.tree+object¤type¥Array¬prefix_short ¨objectid°f1da31965ac4c50c¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee§actions²last_run_timestampËAÚý�Óò°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$eaa49370-e6da-11ea-21d9-ddf11a7df51f¹depends_on_disabled_cellsÂ§runtimeÎêêêµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$490cc11a-00cb-11eb-24bc-2fb026c3094eŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ&all (generic function with 11 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýtË’°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$490cc11a-00cb-11eb-24bc-2fb026c3094e¹depends_on_disabled_cellsÂ§runtimeÍ#Cµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2bŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ+do_action (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýçOÛ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2b¹depends_on_disabled_cellsÂ§runtimeÎ ‹³µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ3UndefVarError: inspected_manual_results not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#f131ee3a-f68a-11ea-3d6c-d34439133a63®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#f131ee3a-f68a-11ea-3d6c-d34439133a63¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassignee»updated_manual_results_dict²last_run_timestampËAÚýÇJñ°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$64c26a50-e6df-11ea-2762-57186f445501Š¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ3UndefVarError: inspected_notebook_index not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#64c26a50-e6df-11ea-2762-57186f445501®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#64c26a50-e6df-11ea-2762-57186f445501¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassignee²inspected_notebook²last_run_timestampËAÚýVxu°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$64c26a50-e6df-11ea-2762-57186f445501¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8Š¦queuedÂ¤logs�§runningÂ¦output†¤body…¦prefix£Any¨elements�¤type¥Array¬prefix_short ¨objectid°66b36b3221340971¤mimeÙ!application/vnd.pluto.tree+object¬rootassignee±autograde_results²last_run_timestampËAÚýêIí°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8¹depends_on_disabled_cellsÂ§runtimeÎœG¯µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ceŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ.<div class="markdown"><h1>Appendix</h1>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý>G4°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ce¹depends_on_disabled_cellsÂ§runtimeÎ ƒPµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$8904534a-e6e1-11ea-34b7-31d1f6f8ca8fŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙ=<div class="markdown"><h2>Step 3: select notebook</h2>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý<ÍB°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$8904534a-e6e1-11ea-34b7-31d1f6f8ca8f¹depends_on_disabled_cellsÂ§runtimeÎ vÊµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$122cbbdc-00cd-11eb-223b-ef82328f674fŠ¦queuedÂ¤logs�§runningÂ¦output†¤body¤true¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚýÍ$l°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$122cbbdc-00cd-11eb-223b-ef82328f674f¹depends_on_disabled_cellsÂ§runtimeÎ+1‚µpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$b8d4598c-f686-11ea-24dc-6f94370fc996Š¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙH<div class="markdown"><h4>Editable view of selected homework</h4>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý=ø@°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$b8d4598c-f686-11ea-24dc-6f94370fc996¹depends_on_disabled_cellsÂ§runtimeÎ ¬Ìµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$dfbaecac-f855-11ea-1f3e-0522a86136eaŠ¦queuedÂ¤logs�§runningÂ¦output†¤bodyÙN<div class="markdown"><p>Currently stored grades for this notebook:</p>
</div>¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚý>!Ä°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$dfbaecac-f855-11ea-1f3e-0522a86136ea¹depends_on_disabled_cellsÂ§runtimeÎ ¨Vµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÂÙ$a1598cfc-e6d7-11ea-1f0b-f5560304fe7aŠ¦queuedÂ¤logs�§runningÂ¦output†¤body‚£msgÙ+UndefVarError: submission_files not definedªstacktrace‘Œªcall_short¯top-level scope§inlinedÂ£urlÀ¤pathÙt/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl#==#a1598cfc-e6d7-11ea-1f0b-f5560304fe7a®source_packageÀ¤call¯top-level scopeªlinfo_type­Core.CodeInfo¤line¤fileÙ2updated.jl#==#a1598cfc-e6d7-11ea-1f0b-f5560304fe7a¤func¯top-level scope­parent_moduleÀ¦from_cÂ¤mimeÙ'application/vnd.pluto.stacktrace+object¬rootassigneeÀ²last_run_timestampËAÚý„¦¨°persist_js_stateÂ·has_pluto_hook_featuresÂ§cell_idÙ$a1598cfc-e6d7-11ea-1f0b-f5560304fe7a¹depends_on_disabled_cellsÂ§runtimeÀµpublished_object_keys�¸depends_on_skipped_cellsÂ§erroredÃ±cell_dependenciesÞ AÙ$836cc4be-e6d7-11ea-2a6e-436c187304da„´precedence_heuristic	§cell_idÙ$836cc4be-e6d7-11ea-2a6e-436c187304da´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$728d1ca8-f865-11ea-1a3e-33cb0a44b9dd„´precedence_heuristic	§cell_idÙ$728d1ca8-f865-11ea-1a3e-33cb0a44b9dd´downstream_cells_map�¸submission_files_EXAMPLE�²upstream_cells_map€Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc„´precedence_heuristic§cell_idÙ$65d601a6-fe45-11ea-22c6-270bf7d353bc´downstream_cells_map†£CSV’Ù$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675Ù$459687e0-e6e3-11ea-0c85-89516c7a2da0¤UUID�§PlutoUI�ªDataFrames�¥Pluto—Ù$b5d0d970-e6d9-11ea-20a5-01f0c4e3875cÙ$a6fe722e-e6da-11ea-21e8-1dea77b462efÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ceÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$a3e47050-e6de-11ea-2a91-0597143f71baÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2bÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481«Distributed‘Ù$33588e20-e6d4-11ea-08f6-7d10d9ef1481²upstream_cells_map€Ù$4e4e78d2-f865-11ea-0c21-fdd76cbf3532„´precedence_heuristic	§cell_idÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400„´precedence_heuristic	§cell_idÙ$5ca8fb02-e6e3-11ea-0ad6-158746799400´downstream_cells_map�´autograde_results_df”Ù$7cb1c9bc-f684-11ea-00f3-dfd11c9b72efÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675Ù$991ddb18-e6e6-11ea-220d-71b6794f39d8Ù$469a28fc-f856-11ea-2a6b-a706e607cf9f²upstream_cells_mapˆ±autograde_results‘Ù$33e66768-e6d9-11ea-1aba-256b4c9998b8£map�§actions‘Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51f©DataFrame�£zip�«displayname‘Ù$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936¦Symbol�¢=>�Ù$0ae5802c-f856-11ea-11ac-31a3ba67606c„´precedence_heuristic	§cell_idÙ$0ae5802c-f856-11ea-11ac-31a3ba67606c´downstream_cells_map�­reset_results‘Ù$633ee8e4-f68a-11ea-271e-433eafd12a62²upstream_cells_mapˆ¤Core�¤Base�·PlutoRunner.create_bond�«PlutoRunner�¯Core.applicable�¥@bind�¦Button�¨Base.get�Ù$e5d3fa7c-f687-11ea-044f-6b00f0321da8„´precedence_heuristic	§cell_idÙ$e5d3fa7c-f687-11ea-044f-6b00f0321da8´downstream_cells_map�±ManualCheckAction‘Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090e²upstream_cells_mapƒ­GradingAction‘Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e¦Number�¬points_valie�Ù$633ee8e4-f68a-11ea-271e-433eafd12a62„´precedence_heuristic	§cell_idÙ$633ee8e4-f68a-11ea-271e-433eafd12a62´downstream_cells_map�³manual_results_dict“Ù$e9b4c316-f852-11ea-3840-e7b1428df4e9Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790dÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63²upstream_cells_map‚¤Dict�­reset_results‘Ù$0ae5802c-f856-11ea-11ac-31a3ba67606cÙ$1a999dfe-e6e1-11ea-12f4-ed24f03245e0„´precedence_heuristic	§cell_idÙ$1a999dfe-e6e1-11ea-12f4-ed24f03245e0´downstream_cells_map�¸inspected_notebook_index“Ù$991ddb18-e6e6-11ea-220d-71b6794f39d8Ù$f131ee3a-f68a-11ea-3d6c-d34439133a63Ù$64c26a50-e6df-11ea-2762-57186f445501²upstream_cells_mapƒ¼inspected_notebook_index_str‘Ù$eade89f2-e6de-11ea-11bb-531a6b65c666£Int�¥parse�Ù$657f23ce-f687-11ea-13c0-f9959437ddf5„´precedence_heuristic	§cell_idÙ$657f23ce-f687-11ea-13c0-f9959437ddf5´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3fb6b20c-e6e1-11ea-35eb-e74598e31daf„´precedence_heuristic	§cell_idÙ$3fb6b20c-e6e1-11ea-35eb-e74598e31daf´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$c7553450-f85b-11ea-1dbd-3d72253a58d6„´precedence_heuristic	§cell_idÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6´downstream_cells_map�§graders�²upstream_cells_map„£map�«graders_raw‘Ù$b6512e8e-f85b-11ea-0cb6-619a5b3f67bc­GradedStudent‘Ù$0796b462-f85c-11ea-1bf2-53ad24ec447c¥split�Ù$427f19de-e6d2-11ea-10a8-5d3552224b31„´precedence_heuristic	§cell_idÙ$427f19de-e6d2-11ea-10a8-5d3552224b31´downstream_cells_map�°submission_files“Ù$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763Ù$a1598cfc-e6d7-11ea-1f0b-f5560304fe7aÙ$a6fe722e-e6da-11ea-21e8-1dea77b462ef²upstream_cells_mapƒ¨endswith�¦filter�§readdir�Ù$e9b4c316-f852-11ea-3840-e7b1428df4e9„´precedence_heuristic	§cell_idÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9´downstream_cells_map€²upstream_cells_map‰§@md_str�§missing�£===�¨basename�³manual_results_dict‘Ù$633ee8e4-f68a-11ea-271e-433eafd12a62²inspected_notebook‘Ù$64c26a50-e6df-11ea-2762-57186f445501¸inspected_manual_results‘Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790d£get�¨getindex�Ù$a0776916-f865-11ea-387a-bf2e3094a182„´precedence_heuristic	§cell_idÙ$a0776916-f865-11ea-387a-bf2e3094a182´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$33588e20-e6d4-11ea-08f6-7d10d9ef1481„´precedence_heuristic	§cell_idÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481´downstream_cells_map�°eval_in_notebook‘Ù$31111cbe-e6d3-11ea-0130-a98e45b82f2b²upstream_cells_mapˆ¤Main�©QuoteNode�»Distributed.remotecall_eval�­pluto_session‘Ù$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c¢|>�Ù$Pluto.WorkspaceManager.get_workspace�¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc«Distributed‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bcÙ$06edecc6-f864-11ea-03b0-03db23d2c780„´precedence_heuristic	§cell_idÙ$06edecc6-f864-11ea-03b0-03db23d2c780´downstream_cells_map€²upstream_cells_map€Ù$8c6c6114-e6d7-11ea-20b1-e718907e0767„´precedence_heuristic	§cell_idÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936„´precedence_heuristic	§cell_idÙ$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936´downstream_cells_map�«displayname’Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400Ù$469a28fc-f856-11ea-2a6b-a706e607cf9f²upstream_cells_map�­GradingAction‘Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71eÙ$0796b462-f85c-11ea-1bf2-53ad24ec447c„´precedence_heuristic	§cell_idÙ$0796b462-f85c-11ea-1bf2-53ad24ec447c´downstream_cells_map�­GradedStudent‘Ù$c7553450-f85b-11ea-1dbd-3d72253a58d6²upstream_cells_map€Ù$9057dc04-e6d2-11ea-196b-1519cac7d248„´precedence_heuristic	§cell_idÙ$9057dc04-e6d2-11ea-196b-1519cac7d248´downstream_cells_map�®AutoTestAction’Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51fÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2b²upstream_cells_mapƒ­GradingAction‘Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e¦Number�¤Expr�Ù$9090ee3e-e6de-11ea-14c3-27032e8710d3„´precedence_heuristic	§cell_idÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$ca945d02-f686-11ea-03b4-393858220381„´precedence_heuristic	§cell_idÙ$ca945d02-f686-11ea-03b4-393858220381´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$9c1c40f0-e6de-11ea-08d8-77acb2a550d4„´precedence_heuristic	§cell_idÙ$9c1c40f0-e6de-11ea-08d8-77acb2a550d4´downstream_cells_map�ªrun_server’Ù$a3e47050-e6de-11ea-2a91-0597143f71baÙ$b6b986c8-e6de-11ea-1d13-5d9d370eccdc²upstream_cells_mapŠ¤Core�§@md_str�¤Base�·PlutoRunner.create_bond�«PlutoRunner�¨CheckBox�¯Core.applicable�¥@bind�¨Base.get�¨getindex�Ù$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675„´precedence_heuristic	§cell_idÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675´downstream_cells_map€²upstream_cells_map„£CSV‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc´autograde_results_df‘Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400¦sprint�®DownloadButton�Ù$b6512e8e-f85b-11ea-0cb6-619a5b3f67bc„´precedence_heuristic	§cell_idÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bc´downstream_cells_map�«graders_raw‘Ù$c7553450-f85b-11ea-1dbd-3d72253a58d6²upstream_cells_map€Ù$9815b7f4-f686-11ea-0760-05b34811be7f„´precedence_heuristic	§cell_idÙ$9815b7f4-f686-11ea-0760-05b34811be7f´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c„´precedence_heuristic	§cell_idÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c´downstream_cells_map�­pluto_session“Ù$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$a3e47050-e6de-11ea-2a91-0597143f71baÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481²upstream_cells_mapƒ³Pluto.ServerSession�Ù$Pluto.Configuration.from_flat_kwargs�¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bcÙ$7b3bb8c8-f687-11ea-27bb-45ed5807090e„´precedence_heuristic	§cell_idÙ$7b3bb8c8-f687-11ea-27bb-45ed5807090e´downstream_cells_map�¦manual“Ù$144aa7ec-f864-11ea-35c4-43e19d898887Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790dÙ$469a28fc-f856-11ea-2a6b-a706e607cf9f²upstream_cells_map„§@md_str�±ManualScoreAction‘Ù$96917e4e-f687-11ea-2256-7b1057a3b523±ManualCheckAction‘Ù$e5d3fa7c-f687-11ea-044f-6b00f0321da8¨getindex�Ù$144aa7ec-f864-11ea-35c4-43e19d898887„´precedence_heuristic	§cell_idÙ$144aa7ec-f864-11ea-35c4-43e19d898887´downstream_cells_map€²upstream_cells_map‚¦manual‘Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090e£sum�Ù$eade89f2-e6de-11ea-11bb-531a6b65c666„´precedence_heuristic	§cell_idÙ$eade89f2-e6de-11ea-11bb-531a6b65c666´downstream_cells_map�¼inspected_notebook_index_str‘Ù$1a999dfe-e6e1-11ea-12f4-ed24f03245e0²upstream_cells_mapŒ¤Core�¦string�¨Base.get�¥@bind�¢=>�¤Base�«PlutoRunner�©enumerate�·PlutoRunner.create_bond�¯Core.applicable�¦Select�©notebooks‘Ù$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$bbcd528e-e6e5-11ea-2d9c-a50835477b2e„´precedence_heuristic	§cell_idÙ$bbcd528e-e6e5-11ea-2d9c-a50835477b2e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3f0aec92-e6e1-11ea-1b53-29b7b543674d„´precedence_heuristic	§cell_idÙ$3f0aec92-e6e1-11ea-1b53-29b7b543674d´downstream_cells_map€²upstream_cells_map€Ù$991ddb18-e6e6-11ea-220d-71b6794f39d8„´precedence_heuristic	§cell_idÙ$991ddb18-e6e6-11ea-220d-71b6794f39d8´downstream_cells_map€²upstream_cells_mapƒ´autograde_results_df‘Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400¡:�¸inspected_notebook_index‘Ù$1a999dfe-e6e1-11ea-12f4-ed24f03245e0Ù$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6„´precedence_heuristic	§cell_idÙ$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e„´precedence_heuristic	§cell_idÙ$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e´downstream_cells_map�­GradingAction•Ù$9057dc04-e6d2-11ea-196b-1519cac7d248Ù$3abb56e4-e6d3-11ea-3337-392a434e1a21Ù$96917e4e-f687-11ea-2256-7b1057a3b523Ù$e5d3fa7c-f687-11ea-044f-6b00f0321da8Ù$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936²upstream_cells_map€Ù$a6fe722e-e6da-11ea-21e8-1dea77b462ef„´precedence_heuristic	§cell_idÙ$a6fe722e-e6da-11ea-21e8-1dea77b462ef´downstream_cells_map�·submission_files_to_run‘Ù$5642a754-e6d9-11ea-35b6-0fe20d6a098e²upstream_cells_map…­run_notebooks‘Ù$a1598cfc-e6d7-11ea-1f0b-f5560304fe7a°submission_files‘Ù$427f19de-e6d2-11ea-10a8-5d3552224b31¦String�¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc®Pluto.tamepath�Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790d„´precedence_heuristic	§cell_idÙ$22fd661e-e6e7-11ea-2b4a-8981b17a790d´downstream_cells_map�¸inspected_manual_results’Ù$e9b4c316-f852-11ea-3840-e7b1428df4e9Ù$f131ee3a-f68a-11ea-3d6c-d34439133a63²upstream_cells_mapÞ ¦manual‘Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090eÙ#PlutoRunner.PlutoRunner.create_bond�¢|>�¥@bind�©@MIME_str�²inspected_notebook‘Ù$64c26a50-e6df-11ea-2762-57186f445501¤join�¤Base�«PlutoRunner�£map�¤HTML�©enumerate�´PlutoRunner.Base.get�³manual_results_dict‘Ù$633ee8e4-f68a-11ea-271e-433eafd12a62¤repr�»PlutoRunner.Core.applicable�Ù$a3e47050-e6de-11ea-2a91-0597143f71ba„´precedence_heuristic	§cell_idÙ$a3e47050-e6de-11ea-2a91-0597143f71ba´downstream_cells_map€²upstream_cells_mapŒ§@md_str�­Base.getindex�©Pluto.run�¦@async�­pluto_session‘Ù$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc©Base.Task�¤Base�­Base.schedule�©Base.put!�ªrun_server‘Ù$9c1c40f0-e6de-11ea-08d8-77acb2a550d4©##sync#52�Ù$5642a754-e6d9-11ea-35b6-0fe20d6a098e„´precedence_heuristic	§cell_idÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098e´downstream_cells_map�©notebooks“Ù$33e66768-e6d9-11ea-1aba-256b4c9998b8Ù$eade89f2-e6de-11ea-11bb-531a6b65c666Ù$64c26a50-e6df-11ea-2762-57186f445501²upstream_cells_map‰®Pluto.tamepath�£map�¦values�­pluto_session‘Ù$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c·submission_files_to_run‘Ù$a6fe722e-e6da-11ea-21e8-1dea77b462ef½Pluto.SessionActions.shutdown�¶Pluto.update_save_run!�¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc³Pluto.load_notebook�Ù$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763„´precedence_heuristic	§cell_idÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763´downstream_cells_map€²upstream_cells_map†§@md_str�¨getindex�°submission_files‘Ù$427f19de-e6d2-11ea-10a8-5d3552224b31¡!�©isabspath�£all�Ù$6b40e1d0-f865-11ea-3c2a-39fb643c8068„´precedence_heuristic	§cell_idÙ$6b40e1d0-f865-11ea-3c2a-39fb643c8068´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e48f2a16-e6e1-11ea-070a-d58f87569b91„´precedence_heuristic	§cell_idÙ$e48f2a16-e6e1-11ea-070a-d58f87569b91´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6a„´precedence_heuristic	§cell_idÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3abb56e4-e6d3-11ea-3337-392a434e1a21„´precedence_heuristic	§cell_idÙ$3abb56e4-e6d3-11ea-3337-392a434e1a21´downstream_cells_map�¨GetValue’Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51fÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2b²upstream_cells_map‚­GradingAction‘Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e¤Expr�Ù$ce055a44-e6d8-11ea-3a07-75392c0f6c26„´precedence_heuristic	§cell_idÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef„´precedence_heuristic	§cell_idÙ$7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef´downstream_cells_map€²upstream_cells_map‚´autograde_results_df‘Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400©HTMLTable�Ù$459687e0-e6e3-11ea-0c85-89516c7a2da0„´precedence_heuristic	§cell_idÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0´downstream_cells_map€²upstream_cells_map„£CSV‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bc¦sprint�®DownloadButton�±manual_results_df‘Ù$469a28fc-f856-11ea-2a6b-a706e607cf9fÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57a„´precedence_heuristic	§cell_idÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57a´downstream_cells_map€²upstream_cells_map‚£sum�§actions‘Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51fÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ce„´precedence_heuristic	§cell_idÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ce´downstream_cells_map€²upstream_cells_map�¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bcÙ$96917e4e-f687-11ea-2256-7b1057a3b523„´precedence_heuristic	§cell_idÙ$96917e4e-f687-11ea-2256-7b1057a3b523´downstream_cells_map�±ManualScoreAction‘Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090e²upstream_cells_mapƒ­GradingAction‘Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e¦Number�¬points_valie�Ù$469a28fc-f856-11ea-2a6b-a706e607cf9f„´precedence_heuristic	§cell_idÙ$469a28fc-f856-11ea-2a6b-a706e607cf9f´downstream_cells_map�±manual_results_df‘Ù$459687e0-e6e3-11ea-0c85-89516c7a2da0²upstream_cells_mapŒ¦manual‘Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090e´autograde_results_df‘Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400¡:�§collect�¢=>�£zip�¦Symbol�»updated_manual_results_dict‘Ù$f131ee3a-f68a-11ea-3d6c-d34439133a63£map�©enumerate�©DataFrame�«displayname‘Ù$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936Ù$b6b986c8-e6de-11ea-1d13-5d9d370eccdc„´precedence_heuristic	§cell_idÙ$b6b986c8-e6de-11ea-1d13-5d9d370eccdc´downstream_cells_map€²upstream_cells_map†¢cd�¤HTML�ªrun_server‘Ù$9c1c40f0-e6de-11ea-08d8-77acb2a550d4§dirname�¢|>�²inspected_notebook‘Ù$64c26a50-e6df-11ea-2762-57186f445501Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51f„´precedence_heuristic	§cell_idÙ$eaa49370-e6da-11ea-21d9-ddf11a7df51f´downstream_cells_map�§actions“Ù$c0d9fb36-f858-11ea-35c0-77963b5cf57aÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400²upstream_cells_map‚¨GetValue‘Ù$3abb56e4-e6d3-11ea-3337-392a434e1a21®AutoTestAction‘Ù$9057dc04-e6d2-11ea-196b-1519cac7d248Ù$490cc11a-00cb-11eb-24bc-2fb026c3094e„´precedence_heuristic	§cell_idÙ$490cc11a-00cb-11eb-24bc-2fb026c3094e´downstream_cells_map€²upstream_cells_map�£all�Ù$31111cbe-e6d3-11ea-0130-a98e45b82f2b„´precedence_heuristic	§cell_idÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2b´downstream_cells_map�©do_action‘Ù$33e66768-e6d9-11ea-1aba-256b4c9998b8²upstream_cells_map†¤zero�°eval_in_notebook‘Ù$33588e20-e6d4-11ea-08f6-7d10d9ef1481¨GetValue‘Ù$3abb56e4-e6d3-11ea-3337-392a434e1a21£===�®AutoTestAction‘Ù$9057dc04-e6d2-11ea-196b-1519cac7d248¥Pluto‘Ù$65d601a6-fe45-11ea-22c6-270bf7d353bcÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63„´precedence_heuristic	§cell_idÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63´downstream_cells_map�»updated_manual_results_dict‘Ù$469a28fc-f856-11ea-2a6b-a706e607cf9f²upstream_cells_map†§missing�£===�¸inspected_notebook_index‘Ù$1a999dfe-e6e1-11ea-12f4-ed24f03245e0³manual_results_dict‘Ù$633ee8e4-f68a-11ea-271e-433eafd12a62¸inspected_manual_results‘Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790d£!==�Ù$64c26a50-e6df-11ea-2762-57186f445501„´precedence_heuristic	§cell_idÙ$64c26a50-e6df-11ea-2762-57186f445501´downstream_cells_map�²inspected_notebook“Ù$b6b986c8-e6de-11ea-1d13-5d9d370eccdcÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790d²upstream_cells_map‚¸inspected_notebook_index‘Ù$1a999dfe-e6e1-11ea-12f4-ed24f03245e0©notebooks‘Ù$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8„´precedence_heuristic	§cell_idÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8´downstream_cells_map�±autograde_results‘Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400²upstream_cells_map„£map�§actions‘Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51f©do_action‘Ù$31111cbe-e6d3-11ea-0130-a98e45b82f2b©notebooks‘Ù$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ce„´precedence_heuristic	§cell_idÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ce´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$8904534a-e6e1-11ea-34b7-31d1f6f8ca8f„´precedence_heuristic	§cell_idÙ$8904534a-e6e1-11ea-34b7-31d1f6f8ca8f´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$122cbbdc-00cd-11eb-223b-ef82328f674f„´precedence_heuristic	§cell_idÙ$122cbbdc-00cd-11eb-223b-ef82328f674f´downstream_cells_map€²upstream_cells_map†¢<=�¡<�¡-�¡>�¡+�¡*�Ù$b8d4598c-f686-11ea-24dc-6f94370fc996„´precedence_heuristic	§cell_idÙ$b8d4598c-f686-11ea-24dc-6f94370fc996´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$dfbaecac-f855-11ea-1f3e-0522a86136ea„´precedence_heuristic	§cell_idÙ$dfbaecac-f855-11ea-1f3e-0522a86136ea´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a1598cfc-e6d7-11ea-1f0b-f5560304fe7a„´precedence_heuristic	§cell_idÙ$a1598cfc-e6d7-11ea-1f0b-f5560304fe7a´downstream_cells_map�­run_notebooks‘Ù$a6fe722e-e6da-11ea-21e8-1dea77b462ef²upstream_cells_mapŒ¤Core�§@md_str�¨Base.get�¥@bind�¦length�¤Base�«PlutoRunner�¨CheckBox�·PlutoRunner.create_bond�°submission_files‘Ù$427f19de-e6d2-11ea-10a8-5d3552224b31¯Core.applicable�¨getindex�´cell_execution_orderÜ AÙ$65d601a6-fe45-11ea-22c6-270bf7d353bcÙ$122cbbdc-00cd-11eb-223b-ef82328f674fÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6aÙ$836cc4be-e6d7-11ea-2a6e-436c187304daÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532Ù$427f19de-e6d2-11ea-10a8-5d3552224b31Ù$6b40e1d0-f865-11ea-3c2a-39fb643c8068Ù$728d1ca8-f865-11ea-1a3e-33cb0a44b9ddÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763Ù$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6Ù$a0776916-f865-11ea-387a-bf2e3094a182Ù$490cc11a-00cb-11eb-24bc-2fb026c3094eÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767Ù$a1598cfc-e6d7-11ea-1f0b-f5560304fe7aÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875cÙ$a6fe722e-e6da-11ea-21e8-1dea77b462efÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ceÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$3f0aec92-e6e1-11ea-1b53-29b7b543674dÙ$3fb6b20c-e6e1-11ea-35eb-e74598e31dafÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3Ù$9c1c40f0-e6de-11ea-08d8-77acb2a550d4Ù$a3e47050-e6de-11ea-2a91-0597143f71baÙ$657f23ce-f687-11ea-13c0-f9959437ddf5Ù$8904534a-e6e1-11ea-34b7-31d1f6f8ca8fÙ$eade89f2-e6de-11ea-11bb-531a6b65c666Ù$9815b7f4-f686-11ea-0760-05b34811be7fÙ$b8d4598c-f686-11ea-24dc-6f94370fc996Ù$ca945d02-f686-11ea-03b4-393858220381Ù$dfbaecac-f855-11ea-1f3e-0522a86136eaÙ$0ae5802c-f856-11ea-11ac-31a3ba67606cÙ$633ee8e4-f68a-11ea-271e-433eafd12a62Ù$06edecc6-f864-11ea-03b0-03db23d2c780Ù$1a999dfe-e6e1-11ea-12f4-ed24f03245e0Ù$64c26a50-e6df-11ea-2762-57186f445501Ù$b6b986c8-e6de-11ea-1d13-5d9d370eccdcÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ceÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71eÙ$9057dc04-e6d2-11ea-196b-1519cac7d248Ù$3abb56e4-e6d3-11ea-3337-392a434e1a21Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51fÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57aÙ$96917e4e-f687-11ea-2256-7b1057a3b523Ù$e5d3fa7c-f687-11ea-044f-6b00f0321da8Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090eÙ$144aa7ec-f864-11ea-35c4-43e19d898887Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790dÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9Ù$f131ee3a-f68a-11ea-3d6c-d34439133a63Ù$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936Ù$e48f2a16-e6e1-11ea-070a-d58f87569b91Ù$33588e20-e6d4-11ea-08f6-7d10d9ef1481Ù$31111cbe-e6d3-11ea-0130-a98e45b82f2bÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8Ù$5ca8fb02-e6e3-11ea-0ad6-158746799400Ù$7cb1c9bc-f684-11ea-00f3-dfd11c9b72efÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675Ù$991ddb18-e6e6-11ea-220d-71b6794f39d8Ù$469a28fc-f856-11ea-2a6b-a706e607cf9fÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0Ù$bbcd528e-e6e5-11ea-2d9c-a50835477b2eÙ$0796b462-f85c-11ea-1bf2-53ad24ec447cÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bcÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6´last_hot_reload_timeË        ©shortpathªupdated.jl®process_status¥ready¤pathÙL/home/runner/work/disorganised-mess/disorganised-mess/autograding/updated.jl­pluto_version¨v0.19.47®last_save_timeËAÚý'aªcell_orderÜ AÙ$65d601a6-fe45-11ea-22c6-270bf7d353bcÙ$122cbbdc-00cd-11eb-223b-ef82328f674fÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6aÙ$836cc4be-e6d7-11ea-2a6e-436c187304daÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532Ù$427f19de-e6d2-11ea-10a8-5d3552224b31Ù$6b40e1d0-f865-11ea-3c2a-39fb643c8068Ù$728d1ca8-f865-11ea-1a3e-33cb0a44b9ddÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763Ù$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6Ù$a0776916-f865-11ea-387a-bf2e3094a182Ù$eaa49370-e6da-11ea-21d9-ddf11a7df51fÙ$490cc11a-00cb-11eb-24bc-2fb026c3094eÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57aÙ$7cb1c9bc-f684-11ea-00f3-dfd11c9b72efÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767Ù$a1598cfc-e6d7-11ea-1f0b-f5560304fe7aÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875cÙ$a6fe722e-e6da-11ea-21e8-1dea77b462efÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ceÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098eÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8Ù$3f0aec92-e6e1-11ea-1b53-29b7b543674dÙ$5ca8fb02-e6e3-11ea-0ad6-158746799400Ù$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675Ù$3fb6b20c-e6e1-11ea-35eb-e74598e31dafÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3Ù$9c1c40f0-e6de-11ea-08d8-77acb2a550d4Ù$a3e47050-e6de-11ea-2a91-0597143f71baÙ$657f23ce-f687-11ea-13c0-f9959437ddf5Ù$7b3bb8c8-f687-11ea-27bb-45ed5807090eÙ$144aa7ec-f864-11ea-35c4-43e19d898887Ù$8904534a-e6e1-11ea-34b7-31d1f6f8ca8fÙ$eade89f2-e6de-11ea-11bb-531a6b65c666Ù$9815b7f4-f686-11ea-0760-05b34811be7fÙ$991ddb18-e6e6-11ea-220d-71b6794f39d8Ù$b8d4598c-f686-11ea-24dc-6f94370fc996Ù$b6b986c8-e6de-11ea-1d13-5d9d370eccdcÙ$ca945d02-f686-11ea-03b4-393858220381Ù$dfbaecac-f855-11ea-1f3e-0522a86136eaÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9Ù$22fd661e-e6e7-11ea-2b4a-8981b17a790dÙ$0ae5802c-f856-11ea-11ac-31a3ba67606cÙ$633ee8e4-f68a-11ea-271e-433eafd12a62Ù$469a28fc-f856-11ea-2a6b-a706e607cf9fÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0Ù$06edecc6-f864-11ea-03b0-03db23d2c780Ù$f131ee3a-f68a-11ea-3d6c-d34439133a63Ù$1a999dfe-e6e1-11ea-12f4-ed24f03245e0Ù$64c26a50-e6df-11ea-2762-57186f445501Ù$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ceÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26Ù$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71eÙ$9057dc04-e6d2-11ea-196b-1519cac7d248Ù$3abb56e4-e6d3-11ea-3337-392a434e1a21Ù$96917e4e-f687-11ea-2256-7b1057a3b523Ù$e5d3fa7c-f687-11ea-044f-6b00f0321da8Ù$31111cbe-e6d3-11ea-0130-a98e45b82f2bÙ$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936Ù$e48f2a16-e6e1-11ea-070a-d58f87569b91Ù$33588e20-e6d4-11ea-08f6-7d10d9ef1481Ù$bbcd528e-e6e5-11ea-2d9c-a50835477b2eÙ$0796b462-f85c-11ea-1bf2-53ad24ec447cÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bcÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6±published_objects€¥nbpkgŠ¯install_time_nsÎÂR–¬instantiatedÃ²installed_versions†£CSV§0.10.15§PlutoUI¦0.7.64ªDataFrames¥1.7.0¥UUIDs¦stdlib¥Pluto§0.19.47«Distributed¦stdlib°terminal_outputs‡£CSVÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`ªnbpkg_syncÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`§PlutoUIÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`ªDataFramesÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`¥UUIDsÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`¥PlutoÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`«DistributedÚ
[0m[1mInstantiating...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mResolving...[22m
[90m===[39m
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Project.toml`
[32m[1m  No Changes[22m[39m to `/tmp/jl_p35YZb/Manifest.toml`

[0m[1mAdding packages...[22m
[90m===[39m
[32m[1m   Resolving[22m[39m package versions...
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Project.toml`
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
[32m[1m    Updating[22m[39m `/tmp/jl_p35YZb/Manifest.toml`
 [90m [6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [336ed68f] [39m[92m+ CSV v0.10.15[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.12.1[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [5218b696] [39m[92m+ Configurations v0.17.6[39m
 [90m [a8cc5b0e] [39m[92m+ Crayons v4.1.1[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [a93c6f00] [39m[92m+ DataFrames v1.7.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [21656369] [39m[92m+ ExpressionExplorer v1.0.4[39m
 [90m [55351af7] [39m[92m+ ExproniconLite v0.10.14[39m
 [90m [48062228] [39m[92m+ FilePathsBase v0.9.24[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [fb4132e2] [39m[92m+ FuzzyCompletions v0.5.5[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
 [90m [ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
 [90m [b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
 [90m [842dd82b] [39m[92m+ InlineStrings v1.4.4[39m
 [90m [41ab1584] [39m[92m+ InvertedIndices v1.3.1[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [0e77f7df] [39m[92m+ LazilyInitializedFields v1.3.0[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [6c6e2e6c] [39m[92m+ MIMEs v0.1.4[39m
 [90m [36869731] [39m[92m+ Malt v1.1.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [99f44e22] [39m[92m+ MsgPack v1.2.1[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [c3e4b0f8] [39m[92m+ Pluto v0.19.47[39m
 [90m [72656b73] [39m[92m+ PlutoDependencyExplorer v1.0.4[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.7.64[39m
 [90m [2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
 [90m [91cefc8d] [39m[92m+ PrecompileSignatures v3.0.3[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [08abe8d2] [39m[92m+ PrettyTables v2.3.2[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [2792f1a3] [39m[92m+ RegistryInstances v0.1.0[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [892a3eda] [39m[92m+ StringManipulation v0.3.4[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [410a4b4d] [39m[92m+ Tricks v0.1.10[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [ea10d353] [39m[92m+ WeakRefStrings v1.4.2[39m
 [90m [76eceee3] [39m[92m+ WorkerUtilities v1.6.1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v3.5.0+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mLoading[22m[39m packages...

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_p35YZb`§enabledÃ·restart_recommended_msgÀ´restart_required_msgÀ­busy_packages�¶waiting_for_permissionÂÙ,waiting_for_permission_but_probably_disabledÂ«cell_inputsÞ AÙ$836cc4be-e6d7-11ea-2a6e-436c187304da„§cell_idÙ$836cc4be-e6d7-11ea-2a6e-436c187304da¤codeÙ&md"## Step 1: Select submission files"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$728d1ca8-f865-11ea-1a3e-33cb0a44b9dd„§cell_idÙ$728d1ca8-f865-11ea-1a3e-33cb0a44b9dd¤codeÙzsubmission_files_EXAMPLE = ["/home/fonsi/hw1/submissions/hw1 - fonsi.jl", "/home/fonsi/hw1/submissions/hw1 - template.jl"]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$65d601a6-fe45-11ea-22c6-270bf7d353bc„§cell_idÙ$65d601a6-fe45-11ea-22c6-270bf7d353bc¤codeÙvbegin
	
		import Pluto
		import UUIDs: UUID
		import Distributed
		using PlutoUI
		using DataFrames
		import CSV
	
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532„§cell_idÙ$4e4e78d2-f865-11ea-0c21-fdd76cbf3532¤codeÙ¥md"You need to write some code that returns the **absolute paths** to the students' homework submissions. The following code works for me, but probably not for you."¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$5ca8fb02-e6e3-11ea-0ad6-158746799400„§cell_idÙ$5ca8fb02-e6e3-11ea-0ad6-158746799400¤codeÙ·autograde_results_df = DataFrame(map(autograde_results) do results
		(;
			map(zip(actions, results)) do (action, result)
				Symbol(displayname(action)) => result
			end...
		)
	end)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$0ae5802c-f856-11ea-11ac-31a3ba67606c„§cell_idÙ$0ae5802c-f856-11ea-11ac-31a3ba67606c¤codeÙ2@bind reset_results Button("Reset manual results")¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$e5d3fa7c-f687-11ea-044f-6b00f0321da8„§cell_idÙ$e5d3fa7c-f687-11ea-044f-6b00f0321da8¤codeÙµbegin
	struct ManualCheckAction <: GradingAction
		name
		points_value::Number
		rubric
	end
	ManualCheckAction(name, points_value) = ManualCheckAction(name, points_valie, name)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$633ee8e4-f68a-11ea-271e-433eafd12a62„§cell_idÙ$633ee8e4-f68a-11ea-271e-433eafd12a62¤codeÙ5manual_results_dict = let
	reset_results
	Dict()
end;¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$1a999dfe-e6e1-11ea-12f4-ed24f03245e0„§cell_idÙ$1a999dfe-e6e1-11ea-12f4-ed24f03245e0¤codeÙCinspected_notebook_index = parse(Int, inspected_notebook_index_str)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$657f23ce-f687-11ea-13c0-f9959437ddf5„§cell_idÙ$657f23ce-f687-11ea-13c0-f9959437ddf5¤codeÙ#md"## Step 2: manual grade actions"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$3fb6b20c-e6e1-11ea-35eb-e74598e31daf„§cell_idÙ$3fb6b20c-e6e1-11ea-35eb-e74598e31daf¤code»md"# Part 2: manual review"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6„§cell_idÙ$c7553450-f85b-11ea-1dbd-3d72253a58d6¤codeÙXgraders = map(split(graders_raw, '\n')) do line
	GradedStudent(split(line, '\t')...)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$427f19de-e6d2-11ea-10a8-5d3552224b31„§cell_idÙ$427f19de-e6d2-11ea-10a8-5d3552224b31¤codeÙ“submission_files = let
	all = readdir("/home/fons/disorganised-mess/autograding/submissions/"; join=true)
	filter(f -> endswith(f, ".jl"), all)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9„§cell_idÙ$e9b4c316-f852-11ea-3840-e7b1428df4e9¤codeÙ¿if inspected_manual_results === missing
	get(manual_results_dict, basename(inspected_notebook.path), 
	md"_Scores for this homework are not yet saved._"
		)
else
	inspected_manual_results
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$a0776916-f865-11ea-387a-bf2e3094a182„§cell_idÙ$a0776916-f865-11ea-387a-bf2e3094a182¤codeÙ6md"I have already written these, you can ignore this."¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481„§cell_idÙ$33588e20-e6d4-11ea-08f6-7d10d9ef1481¤codeÙøfunction eval_in_notebook(notebook::Pluto.Notebook, expr)
	ws = Pluto.WorkspaceManager.get_workspace((pluto_session, notebook))
	fetcher = :(Core.eval($(ws.module_name), $(expr |> QuoteNode)))
	Distributed.remotecall_eval(Main, ws.pid, fetcher)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$06edecc6-f864-11ea-03b0-03db23d2c780„§cell_idÙ$06edecc6-f864-11ea-03b0-03db23d2c780¤code ¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767„§cell_idÙ$8c6c6114-e6d7-11ea-20b1-e718907e0767¤codeÙ&md"## Step 3: autograde all notebooks"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936„§cell_idÙ$8b9a3f7a-e6d4-11ea-34c5-ef986e6af936¤codeÙJbegin
	
	
	# default
	displayname(action::GradingAction) = action.name
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$0796b462-f85c-11ea-1bf2-53ad24ec447c„§cell_idÙ$0796b462-f85c-11ea-1bf2-53ad24ec447c¤codeÙ-struct GradedStudent
	name
	email
	grader
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$9057dc04-e6d2-11ea-196b-1519cac7d248„§cell_idÙ$9057dc04-e6d2-11ea-196b-1519cac7d248¤codeÙRstruct AutoTestAction <: GradingAction
	name
	points_value::Number
	test::Expr
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3„§cell_idÙ$9090ee3e-e6de-11ea-14c3-27032e8710d3¤codeÙ$md"## Step 1: start notebook server"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$ca945d02-f686-11ea-03b4-393858220381„§cell_idÙ$ca945d02-f686-11ea-03b4-393858220381¤code·md"#### Manual grading"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$9c1c40f0-e6de-11ea-08d8-77acb2a550d4„§cell_idÙ$9c1c40f0-e6de-11ea-08d8-77acb2a550d4¤codeÙamd"**Click to start notebook server:**

 $(@bind run_server CheckBox()) run notebook server

---"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675„§cell_idÙ$c9a66a4a-e6e4-11ea-0528-f3bbf6f17675¤codeÙPDownloadButton(sprint(CSV.write, autograde_results_df), "autograde_results.csv")¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bc„§cell_idÙ$b6512e8e-f85b-11ea-0cb6-619a5b3f67bc¤codeµgraders_raw = """
"""¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$9815b7f4-f686-11ea-0760-05b34811be7f„§cell_idÙ$9815b7f4-f686-11ea-0760-05b34811be7f¤codeÙ0md"#### Autograde results for selected homework"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c„§cell_idÙ$b5d0d970-e6d9-11ea-20a5-01f0c4e3875c¤codeÙãpluto_session = Pluto.ServerSession(;options=Pluto.Configuration.from_flat_kwargs(
	launch_browser=false, 
	require_secret_for_open_links=false,
	require_secret_for_access=false,
	workspace_use_distributed=false,
	port=2468,
))¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$7b3bb8c8-f687-11ea-27bb-45ed5807090e„§cell_idÙ$7b3bb8c8-f687-11ea-27bb-45ed5807090e¤codeÚÜmanual = [
	ManualCheckAction("3.1 - colored line", 5, md"Did they write `colored_line(v)`?"),
	
	ManualScoreAction("3.4 - make it interactive", 8, md"Did they create a slider? Does the slider control the amount of blur?"),
	
	ManualScoreAction("4.2 - convolve_image", 20, md"Is convole_image correct?"),
	ManualScoreAction("4.3 - Gaussian blur", 10, md"Does the Gaussian blur look okay?"),
	ManualScoreAction("4.4 - Sobel filter", 10, md"Does the Sobel filter look okay?"),
]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$144aa7ec-f864-11ea-35c4-43e19d898887„§cell_idÙ$144aa7ec-f864-11ea-35c4-43e19d898887¤codeÙDsum(manual) do action
	try
		action.points_value
	catch
		0
	end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$eade89f2-e6de-11ea-11bb-531a6b65c666„§cell_idÙ$eade89f2-e6de-11ea-11bb-531a6b65c666¤codeÙd@bind inspected_notebook_index_str Select([string(i) => nb.path for (i,nb) in enumerate(notebooks)])¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$bbcd528e-e6e5-11ea-2d9c-a50835477b2e„§cell_idÙ$bbcd528e-e6e5-11ea-2d9c-a50835477b2e¤code¯md"## Not used"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$3f0aec92-e6e1-11ea-1b53-29b7b543674d„§cell_idÙ$3f0aec92-e6e1-11ea-1b53-29b7b543674d¤code ¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$991ddb18-e6e6-11ea-220d-71b6794f39d8„§cell_idÙ$991ddb18-e6e6-11ea-220d-71b6794f39d8¤codeÙ1autograde_results_df[inspected_notebook_index, :]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6„§cell_idÙ$d0dd703a-e6da-11ea-1d4f-0b10bf75fad6¤codeÙ md"## Step 2: autograde actions"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e„§cell_idÙ$c1f5bd3a-e6d2-11ea-20ab-d93e142aa71e¤code¿abstract type GradingAction end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$a6fe722e-e6da-11ea-21e8-1dea77b462ef„§cell_idÙ$a6fe722e-e6da-11ea-21e8-1dea77b462ef¤codeÙVsubmission_files_to_run = run_notebooks ? Pluto.tamepath.(submission_files) : String[]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$22fd661e-e6e7-11ea-2b4a-8981b17a790d„§cell_idÙ$22fd661e-e6e7-11ea-2b4a-8981b17a790d¤codeÚ+# struct ManualCheckAction <: GradingAction
# 		name
# 		points_value::Number
# 		rubric
# 	end
begin
	inspected_notebook
	manual_results_dict
@bind inspected_manual_results let
	boxes = map(enumerate(manual)) do (i,action)
		"""<tr>
		<td><input type='number' id='field$(i)' min=0 max=$(action.points_value) step=1 value=$(action.points_value)><code> / $(action.points_value)</code></td>
		<td>$(repr(MIME"text/html"(), action.rubric))</td>
		</tr>"""
	end
	
	"""
<div id="hello">
<table>
	<tbody>
	$(join(boxes))
	</tbody>
</table>
<input type="submit" value="Save!">
	</div>

	
<style>
	div#hello table td {
		text-align: left;
	}
	div#hello table input[type=number] {
		width: 4em;
		text-align: center;
	}
</style>
<script>
	const div = this.querySelector("#hello")
	const table = div.querySelector("table")
	const inputs = table.querySelectorAll("input")
	
	const update_value = () => {
		//div.value = Object.fromEntries(Array.from(inputs).map((b) => [b.id, b.value]))
		div.value = Array.from(inputs).map((b) => Number(b.value))
	}
	
	inputs.forEach(el => {
		el.oninput = (e) => {
			update_value()
			e.stopPropagation()
		}
	})
	
	const submit = div.querySelector("input[type=submit]")
	submit.onclick = () => {
		update_value()
		div.dispatchEvent(new CustomEvent("input", {}))
	}

</script>
""" |> HTML
end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$a3e47050-e6de-11ea-2a91-0597143f71ba„§cell_idÙ$a3e47050-e6de-11ea-2a91-0597143f71ba¤codeÙ�if run_server
	@async Pluto.run(pluto_session)
	
	md"> Server is running at [https://localhost:2468](https://localhost:2468)"
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098e„§cell_idÙ$5642a754-e6d9-11ea-35b6-0fe20d6a098e¤codeÚenotebooks = let
	for nb in values(pluto_session.notebooks)
		Pluto.SessionActions.shutdown(pluto_session, nb)
    end
	map(submission_files_to_run) do path
		nb = Pluto.load_notebook(Pluto.tamepath(path))
		pluto_session.notebooks[nb.notebook_id] = nb
		Pluto.update_save_run!(pluto_session, nb, nb.cells; run_async=false, prerender_text=true)
		nb
	end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763„§cell_idÙ$54c9b77c-e6e2-11ea-03ff-5d0d4a9dd763¤codeÙkif !all(isabspath, submission_files)
	md"""
!!! warning
    Submission paths need to be _absolute_
	"""
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$6b40e1d0-f865-11ea-3c2a-39fb643c8068„§cell_idÙ$6b40e1d0-f865-11ea-3c2a-39fb643c8068¤codeÙ:md"It should return an arrays of strings, something like:"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$e48f2a16-e6e1-11ea-070a-d58f87569b91„§cell_idÙ$e48f2a16-e6e1-11ea-070a-d58f87569b91¤code«md"## Misc"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6a„§cell_idÙ$68da9dec-e6e1-11ea-1d9e-cdb7028f9b6a¤code¹md"# Part 1: autograding"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$3abb56e4-e6d3-11ea-3337-392a434e1a21„§cell_idÙ$3abb56e4-e6d3-11ea-3337-392a434e1a21¤codeÙ8struct GetValue <: GradingAction
	name
	getter::Expr
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26„§cell_idÙ$ce055a44-e6d8-11ea-3a07-75392c0f6c26¤code¶md"## Grading actions"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef„§cell_idÙ$7cb1c9bc-f684-11ea-00f3-dfd11c9b72ef¤code¿HTMLTable(autograde_results_df)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0„§cell_idÙ$459687e0-e6e3-11ea-0c85-89516c7a2da0¤codeÙJDownloadButton(sprint(CSV.write, manual_results_df), "manual_results.csv")¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57a„§cell_idÙ$c0d9fb36-f858-11ea-35c0-77963b5cf57a¤codeÙEsum(actions) do action
	try
		action.points_value
	catch
		0
	end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ce„§cell_idÙ$9982bbfa-00c0-11eb-0a5c-818fae8c01ce¤code¥Pluto¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$96917e4e-f687-11ea-2256-7b1057a3b523„§cell_idÙ$96917e4e-f687-11ea-2256-7b1057a3b523¤codeÙµbegin
	struct ManualScoreAction <: GradingAction
		name
		points_value::Number
		rubric
	end
	ManualScoreAction(name, points_value) = ManualScoreAction(name, points_valie, name)
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$469a28fc-f856-11ea-2a6b-a706e607cf9f„§cell_idÙ$469a28fc-f856-11ea-2a6b-a706e607cf9f¤codeÚ
manual_results_df = DataFrame(map(enumerate(collect(updated_manual_results_dict))) do (i,(filename, results))
		
		(;
			map(zip(manual, results)) do (action, result)
				Symbol(displayname(action)) => result
			end...,
			
			autograde_results_df[1,:]...,
		)
	end)¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$b6b986c8-e6de-11ea-1d13-5d9d370eccdc„§cell_idÙ$b6b986c8-e6de-11ea-1d13-5d9d370eccdc¤codeÚ	if run_server
	cd(inspected_notebook.path |> dirname)
	"""
	<iframe src="http://localhost:2468/edit?id=$(inspected_notebook.notebook_id)" style="width: calc(100% - 8px); height: 100vh; margin: 0; border: 4px solid pink;"  allow="camera;microphone">
	""" |> HTML
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$eaa49370-e6da-11ea-21d9-ddf11a7df51f„§cell_idÙ$eaa49370-e6da-11ea-21d9-ddf11a7df51f¤codeÚ¹actions = let
	prologue = quote

function solution_extend(v, i)
	if i < 1
		v[1]
	elseif i > length(v)
		v[end]
	else
		v[i]
	end
end

function solution_blur_1D(v, l)
	return map(eachindex(v)) do i
		mean([extend(v, i+j) for j in -l:l])
	end
end

function solution_convolve_vector(v, k)
	l = (length(k) - 1) Ã· 2
	return map(eachindex(v)) do i
		sum([extend(v, i - j) * k[j + 1 + l] for j in -l:l])
	end
end

function solution_pascal(n)
	if n <= 1
		[1.0]
	else
		prev = pascal(n - 1)
		0.5 * ([prev..., 0] .+ [0, prev...])
	end
end

function solution_gaussian_kernel(n)
	solution_pascal(2n+1)
end

function solution_extend_mat(M::AbstractMatrix, i, j)
	if i < 1
		solution_extend_mat(M, 1, j)
	elseif i > size(M, 1)
		solution_extend_mat(M, size(M,1), j)
	else
		if j < 1
			solution_extend_mat(M, i, 1)
		elseif j > size(M, 2)
			solution_extend_mat(M, i, size(M,2))
		else
			M[i,j]
		end
	end
end

function solution_convolve_image(M::AbstractMatrix, K::AbstractMatrix)
	l = (size(K,1) - 1) Ã· 2
	
	map(CartesianIndices(M)) do i
		sum(CartesianIndices(K)) do a
			
			offset = a - CartesianIndex(-l-1, -l-1)
			
			extend_mat(M, (i - offset).I...) * K[a]
		end
	end
end

function solution_convolve_image_inverted(M::AbstractMatrix, K::AbstractMatrix)
	l = (size(K,1) - 1) Ã· 2
	
	map(CartesianIndices(M)) do i
		sum(CartesianIndices(K)) do a
			
			offset = a - CartesianIndex(-l-1, -l-1)
			
			extend_mat(M, (i + offset).I...) * K[a]
		end
	end
end


function solution_with_gaussian_blur(image; sigma=3, l=5)
	gauss(x,y; sigma=3) = (1/(2*pi*sigma^2))exp(-(x^2 + y^2)/(2*sigma^2))
	K_gauss = [gauss(xy...) for xy in Iterators.product(-l:l,-l:l)]
	convolve_image(image, K_gauss ./ sum(K_gauss))
end

function solution_sobel_edge_detect(image)
	K_sobol = [
	1 0 -1
	2 0 -2
	1 0 -1
	]
	x = solution_convolve_image(image, K_sobol)
	y = solution_convolve_image(image, K_sobol')
	return x .* x .+ y .* y
end
		
		testimg() = rand(RGB, (10, 20))
end



actions = [
GetValue("name", :(student.name)),
GetValue("kerberos_id", :(student.kerberos_id)),

##Excercise 1.1
AutoTestAction("1.1 - random vector", 5, quote
length(random_vect) == 10 && length(Set(random_vect)) == 10
end),

AutoTestAction("1.1 - mean", 5, quote
mean([-1, -1, 2]) â‰ˆ 0
end),

AutoTestAction("1.1 - mean of random vec", 2.5, quote
m == mean(random_vect)
end),

AutoTestAction("1.1 - demean function", 5, quote
demean([1,2,3,4,5]) â‰ˆ [-2,-1,0,1,2]
end),

##Excercise 1.2
AutoTestAction("1.2 - create bar - 20", 2.5, quote
create_bar() â‰ˆ let
		x = zeros(100)
		x[40:59] .= 1
		x
	end
end),

AutoTestAction("1.2 - create bar - 20 or 21", 2.5, quote
create_bar() â‰ˆ let
		x = zeros(100)
		x[40:59] .= 1
		x
	end || 
create_bar() â‰ˆ let
		x = zeros(100)
		x[40:60] .= 1
		x
	end
end),

##Excercise 1.3
AutoTestAction("1.3 - vecvec_to_matrix", 5, quote
vecvec_to_matrix([[1,2,3], [4,5,6], [7,8,9]]) == hcat([1,2,3], [4,5,6], [7,8,9]) ||
vecvec_to_matrix([[1,2,3], [4,5,6], [7,8,9]]) == hcat([1,2,3], [4,5,6], [7,8,9])'
end),

AutoTestAction("1.3 - matrix_to_vecvec", 5, quote
				let
					A = [1 2; 4 5; 7 8]
matrix_to_vecvec(A) == collect(eachcol(A)) ||
matrix_to_vecvec(A) == collect(eachrow(A))
				end
end),

##Excercise 2.1
AutoTestAction("2.1 - mean colors", 5, quote
$(prologue)
				t = testimg()
mean_colors(t) == (mean(t).r, mean(t).g, mean(t).b) ||
mean_colors(t) == RGB(mean(t).r, mean(t).g, mean(t).b)
end),

##Excercise 2.2
AutoTestAction("2.2 - quantize::Number", 5, quote
quantize(3) â‰ˆ (floor(30) / 10)
end),

##Excercise 2.3
AutoTestAction("2.3 - quantize::Color", 2.5, quote
				c = rand(RGB)
quantize(c) == RGB(quantize(c.r), quantize(c.g), quantize(c.b))
end),

##Excercise 2.4
AutoTestAction("2.4 - quantize::AbstractMatrix", 2.5, quote
$(prologue)
				t = testimg()
quantize(t) == quantize.(t)
end),

##Excercise 2.5
AutoTestAction("2.5 - invert", 5, quote
				c = rand(RGB)
invert(c) == RGB(1-c.r, 1-c.g, 1-c.b)
end),

##Excercise 2.6
AutoTestAction("2.6 - noisify::Number - noise", 2.5, quote
				
				
let
	N = 10_000
	
	# x = [.5 + rand()*.5 + .25 for _ in 1:N]
	x = [noisify(.5, .25) for _ in 1:N]
	sample_mean = sum(x) / N

	sample_var = sum((x .- sample_mean) .^ 2) / N
	
	abs(sample_mean - .5) < .01 && abs(sample_var - 1/48) < .01
end

end),
AutoTestAction("2.6 - noisify::Number - clamp", 2.5, quote
				
				
let
	N = 10_000
	
	# x = [rand()*.5 + .25 for _ in 1:N]
	x = [noisify(.5, 10) for _ in 1:N]
	
	0.0 <= minimum(x) < maximum(x) <= 1.0
end

end),

AutoTestAction("2.6 - noisify::Color", 2.5, quote
	c = rand(RGB)
	noisify(c, .1) != c
end),

AutoTestAction("2.6 - noisify::Image", 2.5, quote
$(prologue)
	t = testimg()
	noisify(t, .1) != t
end),

##Excercise 3.1
# N/A

##Excercise 3.2
AutoTestAction("3.2 - extend", 10, quote
$(prologue)
extend(v, -5)  == solution_extend(v, -5)
end),

##Excercise 3.3
AutoTestAction("3.3 - blur_1D", 5, quote
$(prologue)
blur_1D(v, 2) == solution_blur_1D(v, 2)
end),

##Exercise 3.4
# N/A

##Excercise 3.5
AutoTestAction("3.5 - convolution", 5, quote
$(prologue)
convolve_vector([1, 10, 100, 1000, 10000], [0, 1, 0]) == solution_convolve_vector([1, 10, 100, 1000, 10000], [0, 1, 0])
end),

##Excercise 3.6
AutoTestAction("3.6 - gaussian_kernel - centered", 2.5, quote
K = gaussian_kernel(9)
				
center = length(K) Ã· 2
				
K[1] < K[center] > K[end]

end),

AutoTestAction("3.6 - gaussian_kernel - normalized", 2.5, quote
K = gaussian_kernel(9)
.9 < sum(K) < 1.1
end),

##Excercise 4.1
AutoTestAction("4.1 - extend mat", 10, quote
$(prologue)
				M = rand(Float64, (3,3))
				all([
		extend_mat(M, i, j) â‰ˆ solution_extend_mat(M, i, j)
	for i in [-5,4,2], j in [-1,1,0,10]
		])
end),

##Excercise 4.2
# AutoTestAction("4.2 - convolve image", 15, quote
# $(prologue)
# 				M = testimg()
# 				K = rand(Float64, (3,3))
# 	convolve_image(M, K) â‰ˆ solution_convolve_image(M, K) || 
# 	convolve_image(M, K) â‰ˆ solution_convolve_image_inverted(M, K)
# end),

# ##Excercise 4.2
# AutoTestAction("4.2 - convolve image - kernel inverted correctly", 5, quote
# $(prologue)
# 				M = testimg()
# 				K = rand(Float64, (3,3))
# 	convolve_image(M, K) â‰ˆ solution_convolve_image(M, K)
# end),

##Excercise 4.3
AutoTestAction("4.3 - with_gaussian_blur - no error", 5, quote
$(prologue)
		try
			with_gaussian_blur(rand(Gray, (20,10))) isa Array
		catch
			false
		end || try
			with_gaussian_blur(rand(Float64, (20,10))) isa Array
		catch
			false
		end || try
			with_gaussian_blur(rand(RGB, (20,10))) isa Array
		catch
			false
		end
end),

##Excercise 4.4
AutoTestAction("4.4 - sobel_edge_detect - no error", 5, quote
	$(prologue)
		try
			with_sobel_edge_detect(rand(Gray, (20,10))) isa Array
		catch
			false
		end || try
			with_sobel_edge_detect(rand(Float64, (20,10))) isa Array
		catch
			false
		end || try
			with_sobel_edge_detect(rand(RGB, (20,10))) isa Array
		catch
			false
		end
	end),
]

end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$490cc11a-00cb-11eb-24bc-2fb026c3094e„§cell_idÙ$490cc11a-00cb-11eb-24bc-2fb026c3094e¤code£all¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2b„§cell_idÙ$31111cbe-e6d3-11ea-0130-a98e45b82f2b¤codeÚ�begin
	function do_action(notebook::Pluto.Notebook, action::AutoTestAction)
		tester = quote
				try
					$(action.test)
				catch
					false
				end
			end
		
		if eval_in_notebook(notebook, tester) === true
			action.points_value
		else
			zero(action.points_value)
		end
	end
	
	function do_action(notebook::Pluto.Notebook, action::GetValue)
		eval_in_notebook(notebook, action.getter)
	end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63„§cell_idÙ$f131ee3a-f68a-11ea-3d6c-d34439133a63¤codeÙÛ# reactively add the result to our Dict
updated_manual_results_dict = let
	if inspected_manual_results !== missing
		manual_results_dict[inspected_notebook_index] = inspected_manual_results
	end
	manual_results_dict
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$64c26a50-e6df-11ea-2762-57186f445501„§cell_idÙ$64c26a50-e6df-11ea-2762-57186f445501¤codeÙ8inspected_notebook = notebooks[inspected_notebook_index]¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8„§cell_idÙ$33e66768-e6d9-11ea-1aba-256b4c9998b8¤codeÙaautograde_results = map(notebooks) do nb
	map(actions) do action
		do_action(nb, action)
	end
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ce„§cell_idÙ$8d1aaee8-e6de-11ea-2c2c-4d2ba138d5ce¤code®md"# Appendix"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$8904534a-e6e1-11ea-34b7-31d1f6f8ca8f„§cell_idÙ$8904534a-e6e1-11ea-34b7-31d1f6f8ca8f¤code¾md"## Step 3: select notebook"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$122cbbdc-00cd-11eb-223b-ef82328f674f„§cell_idÙ$122cbbdc-00cd-11eb-223b-ef82328f674f¤codeÚlet
	function solution_pascal(n)
		if n <= 1
			[1.0]
		else
			prev = solution_pascal(n - 1)
			0.5 * ([prev..., 0] .+ [0, prev...])
		end
	end

	function solution_gaussian_kernel(n)
		solution_pascal(2n+1)
	end

	K = solution_gaussian_kernel(9)
		K[1] < K[5] < K[9] > K[13] > K[17]
end¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÂÙ$b8d4598c-f686-11ea-24dc-6f94370fc996„§cell_idÙ$b8d4598c-f686-11ea-24dc-6f94370fc996¤codeÙ+md"#### Editable view of selected homework"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$dfbaecac-f855-11ea-1f3e-0522a86136ea„§cell_idÙ$dfbaecac-f855-11ea-1f3e-0522a86136ea¤codeÙ.md"Currently stored grades for this notebook:"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃÙ$a1598cfc-e6d7-11ea-1f0b-f5560304fe7a„§cell_idÙ$a1598cfc-e6d7-11ea-1f0b-f5560304fe7a¤codeÙ€md"**Click to start running the notebooks:**

 $(@bind run_notebooks CheckBox()) run $(length(submission_files)) notebooks

---"¨metadataƒ©show_logsÃ¨disabledÂ®skip_as_scriptÂ«code_foldedÃ«notebook_idÙ$1af54e1c-4a9e-11f0-18bf-03ed46314412«in_temp_dirÂ¨metadata€