fonsp / Pluto.jl

🎈 Simple reactive notebooks for Julia
https://plutojl.org/
MIT License
4.91k stars 284 forks source link

`AbstractPlutoDingetjes.Display.with_js_link` is not supported by this `IO` display #2891

Closed sprig closed 2 months ago

sprig commented 2 months ago

Hi!

Thank you for bringing Pluto to life!

While attempting to use AbstractPlutoDingetjes.Display.with_js_link (and likewise with published_to_js) I get the error from the title. Notably, the Main.PlutoRunner.publish_to_js form from the featured js notebook, does work, although in Pluto v0.19.40 I get a deprecation warning. Attached stack trace, MWE. I tried to attach some screenshots but they just disappear, I'll try to add them in a separate comment.

Thanks in advance for any help!

show(io::HypertextLiteral.ScriptTagProxy{IOContext{IOBuffer}}, #unused#::MIME{Symbol("text/javascript")}, wjl::AbstractPlutoDingetjes.Display._JSLink) @ AbstractPlutoDingetjes.jl:553
macro expansion @ script.jl:0
print_script @ script.jl:104
print_script_hook(io::HypertextLiteral.ScriptTagProxy{IOContext{IOBuffer}}, value::AbstractPlutoDingetjes.Display._JSLink) @ script.jl:75
print(ep::HypertextLiteral.EscapeProxy{IOContext{IOBuffer}}, x::HypertextLiteral.ScriptTag) @ script.jl:33
(::HypertextLiteral.var"#3#4"{Tuple{HypertextLiteral.Bypass{String}, HypertextLiteral.ScriptTag, HypertextLiteral.Bypass{String}, HypertextLiteral.ScriptTag, HypertextLiteral.Bypass{String}}})(io::HypertextLiteral.EscapeProxy{IOContext{IOBuffer}}) @ macro.jl:116
show(io::IOContext{IOBuffer}, m::MIME{Symbol("text/html")}, h::HypertextLiteral.Result) @ macro.jl:122
### A Pluto.jl notebook ###
# v0.19.40

using Markdown
using InteractiveUtils

# ╔═║ f7fecf30-5272-495c-a2e3-11b268feadc4
using AbstractPlutoDingetjes

# ╔═║ f5f7d9f2-ad66-49f7-9452-c66e30d587f4
import HypertextLiteral: @htl, JavaScript

# ╔═║ 00e4513d-7eaa-4aea-9716-0710341d88eb
@htl("""
<script>
const v = $(AbstractPlutoDingetjes.Display.with_js_link(rand))
const w = $(AbstractPlutoDingetjes.Display.published_to_js(rand))

console.log(v)
</script>
""")

# ╔═║ d63ef329-c3ca-4b16-bdd2-8718e1aa8c70
begin
j=JavaScript(Main.PlutoRunner.publish_to_js("test"))
@htl("""
<script>
const jsData = $(j);
console.log("PlutoRunner:",jsData)
</script>
""")
end

# ╔═║ 00000000-0000-0000-0000-000000000001
PLUTO_PROJECT_TOML_CONTENTS = """
[deps]
AbstractPlutoDingetjes = "6e696c72-6542-2067-7265-42206c756150"
HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"

[compat]
AbstractPlutoDingetjes = "~1.3.0"
HypertextLiteral = "~0.9.5"
"""

# ╔═║ 00000000-0000-0000-0000-000000000002
PLUTO_MANIFEST_TOML_CONTENTS = """
# This file is machine-generated - editing it directly is not advised

julia_version = "1.9.3"
manifest_format = "2.0"
project_hash = "e624b7324ac95a09b031bbba021826571a46149f"

[[deps.AbstractPlutoDingetjes]]
deps = ["Pkg"]
git-tree-sha1 = "0f748c81756f2e5e6854298f11ad8b2dfae6911a"
uuid = "6e696c72-6542-2067-7265-42206c756150"
version = "1.3.0"

[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
version = "1.1.1"

[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"

[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"

[[deps.Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"

[[deps.Downloads]]
deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
version = "1.6.0"

[[deps.FileWatching]]
uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"

[[deps.HypertextLiteral]]
deps = ["Tricks"]
git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653"
uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"
version = "0.9.5"

[[deps.InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"

[[deps.LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
version = "0.6.3"

[[deps.LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
version = "7.84.0+0"

[[deps.LibGit2]]
deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"

[[deps.LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
version = "1.10.2+0"

[[deps.Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"

[[deps.Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"

[[deps.MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
version = "2.28.2+0"

[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
version = "2022.10.11"

[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
version = "1.2.0"

[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
version = "1.9.2"

[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[[deps.REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[deps.Random]]
deps = ["SHA", "Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
version = "0.7.0"

[[deps.Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"

[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"

[[deps.TOML]]
deps = ["Dates"]
uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
version = "1.0.3"

[[deps.Tar]]
deps = ["ArgTools", "SHA"]
uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
version = "1.10.0"

[[deps.Tricks]]
git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f"
uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775"
version = "0.1.8"

[[deps.UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[[deps.Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[deps.Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
version = "1.2.13+0"

[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
version = "1.48.0+0"

[[deps.p7zip_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
version = "17.4.0+0"
"""

# ╔═║ Cell order:
# ╠═f5f7d9f2-ad66-49f7-9452-c66e30d587f4
# ╠═f7fecf30-5272-495c-a2e3-11b268feadc4
# ╠═00e4513d-7eaa-4aea-9716-0710341d88eb
# ╠═d63ef329-c3ca-4b16-bdd2-8718e1aa8c70
# β•Ÿβ”€00000000-0000-0000-0000-000000000001
# β•Ÿβ”€00000000-0000-0000-0000-000000000002
sprig commented 2 months ago

Screenshot 2024-04-10 120036 Screenshot 2024-04-10 120002

fonsp commented 2 months ago

Very strange! It looks like the io context is not working. Are you running Pluto with any custom configurations?

Does this snippet work for you?

# ╔═║ 9354c037-06aa-4a44-9c95-d1206857fbf1
begin
    struct GiveMeCellID
    end

    function Base.show(io::IO, m::MIME"text/javascript", x::GiveMeCellID)
        write(io, "'", string(get(io, :pluto_cell_id, "unknown")), "'")
    end

    function Base.show(io::IO, m::MIME"text/html", x::GiveMeCellID)
        @info sprint(show, "text/plain", Dict(k => get(io, k, nothing) for k in keys(io)))

        write(io, string(get(io, :pluto_cell_id, "unknown")))
    end
end

# ╔═║ 7b34b1dd-c1b1-4965-9b47-b6a46b22b95e
@htl """
<script>
console.log($(GiveMeCellID()))
</script>
"""

# ╔═║ f92841a0-b75d-4b5d-96d3-669a4eec5f00
GiveMeCellID()

Can you share the output of the last cell? Ideally just send an HTML export file. Otherwise send a screenshot, but try to include the whole screen so I don't need to guess which error you are sending :) Feel free to update the screenshots in your last post.

You should get:

localhost_1234_edit_id=2e167970-f80c-11ee-0d60-9fe64c4d9f9e

fonsp commented 2 months ago

Ah sorry, with_js_link was recently added in https://github.com/fonsp/Pluto.jl/pull/2726 but not yet released. I updated the PR text to explain this and instructions for how to use it.

Please try it out and share how it went! The feature is not yet released because I am waiting for more feedback :)

sprig commented 2 months ago

I should clarify that I get the same results with β€˜published_to_js’. I’ll try running your notebook on the current release and try the code as well as your notebook on HEAD as well.

The docs mention that @bind is preferable when it is viable. My alternative plan for bidirectional links was to open a websocket in julia in a separate thread and connect to it from js, updating the value of a bound input whenever something is pushed from the julia side. Should this work?

fonsp commented 2 months ago

No, just use with_js_link :)

sprig commented 2 months ago

The snippet you provided does work; html export attached:

<!DOCTYPE html><html lang="en"><head><meta name="viewport" content="width=device-width"><meta charset="utf-8">
<meta name="pluto-insertion-spot-meta">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="white"><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#2a2928"><meta name="color-scheme" content="light dark"><link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/favicon-16x16.347d2855.png" integrity="sha384-3qsGeVLdddzV9oIkj3PhXXQX2CZCjOD/CiyrPQOX6InOWw3HAHClrsQhPfX9uRAj" crossorigin="anonymous"><link rel="icon" type="image/png" sizes="32x32" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/favicon-32x32.8789add4.png" integrity="sha384-cOe5vSoBIgKNgkUL27p9RpsGVY0uBg9PejLccDy+fR8ZD1Iv5dF1MGHjIZAIZwm6" crossorigin="anonymous"><link rel="icon" type="image/png" sizes="96x96" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/favicon-96x96.48689391.png" integrity="sha384-TN49cYb8GyNmrZT14bsYXXo4l1x1NJeJ/EHuVAauAKsNPopPHLojijs9jFT4Vs8c" crossorigin="anonymous"><link rel="pluto-logo-big" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/logo.004c1d7c.svg" integrity="sha384-GkQkODcGxsrSRJCkeakBXihum0GUM44cwBgKyutDimectXCbCgj6Vu3jlrueqEcN" crossorigin="anonymous"><link rel="pluto-logo-small" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/favicon_unsaturated.d1387b25.svg" integrity="sha384-omwjH+Qy3hpAVf5FYd/pkaDBuVAfsEDRN7eBxEA8Ek00OAWP+aiV+GpEYk3I7lyo" crossorigin="anonymous"><script type="module" src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.0c13a924.js" integrity="sha384-q8cO+lFO46JfgnUPjKIx0Wq2bi7VUEL3IC7rlX48twUcwXr23VYfIwsIa/V7Ok+N" crossorigin="anonymous"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/juliamono.c6034ab4.css" integrity="sha384-n0za6lUXlyf4XC+nGkZWj3TLDnRbNpAcoi4PZGSlQMPoyqGa9kGY+ZXkUgZGIhQt" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.3719a8dd.css" integrity="sha384-yhudY09uOGgdlEiCzzRwQjbXaVz42f4OmYwW7HQgngnxJzuq6TT6xhnT3iPemJAF" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/vollkorn.089565a8.css" integrity="sha384-jnV/84VtSgBLF70H+s2rxJcOUZIMDR+X/ElFZA83i9ZtZSWiIMFAgPyrWkOJV08q" crossorigin="anonymous"><script defer="">console.log("Pluto.jl, by Fons van der Plas (https://github.com/fonsp), MikoΕ‚aj Bochenski (https://github.com/malyvsen), Michiel Dral (https://github.com/dralletje) and friends 🌈");</script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.b8733d72.js" defer="" integrity="sha384-84yPd6AGZ/1IUiaBlssipmMKMFz9WGFQ+u8vYZ9cWicH6bZm7ZOej+kLDXnIIAQJ" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.9f9dc874.js" defer="" integrity="sha384-tkFo1EK72I9JvoTmHFa199dfRzW8mkXPUkHb/N7UhYI+bxKzX3Kh8LNCZz1ltsFF" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.90ede145.js" defer="" integrity="sha384-CuNU9gQg6fa/yynNqNWjHWzPm4nj+d7O6+HXsNGSqClhs/bYQIbBC3Lw/kh8Ukui" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.dbeed08a.js" defer="" integrity="sha384-1BEdQwXfZi4ZpsNV8w1X8pQcVK1/DS/+/M8OTo3gol7mdEspSN7nT6llX57NQCSt" crossorigin="anonymous"></script><script id="iframe-resizer-content-window-script" src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.6386bd9d.js" crossorigin="anonymous" defer="" integrity="sha384-tgN2a0VDi/lCYwZuDqT7L+A/Y/9kpxf3HV7zv2BJ5Fu7zW0EClq0nM4crfK3TRPs"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.36dc5b0a.css" type="text/css" integrity="sha384-Z/uEiiiLk3ulLFo6D/X8V2lY2Hxs5UXQH+xtY4bS072roR77TRSGaE9jp58FW5L9" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.52bd66ba.css" type="text/css" media="all" data-pluto-file="hide-ui" integrity="sha384-mZn6RuXF1UXCTqkld9/QJshMPUFGT/EBEcr0lZfUV7TULrxk0fZqe+YHXMk+6Qb0" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.ec3a6a5b.css" type="text/css" integrity="sha384-SuGFZkuBuG+lmfz6RbnvjtcyIh8W1xDYi1sebwn7bl9VMQnhmr6EniSmIdcHJ55l" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.bc0bd8d4.css" type="text/css" integrity="sha384-gr3OhYFI4bbMe91xbdUoBh8mmEYRN8obb40FeevBAfwVD1162FI9d6zAuXKy+D13" crossorigin="anonymous"><link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/juliamono.c6034ab4.css" as="style" integrity="sha384-n0za6lUXlyf4XC+nGkZWj3TLDnRbNpAcoi4PZGSlQMPoyqGa9kGY+ZXkUgZGIhQt" crossorigin="anonymous"><link rel="preload" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/vollkorn.089565a8.css" as="style" integrity="sha384-jnV/84VtSgBLF70H+s2rxJcOUZIMDR+X/ElFZA83i9ZtZSWiIMFAgPyrWkOJV08q" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.e82e08bd.css" type="text/css" integrity="sha384-7YN+h8b6N4N65qk8TG/J2KPF95D8z3sGNd06rokz4CX9oWu0KnRAF5cVWu3BkkaN" crossorigin="anonymous"><script data-pluto-file="launch-parameters">
window.pluto_notebook_id = undefined;
window.pluto_isolated_cell_ids = undefined;
window.pluto_notebookfile = "data:text/julia;charset=utf-8;base64,IyMjIEEgUGx1dG8uamwgbm90ZWJvb2sgIyMjCiMgdjAuMTkuNDAKCnVzaW5nIE1hcmtkb3duCnVzaW5nIEludGVyYWN0aXZlVXRpbHMKCiMg4pWU4pWQ4pWhIDNhOWRjY2YwLWUzNDItNGIzMS1iNjU1LTQ5YjJhYzgxNzU1NwppbXBvcnQgSHlwZXJ0ZXh0TGl0ZXJhbDogQGh0bCwgSmF2YVNjcmlwdAoKIyDilZTilZDilaEgYWY4MzE3ZTUtZDMxOS00YmE0LTg5MTgtMzM3M2ZmMzIxMzE0CmJlZ2luCglzdHJ1Y3QgR2l2ZU1lQ2VsbElECgllbmQKCglmdW5jdGlvbiBCYXNlLnNob3coaW86OklPLCBtOjpNSU1FInRleHQvamF2YXNjcmlwdCIsIHg6OkdpdmVNZUNlbGxJRCkKCQl3cml0ZShpbywgIiciLCBzdHJpbmcoZ2V0KGlvLCA6cGx1dG9fY2VsbF9pZCwgInVua25vd24iKSksICInIikKCWVuZAoKCQoJZnVuY3Rpb24gQmFzZS5zaG93KGlvOjpJTywgbTo6TUlNRSJ0ZXh0L2h0bWwiLCB4OjpHaXZlTWVDZWxsSUQpCgkJQGluZm8gc3ByaW50KHNob3csICJ0ZXh0L3BsYWluIiwgRGljdChrID0+IGdldChpbywgaywgbm90aGluZykgZm9yIGsgaW4ga2V5cyhpbykpKQoKCQl3cml0ZShpbywgc3RyaW5nKGdldChpbywgOnBsdXRvX2NlbGxfaWQsICJ1bmtub3duIikpKQoJZW5kCmVuZAoKIyDilZTilZDilaEgOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYzCkBodGwgIiIiCjxzY3JpcHQ+CmNvbnNvbGUubG9nKCQoR2l2ZU1lQ2VsbElEKCkpKQo8L3NjcmlwdD4KIiIiCgojIOKVlOKVkOKVoSA1NGE3ZDBhYy01OGFmLTQ3NGUtYTBkOS05Y2YwZGVjOGQxZDIKR2l2ZU1lQ2VsbElEKCkKCiMg4pWU4pWQ4pWhIDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMQpQTFVUT19QUk9KRUNUX1RPTUxfQ09OVEVOVFMgPSAiIiIKW2RlcHNdCkh5cGVydGV4dExpdGVyYWwgPSAiYWMxMTkyYTgtZjRiMy00YmZlLWJhMjItYWY1YjkyY2QzYWIyIgoKW2NvbXBhdF0KSHlwZXJ0ZXh0TGl0ZXJhbCA9ICJ+MC45LjUiCiIiIgoKIyDilZTilZDilaEgMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAyClBMVVRPX01BTklGRVNUX1RPTUxfQ09OVEVOVFMgPSAiIiIKIyBUaGlzIGZpbGUgaXMgbWFjaGluZS1nZW5lcmF0ZWQgLSBlZGl0aW5nIGl0IGRpcmVjdGx5IGlzIG5vdCBhZHZpc2VkCgpqdWxpYV92ZXJzaW9uID0gIjEuOS4zIgptYW5pZmVzdF9mb3JtYXQgPSAiMi4wIgpwcm9qZWN0X2hhc2ggPSAiNWIzN2FiZGY3Mzk4ZGM1ZGE0Y2QzNDdkMDYwOTk5MDIzOGQ4OTViYiIKCltbZGVwcy5IeXBlcnRleHRMaXRlcmFsXV0KZGVwcyA9IFsiVHJpY2tzIl0KZ2l0LXRyZWUtc2hhMSA9ICI3MTM0ODEwYjFhZmNlMDRiYmMxMDQ1Y2ExOTg1ZmJlODFjZTE3NjUzIgp1dWlkID0gImFjMTE5MmE4LWY0YjMtNGJmZS1iYTIyLWFmNWI5MmNkM2FiMiIKdmVyc2lvbiA9ICIwLjkuNSIKCltbZGVwcy5Ucmlja3NdXQpnaXQtdHJlZS1zaGExID0gImVhZTFiYjQ4NGNkNjNiMzY5OTllZTU4YmUyZGU2YzE3ODEwNTExMmYiCnV1aWQgPSAiNDEwYTRiNGQtNDllNC00ZmJjLWFiNmQtY2I3MWIxN2IzNzc1Igp2ZXJzaW9uID0gIjAuMS44IgoiIiIKCiMg4pWU4pWQ4pWhIENlbGwgb3JkZXI6CiMg4pWg4pWQM2E5ZGNjZjAtZTM0Mi00YjMxLWI2NTUtNDliMmFjODE3NTU3CiMg4pWg4pWQYWY4MzE3ZTUtZDMxOS00YmE0LTg5MTgtMzM3M2ZmMzIxMzE0CiMg4pWg4pWQOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYzCiMg4pWg4pWQNTRhN2QwYWMtNThhZi00NzRlLWEwZDktOWNmMGRlYzhkMWQyCiMg4pWf4pSAMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAxCiMg4pWf4pSAMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAyCg==";
window.pluto_disable_ui = true;
window.pluto_slider_server_url = undefined;
window.pluto_binder_url = "https://mybinder.org/v2/gh/fonsp/pluto-on-binder/v0.19.40";
window.pluto_statefile = "data:;base64,3gASpWJvbmRzgKxjZWxsX3Jlc3VsdHOE2SQ5OTkwNDU2NS1mNzllLTRkOGQtYjM1NC0zMmIwMWZiZWFjNjOKpnF1ZXVlZMKkbG9nc5CncnVubmluZ8Kmb3V0cHV0hqRib2R52Uc8c2NyaXB0Pgpjb25zb2xlLmxvZygnOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYzJykKPC9zY3JpcHQ+CqRtaW1lqXRleHQvaHRtbKxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2YaxamzhQ7BwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYzuWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOHkw5DLVwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJGFmODMxN2U1LWQzMTktNGJhNC04OTE4LTMzNzNmZjMyMTMxNIqmcXVldWVkwqRsb2dzkKdydW5uaW5nwqZvdXRwdXSGpGJvZHmgpG1pbWWqdGV4dC9wbGFpbqxyb290YXNzaWduZWXAsmxhc3RfcnVuX3RpbWVzdGFtcMtB2YaxWzFh9rBwZXJzaXN0X2pzX3N0YXRlwrdoYXNfcGx1dG9faG9va19mZWF0dXJlc8KnY2VsbF9pZNkkYWY4MzE3ZTUtZDMxOS00YmE0LTg5MTgtMzM3M2ZmMzIxMzE0uWRlcGVuZHNfb25fZGlzYWJsZWRfY2VsbHPCp3J1bnRpbWXOAebTy7VwdWJsaXNoZWRfb2JqZWN0X2tleXOQuGRlcGVuZHNfb25fc2tpcHBlZF9jZWxsc8KnZXJyb3JlZMLZJDU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMoqmcXVldWVkwqRsb2dzkYikbGluZf+jbXNnktoBpURpY3R7U3ltYm9sLCBBbnl9IHdpdGggMTAgZW50cmllczoKICA6Y29sb3IgPT4gZmFsc2UKICA6ZXh0cmFfaXRlbXMgPT4gRGljdHtUdXBsZXtVSW50NjQsIEludDY0fSwgSW50NjR9KCkKICA6bW9kdWxlID0+IE1haW4udmFyIndvcmtzcGFjZSMxMSIKICA6cGx1dG9fcHVibGlzaGVkX3RvX2pzID0+ICM2MQogIDpwbHV0b19jZWxsX2lkID0+IFVVSUQoIjU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMiIpCiAgOnBsdXRvX3N1cHBvcnRlZF9pbnRlZ3JhdGlvbl9mZWF0dXJlcyA9PiBBbnlbXQogIDpkaXNwbGF5c2l6ZSA9PiAoMTgsIDg4KQogIDpsaW1pdCA9PiB0cnVlCiAgOnBsdXRvX25vdGVib29rX2lkID0+IFVVSUQoIjUwZGJiNWNlLWY3ZDAtMTFlZS0xMWMxLWNmMzM5MDBhMTVkOCIpCiAgOmlzX3BsdXRvID0+IHRydWWqdGV4dC9wbGFpbqdjZWxsX2lk2SQ1NGE3ZDBhYy01OGFmLTQ3NGUtYTBkOS05Y2YwZGVjOGQxZDKma3dhcmdzkKJpZLlNYWluX3dvcmtzcGFjZSM2XzI1NDViNGE2pGZpbGXZUi9vcHQvanVsaWEvcGx1dG9fbm90ZWJvb2tzL1Rpbnkgc2NpZW5jZS5qbCM9PSNhZjgzMTdlNS1kMzE5LTRiYTQtODkxOC0zMzczZmYzMjEzMTSlZ3JvdXCsVGlueSBzY2llbmNlpWxldmVspEluZm+ncnVubmluZ8Kmb3V0cHV0hqRib2R52SQ1NGE3ZDBhYy01OGFmLTQ3NGUtYTBkOS05Y2YwZGVjOGQxZDKkbWltZal0ZXh0L2h0bWyscm9vdGFzc2lnbmVlwLJsYXN0X3J1bl90aW1lc3RhbXDLQdmGsW3djDewcGVyc2lzdF9qc19zdGF0ZcK3aGFzX3BsdXRvX2hvb2tfZmVhdHVyZXPCp2NlbGxfaWTZJDU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMrlkZXBlbmRzX29uX2Rpc2FibGVkX2NlbGxzwqdydW50aW1lzTKhtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwtkkM2E5ZGNjZjAtZTM0Mi00YjMxLWI2NTUtNDliMmFjODE3NTU3iqZxdWV1ZWTCpGxvZ3OQp3J1bm5pbmfCpm91dHB1dIakYm9keaCkbWltZap0ZXh0L3BsYWlurHJvb3Rhc3NpZ25lZcCybGFzdF9ydW5fdGltZXN0YW1wy0HZhrFqI4kSsHBlcnNpc3RfanNfc3RhdGXCt2hhc19wbHV0b19ob29rX2ZlYXR1cmVzwqdjZWxsX2lk2SQzYTlkY2NmMC1lMzQyLTRiMzEtYjY1NS00OWIyYWM4MTc1NTe5ZGVwZW5kc19vbl9kaXNhYmxlZF9jZWxsc8KncnVudGltZc4BoUMVtXB1Ymxpc2hlZF9vYmplY3Rfa2V5c5C4ZGVwZW5kc19vbl9za2lwcGVkX2NlbGxzwqdlcnJvcmVkwqtzdGF0dXNfdHJlZYSkbmFtZahub3RlYm9va6hzdWJ0YXNrc4Smc2F2aW5nhKRuYW1lpnNhdmluZ6hzdWJ0YXNrc4CrZmluaXNoZWRfYXTLQdmGsYGAps6qc3RhcnRlZF9hdMtB2YaxgYChFql3b3Jrc3BhY2WEpG5hbWWpd29ya3NwYWNlqHN1YnRhc2tzgqxpbml0X3Byb2Nlc3OEpG5hbWWsaW5pdF9wcm9jZXNzqHN1YnRhc2tzhKE0hKRuYW1loTSoc3VidGFza3OAq2ZpbmlzaGVkX2F0y0HZheJIWt/0qnN0YXJ0ZWRfYXTLQdmF4kgv9mahMYSkbmFtZaExqHN1YnRhc2tzgKtmaW5pc2hlZF9hdMtB2YXiSCtM06pzdGFydGVkX2F0y0HZheJIIOIJoTKEpG5hbWWhMqhzdWJ0YXNrc4CrZmluaXNoZWRfYXTLQdmF4kgrai+qc3RhcnRlZF9hdMtB2YXiSCtbn6EzhKRuYW1loTOoc3VidGFza3OAq2ZpbmlzaGVkX2F0y0HZheJIL+dcqnN0YXJ0ZWRfYXTLQdmF4kgrakSrZmluaXNoZWRfYXTLQdmF4kha7tSqc3RhcnRlZF9hdMtB2YXiSCDgcq5jcmVhdGVfcHJvY2Vzc4SkbmFtZa5jcmVhdGVfcHJvY2Vzc6hzdWJ0YXNrc4CrZmluaXNoZWRfYXTLQdmF4kgg0N2qc3RhcnRlZF9hdMtB2YXiRr1v9KtmaW5pc2hlZF9hdMtB2YXiSFru4apzdGFydGVkX2F0y0HZheJGvW+5o3BrZ4SkbmFtZaNwa2eoc3VidGFza3OBqGFuYWx5c2lzhKRuYW1lqGFuYWx5c2lzqHN1YnRhc2tzgKtmaW5pc2hlZF9hdMtB2YaxgYB1EKpzdGFydGVkX2F0y0HZhrGBgHDnq2ZpbmlzaGVkX2F0y0HZhrGBgHUUqnN0YXJ0ZWRfYXTLQdmGsYGAcL2jcnVuhKRuYW1lo3J1bqhzdWJ0YXNrc4KwcmVzb2x2ZV90b3BvbG9neYSkbmFtZbByZXNvbHZlX3RvcG9sb2d5qHN1YnRhc2tzgKtmaW5pc2hlZF9hdMtB2YaxgYCm36pzdGFydGVkX2F0y0HZhrGBgJmRqGV2YWx1YXRlhKRuYW1lqGV2YWx1YXRlqHN1YnRhc2tzgaExhKRuYW1loTGoc3VidGFza3OAq2ZpbmlzaGVkX2F0y0HZhrGBgNxuqnN0YXJ0ZWRfYXTLQdmGsYGAs0qrZmluaXNoZWRfYXTLQdmGsYGA866qc3RhcnRlZF9hdMtB2YaxgYCm46tmaW5pc2hlZF9hdMtB2YaxgYDzrqpzdGFydGVkX2F0y0HZhrGBgJljq2ZpbmlzaGVkX2F0wKpzdGFydGVkX2F0y0HZheJGgGORsWNlbGxfZGVwZW5kZW5jaWVzhNkkOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYzhLRwcmVjZWRlbmNlX2hldXJpc3RpYwmnY2VsbF9pZNkkOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYztGRvd25zdHJlYW1fY2VsbHNfbWFwgLJ1cHN0cmVhbV9jZWxsc19tYXCGrEdpdmVNZUNlbGxJRJHZJGFmODMxN2U1LWQzMTktNGJhNC04OTE4LTMzNzNmZjMyMTMxNLdIeXBlcnRleHRMaXRlcmFsLkJ5cGFzc5C3SHlwZXJ0ZXh0TGl0ZXJhbC5SZXN1bHSQsEh5cGVydGV4dExpdGVyYWyQukh5cGVydGV4dExpdGVyYWwuU2NyaXB0VGFnkKRAaHRskdkkM2E5ZGNjZjAtZTM0Mi00YjMxLWI2NTUtNDliMmFjODE3NTU32SRhZjgzMTdlNS1kMzE5LTRiYTQtODkxOC0zMzczZmYzMjEzMTSEtHByZWNlZGVuY2VfaGV1cmlzdGljCadjZWxsX2lk2SRhZjgzMTdlNS1kMzE5LTRiYTQtODkxOC0zMzczZmYzMjEzMTS0ZG93bnN0cmVhbV9jZWxsc19tYXCCrEdpdmVNZUNlbGxJRJPZJGFmODMxN2U1LWQzMTktNGJhNC04OTE4LTMzNzNmZjMyMTMxNNkkOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYz2SQ1NGE3ZDBhYy01OGFmLTQ3NGUtYTBkOS05Y2YwZGVjOGQxZDKpQmFzZS5zaG93kLJ1cHN0cmVhbV9jZWxsc19tYXCOpERpY3SQpnN0cmluZ5CiSU+QpGtleXOQuiNfX190aGlzX3BsdXRvX21vZHVsZV9uYW1lkKlATUlNRV9zdHKQoj0+kKNnZXSQp25vdGhpbmeQrEdpdmVNZUNlbGxJRJHZJGFmODMxN2U1LWQzMTktNGJhNC04OTE4LTMzNzNmZjMyMTMxNKRCYXNlkKV3cml0ZZClQGluZm+QpnNwcmludJDZJDU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMoS0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMrRkb3duc3RyZWFtX2NlbGxzX21hcICydXBzdHJlYW1fY2VsbHNfbWFwgaxHaXZlTWVDZWxsSUSR2SRhZjgzMTdlNS1kMzE5LTRiYTQtODkxOC0zMzczZmYzMjEzMTTZJDNhOWRjY2YwLWUzNDItNGIzMS1iNjU1LTQ5YjJhYzgxNzU1N4S0cHJlY2VkZW5jZV9oZXVyaXN0aWMJp2NlbGxfaWTZJDNhOWRjY2YwLWUzNDItNGIzMS1iNjU1LTQ5YjJhYzgxNzU1N7Rkb3duc3RyZWFtX2NlbGxzX21hcIKqSmF2YVNjcmlwdJCkQGh0bJHZJDk5OTA0NTY1LWY3OWUtNGQ4ZC1iMzU0LTMyYjAxZmJlYWM2M7J1cHN0cmVhbV9jZWxsc19tYXCAtGNlbGxfZXhlY3V0aW9uX29yZGVylNkkM2E5ZGNjZjAtZTM0Mi00YjMxLWI2NTUtNDliMmFjODE3NTU32SRhZjgzMTdlNS1kMzE5LTRiYTQtODkxOC0zMzczZmYzMjEzMTTZJDk5OTA0NTY1LWY3OWUtNGQ4ZC1iMzU0LTMyYjAxZmJlYWM2M9kkNTRhN2QwYWMtNThhZi00NzRlLWEwZDktOWNmMGRlYzhkMWQytGxhc3RfaG90X3JlbG9hZF90aW1lywAAAAAAAAAAqXNob3J0cGF0aK9UaW55IHNjaWVuY2UuamyucHJvY2Vzc19zdGF0dXOlcmVhZHmkcGF0aNkqL29wdC9qdWxpYS9wbHV0b19ub3RlYm9va3MvVGlueSBzY2llbmNlLmpsrXBsdXRvX3ZlcnNpb26odjAuMTkuNDCubGFzdF9zYXZlX3RpbWXLQdmGsYGAoRKqY2VsbF9vcmRlcpTZJDNhOWRjY2YwLWUzNDItNGIzMS1iNjU1LTQ5YjJhYzgxNzU1N9kkYWY4MzE3ZTUtZDMxOS00YmE0LTg5MTgtMzM3M2ZmMzIxMzE02SQ5OTkwNDU2NS1mNzllLTRkOGQtYjM1NC0zMmIwMWZiZWFjNjPZJDU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMrFwdWJsaXNoZWRfb2JqZWN0c4ClbmJwa2eKr2luc3RhbGxfdGltZV9uc88AAAACUkRcsqxpbnN0YW50aWF0ZWTDsmluc3RhbGxlZF92ZXJzaW9uc4GwSHlwZXJ0ZXh0TGl0ZXJhbKUwLjkuNbB0ZXJtaW5hbF9vdXRwdXRzgqpuYnBrZ19zeW5j2gHxCkFkZGluZyBwYWNrYWdlcy4uLgobWzMybRtbMW0gICBSZXNvbHZpbmcbWzIybRtbMzltIHBhY2thZ2UgdmVyc2lvbnMuLi4KG1szMm0bWzFtICAgIFVwZGF0aW5nG1syMm0bWzM5bSBgL3RtcC9qbF9qWW5FdTQvUHJvamVjdC50b21sYAogIBtbOTBtW2FjMTE5MmE4XSAbWzM5bRtbOTJtKyBIeXBlcnRleHRMaXRlcmFsIHYwLjkuNRtbMzltChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfalluRXU0L01hbmlmZXN0LnRvbWxgCiAgG1s5MG1bYWMxMTkyYThdIBtbMzltG1s5Mm0rIEh5cGVydGV4dExpdGVyYWwgdjAuOS41G1szOW0KICAbWzkwbVs0MTBhNGI0ZF0gG1szOW0bWzkybSsgVHJpY2tzIHYwLjEuOBtbMzltChtbMzJtG1sxbUxvYWRpbmcbWzIybRtbMzltIHBhY2thZ2VzLi4uCgpJbnN0YW50aWF0aW5nLi4uCgpQcmVjb21waWxpbmcuLi4KG1szMm0bWzFtICBBY3RpdmF0aW5nG1syMm0bWzM5bSBwcm9qZWN0IGF0IGAvdG1wL2psX2pZbkV1NGCwSHlwZXJ0ZXh0TGl0ZXJhbNoB8QpBZGRpbmcgcGFja2FnZXMuLi4KG1szMm0bWzFtICAgUmVzb2x2aW5nG1syMm0bWzM5bSBwYWNrYWdlIHZlcnNpb25zLi4uChtbMzJtG1sxbSAgICBVcGRhdGluZxtbMjJtG1szOW0gYC90bXAvamxfalluRXU0L1Byb2plY3QudG9tbGAKICAbWzkwbVthYzExOTJhOF0gG1szOW0bWzkybSsgSHlwZXJ0ZXh0TGl0ZXJhbCB2MC45LjUbWzM5bQobWzMybRtbMW0gICAgVXBkYXRpbmcbWzIybRtbMzltIGAvdG1wL2psX2pZbkV1NC9NYW5pZmVzdC50b21sYAogIBtbOTBtW2FjMTE5MmE4XSAbWzM5bRtbOTJtKyBIeXBlcnRleHRMaXRlcmFsIHYwLjkuNRtbMzltCiAgG1s5MG1bNDEwYTRiNGRdIBtbMzltG1s5Mm0rIFRyaWNrcyB2MC4xLjgbWzM5bQobWzMybRtbMW1Mb2FkaW5nG1syMm0bWzM5bSBwYWNrYWdlcy4uLgoKSW5zdGFudGlhdGluZy4uLgoKUHJlY29tcGlsaW5nLi4uChtbMzJtG1sxbSAgQWN0aXZhdGluZxtbMjJtG1szOW0gcHJvamVjdCBhdCBgL3RtcC9qbF9qWW5FdTRgp2VuYWJsZWTDt3Jlc3RhcnRfcmVjb21tZW5kZWRfbXNnwLRyZXN0YXJ0X3JlcXVpcmVkX21zZ8CtYnVzeV9wYWNrYWdlc5C2d2FpdGluZ19mb3JfcGVybWlzc2lvbsLZLHdhaXRpbmdfZm9yX3Blcm1pc3Npb25fYnV0X3Byb2JhYmx5X2Rpc2FibGVkwqtjZWxsX2lucHV0c4TZJDk5OTA0NTY1LWY3OWUtNGQ4ZC1iMzU0LTMyYjAxZmJlYWM2M4SnY2VsbF9pZNkkOTk5MDQ1NjUtZjc5ZS00ZDhkLWIzNTQtMzJiMDFmYmVhYzYzpGNvZGXZPkBodGwgIiIiCjxzY3JpcHQ+CmNvbnNvbGUubG9nKCQoR2l2ZU1lQ2VsbElEKCkpKQo8L3NjcmlwdD4KIiIiqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SRhZjgzMTdlNS1kMzE5LTRiYTQtODkxOC0zMzczZmYzMjEzMTSEp2NlbGxfaWTZJGFmODMxN2U1LWQzMTktNGJhNC04OTE4LTMzNzNmZjMyMTMxNKRjb2Rl2gGJYmVnaW4KCXN0cnVjdCBHaXZlTWVDZWxsSUQKCWVuZAoKCWZ1bmN0aW9uIEJhc2Uuc2hvdyhpbzo6SU8sIG06Ok1JTUUidGV4dC9qYXZhc2NyaXB0IiwgeDo6R2l2ZU1lQ2VsbElEKQoJCXdyaXRlKGlvLCAiJyIsIHN0cmluZyhnZXQoaW8sIDpwbHV0b19jZWxsX2lkLCAidW5rbm93biIpKSwgIiciKQoJZW5kCgoJCglmdW5jdGlvbiBCYXNlLnNob3coaW86OklPLCBtOjpNSU1FInRleHQvaHRtbCIsIHg6OkdpdmVNZUNlbGxJRCkKCQlAaW5mbyBzcHJpbnQoc2hvdywgInRleHQvcGxhaW4iLCBEaWN0KGsgPT4gZ2V0KGlvLCBrLCBub3RoaW5nKSBmb3IgayBpbiBrZXlzKGlvKSkpCgoJCXdyaXRlKGlvLCBzdHJpbmcoZ2V0KGlvLCA6cGx1dG9fY2VsbF9pZCwgInVua25vd24iKSkpCgllbmQKZW5kqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQ1NGE3ZDBhYy01OGFmLTQ3NGUtYTBkOS05Y2YwZGVjOGQxZDKEp2NlbGxfaWTZJDU0YTdkMGFjLTU4YWYtNDc0ZS1hMGQ5LTljZjBkZWM4ZDFkMqRjb2RlrkdpdmVNZUNlbGxJRCgpqG1ldGFkYXRhg6lzaG93X2xvZ3PDqGRpc2FibGVkwq5za2lwX2FzX3NjcmlwdMKrY29kZV9mb2xkZWTC2SQzYTlkY2NmMC1lMzQyLTRiMzEtYjY1NS00OWIyYWM4MTc1NTeEp2NlbGxfaWTZJDNhOWRjY2YwLWUzNDItNGIzMS1iNjU1LTQ5YjJhYzgxNzU1N6Rjb2Rl2SlpbXBvcnQgSHlwZXJ0ZXh0TGl0ZXJhbDogQGh0bCwgSmF2YVNjcmlwdKhtZXRhZGF0YYOpc2hvd19sb2dzw6hkaXNhYmxlZMKuc2tpcF9hc19zY3JpcHTCq2NvZGVfZm9sZGVkwqtub3RlYm9va19pZNkkNTBkYmI1Y2UtZjdkMC0xMWVlLTExYzEtY2YzMzkwMGExNWQ4q2luX3RlbXBfZGlyw6htZXRhZGF0YYA=";
window.pluto_preamble_html = undefined;
</script>

<meta name="pluto-insertion-spot-parameters">
<script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.375e8ab9.js" type="module" defer="" integrity="sha384-xrjq9O20k12wqCcs0JEpII3UTmnlRQbG+fEUbQQCucZFurEZNEPMQjLeHP1a4x3P" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.19.40/frontend-dist/editor.8a3292da.js" integrity="sha384-itp4oE2PRbSrrTHVpWh8sqAuVUsz7ja6L2Dgp/JRfMCD2AwVdTk56K96POF3oLmu" crossorigin="anonymous"></script><script type="text/javascript" id="MathJax-script" integrity="sha384-4kE/rQ11E8xT9QgrCBTyvenkuPfQo8rXYQvJZuMgxyPOoUfpatjQPlgdv6V5yhUK" crossorigin="" not-the-src-yet="https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-svg-full.js" async=""></script></head><body class="loading no-MΞ±ΞΈJax"> <div style="display:flex;min-height:100vh;"> <pluto-editor class="fullscreen"></pluto-editor> </div> </body></html>
sprig commented 2 months ago

It turns out that published_to_js does work - I did not expect it, but with_js_link was attempting to get interpolated even though the js code was commented (in js), since the interpolation happens before the js is parsed by the browser. I'll report regarding with_js_link from main branch.

sprig commented 2 months ago

I was able to test #2726 via 61478b13a7fbab964af64e9ee56d575f62187604. Happily, everything works, including the mandelbrot notebook by @disberd!

FYI, I also experience some flickering when zooming fast in that notebook as reported in https://github.com/fonsp/Pluto.jl/pull/2726#issuecomment-1972154727 and I even noticed it happening once in the referenced video @disberd in https://github.com/fonsp/Pluto.jl/issues/2726#issuecomment-1972822863_ - at first glance it seems to me that this happens due to multiple zoom events overriding overriding each other's updated responses.

fonsp commented 2 months ago

Happy to hear!

I made the documentation a bit more clear about using bind instead of with_js_link: https://github.com/JuliaPluto/AbstractPlutoDingetjes.jl/commit/939e107533d68b519146802ad68c3f8b04215e13 Your case sounds like a good use case of with_js_link!

I'm very curious for feedback of this new API. If you want, please share a bit about what you're working on! If you don't want to share it publicly, you can also send me a secret email fons@plutojl.org

Have a nice day!

sprig commented 1 month ago

Sure :)

I'm working on a suite of dashboards that aid in dissecting and curating portfolios of certain exotic financial instruments. Those integrate with existing tools from a variety of languages via a websocket API. It is very helpful to be able to integrate a streamlined dashboard experience with ad-hoc data munging.

Thank you for your great work!