diff --git a/static/spiele/nachrichten/cc-spiele-nachrichten.html b/static/spiele/nachrichten/cc-spiele-nachrichten.html
index c129a84..fb96a46 100644
--- a/static/spiele/nachrichten/cc-spiele-nachrichten.html
+++ b/static/spiele/nachrichten/cc-spiele-nachrichten.html
@@ -368,7 +368,7 @@ scaffolding.addCloudProviderOverride("☁ Nachrichten", providers["ws"] || null)
getSandboxMode: () => 'unsandboxed',
canLoadExtensionFromProject: () => true
});
- for (const extension of ["data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Encoding%0A%2F%2F%20ID%3A%20Encoding%0A%2F%2F%20Description%3A%20Encode%20and%20decode%20strings%20into%20their%20unicode%20numbers%2C%20base%2064%2C%20or%20URLs.%0A%2F%2F%20By%3A%20-SIPC-%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20const%20icon%20%3D%0A%20%20%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxMzcuNzk1MDYiIGhlaWdodD0iMTM0LjIzNzA3IiB2aWV3Qm94PSIwLDAsMTM3Ljc5NTA2LDEzNC4yMzcwNyI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE1Mi44OTU4NiwtMTMwLjM3OTg5KSI%2BPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyMCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0xOTkuMzA5MDgsMjE5LjYyMDExdi03OS4yNDAyMmg4MS4zODE4NHY3OS4yNDAyMnoiLz48cGF0aCBkPSJNMTYyLjg5NTg2LDI1NC42MTY5NnYtNzkuMjQwMjJoODEuMzgxODR2NzkuMjQwMjJ6Ii8%2BPC9nPjwvZz48L3N2Zz48IS0tcm90YXRpb25DZW50ZXI6ODcuMTA0MTQwMTg0NTE2NDQ6NDkuNjIwMTA4MzQwNzA3OTYtLT4%3D%22%3B%0A%20%20const%20icon2%20%3D%0A%20%20%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI4MS44ODUzOSIgaGVpZ2h0PSI4MC42MDMwNyIgdmlld0JveD0iMCwwLDgxLjg4NTM5LDgwLjYwMzA3Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTk5LjA1NzMsLTEzOS42OTg0NikiPjxnIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2lzUGFpbnRpbmdMYXllciZxdW90Ozp0cnVlfSIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI%2BPHBhdGggZD0iTTI4MC45NDI3LDE4MGMwLDIyLjI1NzkyIC0xOC4zMzA2Nyw0MC4zMDE1NCAtNDAuOTQyNyw0MC4zMDE1NGMtMjIuNjEyMDMsMCAtNDAuOTQyNywtMTguMDQzNjEgLTQwLjk0MjcsLTQwLjMwMTU0YzAsLTIyLjI1NzkyIDE4LjMzMDY3LC00MC4zMDE1NCA0MC45NDI3LC00MC4zMDE1NGMyMi42MTIwMywwIDQwLjk0MjcsMTguMDQzNjEgNDAuOTQyNyw0MC4zMDE1NHoiIGZpbGw9IiM2NDk1ZWQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIi8%2BPHBhdGggZD0iTTIzMS44MTg3NiwxODcuOTc2MDh2LTI4Ljc2NzE1aDI5LjczNDExdjI4Ljc2NzE1eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjYiLz48cGF0aCBkPSJNMjE4LjQ0NzEzLDIwMC43OTEwN3YtMjguNzY3MTVoMjkuNzM0MTF2MjguNzY3MTV6IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iNiIvPjwvZz48L2c%2BPC9zdmc%2BPCEtLXJvdGF0aW9uQ2VudGVyOjQwLjk0MjY5NjA1MzgwMTE0OjQwLjMwMTUzNTI2NTQ4NjcwNi0tPg%3D%3D%22%3B%0A%0A%20%20%2F*!%0A%20%20This%20md5%20function%20is%20based%20on%20https%3A%2F%2Fgithub.com%2Fblueimp%2FJavaScript-MD5%2Fblob%2Fmaster%2Fjs%2Fmd5.js%0A%20%20which%20is%20licensed%20under%3A%0A%0A%20%20MIT%20License%0A%0A%20%20Copyright%20%C2%A9%202011%20Sebastian%20Tschan%2C%20https%3A%2F%2Fblueimp.net%0A%0A%20%20Permission%20is%20hereby%20granted%2C%20free%20of%20charge%2C%20to%20any%20person%20obtaining%20a%20copy%20of%0A%20%20this%20software%20and%20associated%20documentation%20files%20(the%20%22Software%22)%2C%20to%20deal%20in%0A%20%20the%20Software%20without%20restriction%2C%20including%20without%20limitation%20the%20rights%20to%0A%20%20use%2C%20copy%2C%20modify%2C%20merge%2C%20publish%2C%20distribute%2C%20sublicense%2C%20and%2For%20sell%20copies%20of%0A%20%20the%20Software%2C%20and%20to%20permit%20persons%20to%20whom%20the%20Software%20is%20furnished%20to%20do%20so%2C%0A%20%20subject%20to%20the%20following%20conditions%3A%0A%0A%20%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%20included%20in%20all%0A%20%20copies%20or%20substantial%20portions%20of%20the%20Software.%0A%0A%20%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22%2C%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND%2C%20EXPRESS%20OR%0A%20%20IMPLIED%2C%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%20MERCHANTABILITY%2C%20FITNESS%0A%20%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%20IN%20NO%20EVENT%20SHALL%20THE%20AUTHORS%20OR%0A%20%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%20CLAIM%2C%20DAMAGES%20OR%20OTHER%20LIABILITY%2C%20WHETHER%0A%20%20IN%20AN%20ACTION%20OF%20CONTRACT%2C%20TORT%20OR%20OTHERWISE%2C%20ARISING%20FROM%2C%20OUT%20OF%20OR%20IN%0A%20%20CONNECTION%20WITH%20THE%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%20THE%20SOFTWARE.%0A%20%20*%2F%0A%20%20%2F*%20eslint-disable%20*%2F%0A%20%20const%20md5%20%3D%20(function%20()%20%7B%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Add%20integers%2C%20wrapping%20at%202%5E32.%0A%20%20%20%20%20*%20This%20uses%2016-bit%20operations%20internally%20to%20work%20around%20bugs%20in%20interpreters.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20First%20integer%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20y%20Second%20integer%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Sum%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20safeAdd(x%2C%20y)%20%7B%0A%20%20%20%20%20%20var%20lsw%20%3D%20(x%20%26%200xffff)%20%2B%20(y%20%26%200xffff)%3B%0A%20%20%20%20%20%20var%20msw%20%3D%20(x%20%3E%3E%2016)%20%2B%20(y%20%3E%3E%2016)%20%2B%20(lsw%20%3E%3E%2016)%3B%0A%20%20%20%20%20%20return%20(msw%20%3C%3C%2016)%20%7C%20(lsw%20%26%200xffff)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Bitwise%20rotate%20a%2032-bit%20number%20to%20the%20left.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20num%2032-bit%20number%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20cnt%20Rotation%20count%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Rotated%20number%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20bitRotateLeft(num%2C%20cnt)%20%7B%0A%20%20%20%20%20%20return%20(num%20%3C%3C%20cnt)%20%7C%20(num%20%3E%3E%3E%20(32%20-%20cnt))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20q%20q%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5cmn(q%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20safeAdd(%0A%20%20%20%20%20%20%20%20bitRotateLeft(safeAdd(safeAdd(a%2C%20q)%2C%20safeAdd(x%2C%20t))%2C%20s)%2C%0A%20%20%20%20%20%20%20%20b%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn((b%20%26%20c)%20%7C%20(~b%20%26%20d)%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn((b%20%26%20d)%20%7C%20(c%20%26%20~d)%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn(b%20%5E%20c%20%5E%20d%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn(c%20%5E%20(b%20%7C%20~d)%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculate%20the%20MD5%20of%20an%20array%20of%20little-endian%20words%2C%20and%20a%20bit%20length.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7BArray%7D%20x%20Array%20of%20little-endian%20words%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20len%20Bit%20length%0A%20%20%20%20%20*%20%40returns%20%7BArray%3Cnumber%3E%7D%20MD5%20Array%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20binlMD5(x%2C%20len)%20%7B%0A%20%20%20%20%20%20%2F*%20append%20padding%20*%2F%0A%20%20%20%20%20%20x%5Blen%20%3E%3E%205%5D%20%7C%3D%200x80%20%3C%3C%20len%20%25%2032%3B%0A%20%20%20%20%20%20x%5B(((len%20%2B%2064)%20%3E%3E%3E%209)%20%3C%3C%204)%20%2B%2014%5D%20%3D%20len%3B%0A%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20olda%3B%0A%20%20%20%20%20%20var%20oldb%3B%0A%20%20%20%20%20%20var%20oldc%3B%0A%20%20%20%20%20%20var%20oldd%3B%0A%20%20%20%20%20%20var%20a%20%3D%201732584193%3B%0A%20%20%20%20%20%20var%20b%20%3D%20-271733879%3B%0A%20%20%20%20%20%20var%20c%20%3D%20-1732584194%3B%0A%20%20%20%20%20%20var%20d%20%3D%20271733878%3B%0A%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20x.length%3B%20i%20%2B%3D%2016)%20%7B%0A%20%20%20%20%20%20%20%20olda%20%3D%20a%3B%0A%20%20%20%20%20%20%20%20oldb%20%3D%20b%3B%0A%20%20%20%20%20%20%20%20oldc%20%3D%20c%3B%0A%20%20%20%20%20%20%20%20oldd%20%3D%20d%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%5D%2C%207%2C%20-680876936)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%201%5D%2C%2012%2C%20-389564586)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%202%5D%2C%2017%2C%20606105819)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%203%5D%2C%2022%2C%20-1044525330)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%204%5D%2C%207%2C%20-176418897)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%205%5D%2C%2012%2C%201200080426)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%206%5D%2C%2017%2C%20-1473231341)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%207%5D%2C%2022%2C%20-45705983)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%208%5D%2C%207%2C%201770035416)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%209%5D%2C%2012%2C%20-1958414417)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2010%5D%2C%2017%2C%20-42063)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2011%5D%2C%2022%2C%20-1990404162)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2012%5D%2C%207%2C%201804603682)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2013%5D%2C%2012%2C%20-40341101)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2014%5D%2C%2017%2C%20-1502002290)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2015%5D%2C%2022%2C%201236535329)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%201%5D%2C%205%2C%20-165796510)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%206%5D%2C%209%2C%20-1069501632)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2011%5D%2C%2014%2C%20643717713)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%5D%2C%2020%2C%20-373897302)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%205%5D%2C%205%2C%20-701558691)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2010%5D%2C%209%2C%2038016083)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2015%5D%2C%2014%2C%20-660478335)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%204%5D%2C%2020%2C%20-405537848)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%209%5D%2C%205%2C%20568446438)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2014%5D%2C%209%2C%20-1019803690)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%203%5D%2C%2014%2C%20-187363961)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%208%5D%2C%2020%2C%201163531501)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2013%5D%2C%205%2C%20-1444681467)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%202%5D%2C%209%2C%20-51403784)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%207%5D%2C%2014%2C%201735328473)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2012%5D%2C%2020%2C%20-1926607734)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%205%5D%2C%204%2C%20-378558)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%208%5D%2C%2011%2C%20-2022574463)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2011%5D%2C%2016%2C%201839030562)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2014%5D%2C%2023%2C%20-35309556)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%201%5D%2C%204%2C%20-1530992060)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%204%5D%2C%2011%2C%201272893353)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%207%5D%2C%2016%2C%20-155497632)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2010%5D%2C%2023%2C%20-1094730640)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2013%5D%2C%204%2C%20681279174)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%5D%2C%2011%2C%20-358537222)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%203%5D%2C%2016%2C%20-722521979)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%206%5D%2C%2023%2C%2076029189)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%209%5D%2C%204%2C%20-640364487)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2012%5D%2C%2011%2C%20-421815835)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2015%5D%2C%2016%2C%20530742520)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%202%5D%2C%2023%2C%20-995338651)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%5D%2C%206%2C%20-198630844)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%207%5D%2C%2010%2C%201126891415)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2014%5D%2C%2015%2C%20-1416354905)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%205%5D%2C%2021%2C%20-57434055)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2012%5D%2C%206%2C%201700485571)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%203%5D%2C%2010%2C%20-1894986606)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2010%5D%2C%2015%2C%20-1051523)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%201%5D%2C%2021%2C%20-2054922799)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%208%5D%2C%206%2C%201873313359)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2015%5D%2C%2010%2C%20-30611744)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%206%5D%2C%2015%2C%20-1560198380)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2013%5D%2C%2021%2C%201309151649)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%204%5D%2C%206%2C%20-145523070)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2011%5D%2C%2010%2C%20-1120210379)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%202%5D%2C%2015%2C%20718787259)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%209%5D%2C%2021%2C%20-343485551)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20safeAdd(a%2C%20olda)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20safeAdd(b%2C%20oldb)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20safeAdd(c%2C%20oldc)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20safeAdd(d%2C%20oldd)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%5Ba%2C%20b%2C%20c%2C%20d%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Convert%20an%20array%20of%20little-endian%20words%20to%20a%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7BArray%3Cnumber%3E%7D%20input%20MD5%20Array%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20binl2rstr(input)%20%7B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20output%20%3D%20%22%22%3B%0A%20%20%20%20%20%20var%20length32%20%3D%20input.length%20*%2032%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20length32%3B%20i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20output%20%2B%3D%20String.fromCharCode((input%5Bi%20%3E%3E%205%5D%20%3E%3E%3E%20i%20%25%2032)%20%26%200xff)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Convert%20a%20raw%20string%20to%20an%20array%20of%20little-endian%20words%0A%20%20%20%20%20*%20Characters%20%3E255%20have%20their%20high-byte%20silently%20ignored.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20input%20Raw%20input%20string%0A%20%20%20%20%20*%20%40returns%20%7BArray%3Cnumber%3E%7D%20Array%20of%20little-endian%20words%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstr2binl(input)%20%7B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20output%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20output%5B(input.length%20%3E%3E%202)%20-%201%5D%20%3D%20undefined%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20output.length%3B%20i%20%2B%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20output%5Bi%5D%20%3D%200%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20length8%20%3D%20input.length%20*%208%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20length8%3B%20i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20output%5Bi%20%3E%3E%205%5D%20%7C%3D%20(input.charCodeAt(i%20%2F%208)%20%26%200xff)%20%3C%3C%20i%20%25%2032%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculate%20the%20MD5%20of%20a%20raw%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20s%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstrMD5(s)%20%7B%0A%20%20%20%20%20%20return%20binl2rstr(binlMD5(rstr2binl(s)%2C%20s.length%20*%208))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20HMAC-MD5%20of%20a%20key%20and%20some%20data%20(raw%20strings)%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20key%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20data%20Raw%20input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstrHMACMD5(key%2C%20data)%20%7B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20bkey%20%3D%20rstr2binl(key)%3B%0A%20%20%20%20%20%20var%20ipad%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20var%20opad%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20var%20hash%3B%0A%20%20%20%20%20%20ipad%5B15%5D%20%3D%20opad%5B15%5D%20%3D%20undefined%3B%0A%20%20%20%20%20%20if%20(bkey.length%20%3E%2016)%20%7B%0A%20%20%20%20%20%20%20%20bkey%20%3D%20binlMD5(bkey%2C%20key.length%20*%208)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%2016%3B%20i%20%2B%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20ipad%5Bi%5D%20%3D%20bkey%5Bi%5D%20%5E%200x36363636%3B%0A%20%20%20%20%20%20%20%20opad%5Bi%5D%20%3D%20bkey%5Bi%5D%20%5E%200x5c5c5c5c%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20hash%20%3D%20binlMD5(ipad.concat(rstr2binl(data))%2C%20512%20%2B%20data.length%20*%208)%3B%0A%20%20%20%20%20%20return%20binl2rstr(binlMD5(opad.concat(hash)%2C%20512%20%2B%20128))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Convert%20a%20raw%20string%20to%20a%20hex%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20input%20Raw%20input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Hex%20encoded%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstr2hex(input)%20%7B%0A%20%20%20%20%20%20var%20hexTab%20%3D%20%220123456789abcdef%22%3B%0A%20%20%20%20%20%20var%20output%20%3D%20%22%22%3B%0A%20%20%20%20%20%20var%20x%3B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20input.length%3B%20i%20%2B%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20x%20%3D%20input.charCodeAt(i)%3B%0A%20%20%20%20%20%20%20%20output%20%2B%3D%20hexTab.charAt((x%20%3E%3E%3E%204)%20%26%200x0f)%20%2B%20hexTab.charAt(x%20%26%200x0f)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Encode%20a%20string%20as%20UTF-8%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20input%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20UTF8%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20str2rstrUTF8(input)%20%7B%0A%20%20%20%20%20%20return%20unescape(encodeURIComponent(input))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Encodes%20input%20string%20as%20raw%20MD5%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20s%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rawMD5(s)%20%7B%0A%20%20%20%20%20%20return%20rstrMD5(str2rstrUTF8(s))%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Encodes%20input%20string%20as%20Hex%20encoded%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20s%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Hex%20encoded%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20hexMD5(s)%20%7B%0A%20%20%20%20%20%20return%20rstr2hex(rawMD5(s))%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20raw%20HMAC-MD5%20for%20the%20given%20key%20and%20data%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20k%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20d%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rawHMACMD5(k%2C%20d)%20%7B%0A%20%20%20%20%20%20return%20rstrHMACMD5(str2rstrUTF8(k)%2C%20str2rstrUTF8(d))%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20Hex%20encoded%20HMAC-MD5%20for%20the%20given%20key%20and%20data%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20k%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20d%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20hexHMACMD5(k%2C%20d)%20%7B%0A%20%20%20%20%20%20return%20rstr2hex(rawHMACMD5(k%2C%20d))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20MD5%20value%20for%20a%20given%20string.%0A%20%20%20%20%20*%20If%20a%20key%20is%20provided%2C%20calculates%20the%20HMAC-MD5%20value.%0A%20%20%20%20%20*%20Returns%20a%20Hex%20encoded%20string%20unless%20the%20raw%20argument%20is%20given.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20string%20Input%20string%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20%5Bkey%5D%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bboolean%7D%20%5Braw%5D%20Raw%20output%20switch%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20MD5%20output%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5(string%2C%20key%2C%20raw)%20%7B%0A%20%20%20%20%20%20if%20(!key)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!raw)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20hexMD5(string)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20rawMD5(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(!raw)%20%7B%0A%20%20%20%20%20%20%20%20return%20hexHMACMD5(key%2C%20string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20rawHMACMD5(key%2C%20string)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20md5%3B%0A%20%20%7D)()%3B%0A%20%20%2F*%20eslint-enable%20*%2F%0A%0A%20%20class%20Encoding%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22Encoding%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Encoding%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%236495ed%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23739fee%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%2383aaf0%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%3A%20icon2%2C%0A%20%20%20%20%20%20%20%20blockIconURI%3A%20icon%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22encode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Encode%20%5Bstring%5D%20in%20%5Bcode%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20code%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22encode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Base64%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22decode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Decode%20%5Bstring%5D%20with%20%5Bcode%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22VHVyYm9XYXJw%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20code%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22encode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Base64%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22hash%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Hash%20%5Bstring%5D%20with%20%5Bhash%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20hash%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22hash%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22MD5%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Conversioncodes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Convert%20the%20character%20%5Bstring%5D%20to%20%5BCodeList%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CodeList%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22Code%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22UNICODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Restorecode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5Bstring%5D%20corresponding%20to%20the%20%5BCodeList%5D%20character%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%2265%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CodeList%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22Code%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22UNICODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Randomstrings%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Randomly%20generated%20%5Bposition%5D%20character%20string%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Fontgenerationstring%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Use%20%5Bwordbank%5D%20to%20generate%20a%20random%20%5Bposition%5D%20character%20string%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20wordbank%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%221234567890%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20Code%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Unicode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22UNICODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20encode%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Base%2064%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22Base64%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22URL%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20hash%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22MD5%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20encode(%7B%20string%2C%20code%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(code)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22Base64%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20btoa(string)%3B%0A%20%20%20%20%20%20%20%20case%20%22URL%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20encodeURIComponent(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20decode(%7B%20string%2C%20code%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(code)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22Base64%22%3A%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20atob(string)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(error)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20console.error(%22invalid%20base%2064%22%2C%20error)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20case%20%22URL%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20decodeURIComponent(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20hash(%7B%20string%2C%20hash%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(hash)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22MD5%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20md5(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20Conversioncodes(%7B%20string%2C%20CodeList%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(CodeList)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22UNICODE%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20string.charCodeAt(0)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%200%3B%0A%20%20%20%20%7D%0A%20%20%20%20Restorecode(%7B%20string%2C%20CodeList%20%7D)%20%7B%0A%20%20%20%20%20%20switch%20(CodeList)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22UNICODE%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20String.fromCharCode(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20Randomstrings(%7B%20position%20%7D)%20%7B%0A%20%20%20%20%20%20position%20%3D%20Scratch.Cast.toNumber(position)%20%7C%7C%2032%3B%0A%20%20%20%20%20%20let%20t%20%3D%20%22ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678%22%3B%0A%20%20%20%20%20%20let%20a%20%3D%20t.length%3B%0A%20%20%20%20%20%20let%20string%20%3D%20%22%22%3B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20position%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20string%20%2B%3D%20t.charAt(Math.floor(Math.random()%20*%20a))%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20string%3B%0A%20%20%20%20%7D%0A%20%20%20%20Fontgenerationstring(%7B%20wordbank%2C%20position%20%7D)%20%7B%0A%20%20%20%20%20%20position%20%3D%20Scratch.Cast.toNumber(position)%20%7C%7C%2032%3B%0A%20%20%20%20%20%20let%20t%20%3D%20String(wordbank)%3B%0A%20%20%20%20%20%20let%20a%20%3D%20t.length%3B%0A%20%20%20%20%20%20let%20string%20%3D%20%22%22%3B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20position%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20string%20%2B%3D%20t.charAt(Math.floor(Math.random()%20*%20a))%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20string%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20Scratch.extensions.register(new%20Encoding())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20ShovelUtils%0A%2F%2F%20ID%3A%20ShovelUtils%0A%2F%2F%20Description%3A%20A%20bunch%20of%20miscellaneous%20blocks.%0A%2F%2F%20By%3A%20TheShovel%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20%7B%0A%20%20%20%20throw%20new%20Error(%22ShovelUtils%20must%20be%20run%20unsandboxed%22)%3B%0A%20%20%7D%0A%20%20console.log(%22ShovelUtils%20v1.4%22)%3B%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%0A%20%20%2F%2F%20Based%20on%20from%20https%3A%2F%2Fwww.growingwiththeweb.com%2F2017%2F12%2Ffast-simple-js-fps-counter.html%0A%20%20const%20times%20%3D%20%5B%5D%3B%0A%20%20let%20fps%20%3D%20vm.runtime.frameLoop.framerate%3B%0A%20%20const%20oldStep%20%3D%20vm.runtime._step%3B%0A%20%20vm.runtime._step%20%3D%20function%20()%20%7B%0A%20%20%20%20oldStep.call(this)%3B%0A%20%20%20%20const%20now%20%3D%20performance.now()%3B%0A%20%20%20%20while%20(times.length%20%3E%200%20%26%26%20times%5B0%5D%20%3C%3D%20now%20-%201000)%20%7B%0A%20%20%20%20%20%20times.shift()%3B%0A%20%20%20%20%7D%0A%20%20%20%20times.push(now)%3B%0A%20%20%20%20fps%20%3D%20times.length%3B%0A%20%20%7D%3B%0A%0A%20%20class%20ShovelUtils%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22ShovelUtils%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22ShovelUtils%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23f54242%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23f54242%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23f54242%22%2C%0A%20%20%20%20%20%20%20%20docsURI%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2FTheShovel%2FShovelUtils%22%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20image%20from%20%5BTEXT%5D%20name%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fdango.png%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Dango%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getlist%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22get%20list%20%5BTEXT%5D%20as%20array%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22MyList%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setlist%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20list%20%5BNAME%5D%20to%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%5B1%2C2%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22MyList%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importSprite%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20sprite%20from%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Link%20or%20data%20uri%20here%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importSound%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20sound%20from%20%5BTEXT%5D%20name%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fmeow.mp3%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Meow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importProject%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20project%20from%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fsamples%2FBox2D.sb3%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22loadExtension%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22load%20extension%20from%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Futilities.js%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22restartProject%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22restart%20project%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%220%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteSprite%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20sprite%20%5BSPRITE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Sprite1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20costume%20%5BCOSNAME%5D%20in%20%5BSPRITE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COSNAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22costume1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Sprite1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setedtarget%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20editing%20target%20to%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Sprite1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22brightnessByColor%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22brightness%20of%20%5Bcolor%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%23ffffff%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getAllSprites%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22all%20sprites%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getfps%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22fps%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importImage(%7B%20TEXT%2C%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((arrayBuffer)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20storage%20%3D%20vm.runtime.storage%3B%0A%20%20%20%20%20%20%20%20%20%20vm.addCostume(NAME%20%2B%20%22.PNG%22%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20NAME%20%2B%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20asset%3A%20new%20storage.Asset(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20storage.AssetType.ImageBitmap%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20null%2C%20%2F%2F%20asset%20id%2C%20doesn't%20need%20to%20be%20set%20here%20because%20of%20%60true%60%20at%20the%20end%20will%20make%20Scratch%20generate%20it%20for%20you%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20storage.DataFormat.PNG%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Uint8Array(arrayBuffer)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importSprite(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((buffer)%20%3D%3E%20vm.addSprite(buffer))%0A%20%20%20%20%20%20%20%20.then(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Done%22)%3B%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20.catch((error)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Error%22%2C%20error)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteSprite(%7B%20SPRITE%20%7D)%20%7B%0A%20%20%20%20%20%20const%20target%20%3D%20vm.runtime.getSpriteTargetByName(SPRITE)%3B%0A%20%20%20%20%20%20if%20(!target%20%7C%7C%20target.isStage)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%0A%20%20%20%20%20%20if%20(typeof%20ScratchBlocks%20!%3D%3D%20%22undefined%22)%20%7B%0A%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20!confirm(%0A%20%20%20%20%20%20%20%20%20%20%20%20%60Do%20you%20want%20to%20delete%20the%20sprite%20%22%24%7BSPRITE%7D%22%3F%20This%20cannot%20be%20undone.%60%0A%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20vm.deleteSprite(target.id)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importSound(%7B%20TEXT%2C%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((arrayBuffer)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20storage%20%3D%20vm.runtime.storage%3B%0A%20%20%20%20%20%20%20%20%20%20const%20asset%20%3D%20new%20storage.Asset(%0A%20%20%20%20%20%20%20%20%20%20%20%20storage.AssetType.Sound%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20storage.DataFormat.MP3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20new%20Uint8Array(arrayBuffer)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20true%0A%20%20%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.addSound(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20md5%3A%20asset.assetId%20%2B%20%22.%22%20%2B%20asset.dataFormat%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20asset%3A%20asset%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20NAME%20%2B%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importProject(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20%2F%2F%20%40ts-ignore%0A%20%20%20%20%20%20if%20(typeof%20ScratchBlocks%20!%3D%3D%20%22undefined%22)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20We%20are%20in%20the%20editor.%20Ask%20before%20loading%20a%20new%20project%20to%20avoid%20unrecoverable%20data%20loss.%0A%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20!confirm(%0A%20%20%20%20%20%20%20%20%20%20%20%20%60Do%20you%20want%20to%20import%20a%20project%20from%20%22%24%7BTEXT%7D%22%3F%20Everything%20in%20the%20current%20project%20will%20be%20permanently%20deleted.%60%0A%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((buffer)%20%3D%3E%20vm.loadProject(buffer))%0A%20%20%20%20%20%20%20%20.then(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Done%22)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.greenFlag()%3B%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20.catch((error)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Error%22%2C%20error)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20restartProject()%20%7B%0A%20%20%20%20%20%20vm.greenFlag()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20loadExtension(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20if%20(await%20vm.securityManager.canLoadExtensionFromProject(TEXT))%20%7B%0A%20%20%20%20%20%20%20%20vm.extensionManager.loadExtensionURL(TEXT)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20getlist(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20const%20list%20%3D%20vm.runtime%0A%20%20%20%20%20%20%20%20.getTargetForStage()%0A%20%20%20%20%20%20%20%20.lookupVariableByNameAndType(TEXT%2C%20%22list%22)%3B%0A%20%20%20%20%20%20if%20(list)%20%7B%0A%20%20%20%20%20%20%20%20return%20JSON.stringify(list.value)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20setlist(%7B%20TEXT%2C%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20let%20parsed%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20parsed%20%3D%20JSON.parse(TEXT)%3B%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20JSON%20was%20invalid%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(!Array.isArray(parsed))%20%7B%0A%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20it's%20not%20an%20array%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20for%20(const%20element%20of%20parsed)%20%7B%0A%20%20%20%20%20%20%20%20const%20type%20%3D%20typeof%20element%3B%0A%20%20%20%20%20%20%20%20if%20(type%20!%3D%3D%20%22string%22%20%26%26%20type%20!%3D%3D%20%22number%22%20%26%26%20type%20!%3D%3D%20%22boolean%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20One%20of%20the%20elements%20has%20a%20disallowed%20type%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20list%20%3D%20vm.runtime%0A%20%20%20%20%20%20%20%20.getTargetForStage()%0A%20%20%20%20%20%20%20%20.lookupVariableByNameAndType(NAME%2C%20%22list%22)%3B%0A%20%20%20%20%20%20if%20(!list)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20List%20was%20not%20found%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20list.value%20%3D%20parsed%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setedtarget(%7B%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20let%20target%3B%0A%0A%20%20%20%20%20%20%2F%2FI%20know%20this%20might%20cause%20sprites%20called%20%22stage%22%20to%20be%20ignored.%20But%20lets%20be%20real%2C%20who%20names%20their%20sprite%20%22stage%22%3F%0A%20%20%20%20%20%20if%20(NAME.toLowerCase()%20%3D%3D%3D%20%22stage%22)%20%7B%0A%20%20%20%20%20%20%20%20target%20%3D%20vm.runtime.getTargetForStage()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20target%20%3D%20vm.runtime.getSpriteTargetByName(NAME)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(target)%20%7B%0A%20%20%20%20%20%20%20%20vm.setEditingTarget(target.id)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculate%20brightness%20value%20by%20RGB%20or%20HEX%20color.%0A%20%20%20%20%20*%20%40param%20color%20(String)%20The%20color%20value%20in%20RGB%20or%20HEX%20(for%20example%3A%20%23000000%20%7C%7C%20%23000%20%7C%7C%20rgb(0%2C0%2C0)%20%7C%7C%20rgba(0%2C0%2C0%2C0))%0A%20%20%20%20%20*%20%40returns%20(Number)%20The%20brightness%20value%20(dark)%200%20...%20255%20(light)%0A%20%20%20%20%20*%2F%0A%20%20%20%20brightnessByColor(%7B%20color%20%7D)%20%7B%0A%20%20%20%20%20%20%2F%2F%20https%3A%2F%2Fwww.w3.org%2FTR%2FAERT%2F%23color-contrast%0A%20%20%20%20%20%20const%20%7B%20r%2C%20g%2C%20b%20%7D%20%3D%20Scratch.Cast.toRgbColorObject(color)%3B%0A%20%20%20%20%20%20return%20(r%20*%20299%20%2B%20g%20*%20587%20%2B%20b%20*%20114)%20%2F%201000%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getfps()%20%7B%0A%20%20%20%20%20%20return%20fps%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteImage(%7B%20SPRITE%2C%20COSNAME%20%7D)%20%7B%0A%20%20%20%20%20%20%2F%2F%200znzw%2C%20since%20shovel%20did%20not%20add%20it%20yet.%0A%20%20%20%20%20%20const%20target%20%3D%20vm.runtime.getSpriteTargetByName(SPRITE)%3B%0A%20%20%20%20%20%20if%20(!target)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20target.deleteCostume(target.getCostumeIndexByName(COSNAME))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getAllSprites()%20%7B%0A%20%20%20%20%20%20%2F%2F%200znzw%2C%20since%20shovel%20did%20not%20add%20it%20yet.%0A%20%20%20%20%20%20let%20sprites%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20for%20(const%20target%20of%20vm.runtime.targets)%20%7B%0A%20%20%20%20%20%20%20%20if%20(target.isOriginal)%20sprites.push(target.sprite.name)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20JSON.stringify(sprites)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20Scratch.extensions.register(new%20ShovelUtils())%3B%0A%20%20%2F%2F%20%40ts-ignore%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B"]) {
+ for (const extension of ["data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Encoding%0A%2F%2F%20ID%3A%20Encoding%0A%2F%2F%20Description%3A%20Encode%20and%20decode%20strings%20into%20their%20unicode%20numbers%2C%20base%2064%2C%20or%20URLs.%0A%2F%2F%20By%3A%20-SIPC-%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20const%20icon%20%3D%0A%20%20%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxMzcuNzk1MDYiIGhlaWdodD0iMTM0LjIzNzA3IiB2aWV3Qm94PSIwLDAsMTM3Ljc5NTA2LDEzNC4yMzcwNyI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE1Mi44OTU4NiwtMTMwLjM3OTg5KSI%2BPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyMCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0xOTkuMzA5MDgsMjE5LjYyMDExdi03OS4yNDAyMmg4MS4zODE4NHY3OS4yNDAyMnoiLz48cGF0aCBkPSJNMTYyLjg5NTg2LDI1NC42MTY5NnYtNzkuMjQwMjJoODEuMzgxODR2NzkuMjQwMjJ6Ii8%2BPC9nPjwvZz48L3N2Zz48IS0tcm90YXRpb25DZW50ZXI6ODcuMTA0MTQwMTg0NTE2NDQ6NDkuNjIwMTA4MzQwNzA3OTYtLT4%3D%22%3B%0A%20%20const%20icon2%20%3D%0A%20%20%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI4MS44ODUzOSIgaGVpZ2h0PSI4MC42MDMwNyIgdmlld0JveD0iMCwwLDgxLjg4NTM5LDgwLjYwMzA3Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTk5LjA1NzMsLTEzOS42OTg0NikiPjxnIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2lzUGFpbnRpbmdMYXllciZxdW90Ozp0cnVlfSIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI%2BPHBhdGggZD0iTTI4MC45NDI3LDE4MGMwLDIyLjI1NzkyIC0xOC4zMzA2Nyw0MC4zMDE1NCAtNDAuOTQyNyw0MC4zMDE1NGMtMjIuNjEyMDMsMCAtNDAuOTQyNywtMTguMDQzNjEgLTQwLjk0MjcsLTQwLjMwMTU0YzAsLTIyLjI1NzkyIDE4LjMzMDY3LC00MC4zMDE1NCA0MC45NDI3LC00MC4zMDE1NGMyMi42MTIwMywwIDQwLjk0MjcsMTguMDQzNjEgNDAuOTQyNyw0MC4zMDE1NHoiIGZpbGw9IiM2NDk1ZWQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIi8%2BPHBhdGggZD0iTTIzMS44MTg3NiwxODcuOTc2MDh2LTI4Ljc2NzE1aDI5LjczNDExdjI4Ljc2NzE1eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjYiLz48cGF0aCBkPSJNMjE4LjQ0NzEzLDIwMC43OTEwN3YtMjguNzY3MTVoMjkuNzM0MTF2MjguNzY3MTV6IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iNiIvPjwvZz48L2c%2BPC9zdmc%2BPCEtLXJvdGF0aW9uQ2VudGVyOjQwLjk0MjY5NjA1MzgwMTE0OjQwLjMwMTUzNTI2NTQ4NjcwNi0tPg%3D%3D%22%3B%0A%0A%20%20%2F*!%0A%20%20This%20md5%20function%20is%20based%20on%20https%3A%2F%2Fgithub.com%2Fblueimp%2FJavaScript-MD5%2Fblob%2Fmaster%2Fjs%2Fmd5.js%0A%20%20which%20is%20licensed%20under%3A%0A%0A%20%20MIT%20License%0A%0A%20%20Copyright%20%C2%A9%202011%20Sebastian%20Tschan%2C%20https%3A%2F%2Fblueimp.net%0A%0A%20%20Permission%20is%20hereby%20granted%2C%20free%20of%20charge%2C%20to%20any%20person%20obtaining%20a%20copy%20of%0A%20%20this%20software%20and%20associated%20documentation%20files%20(the%20%22Software%22)%2C%20to%20deal%20in%0A%20%20the%20Software%20without%20restriction%2C%20including%20without%20limitation%20the%20rights%20to%0A%20%20use%2C%20copy%2C%20modify%2C%20merge%2C%20publish%2C%20distribute%2C%20sublicense%2C%20and%2For%20sell%20copies%20of%0A%20%20the%20Software%2C%20and%20to%20permit%20persons%20to%20whom%20the%20Software%20is%20furnished%20to%20do%20so%2C%0A%20%20subject%20to%20the%20following%20conditions%3A%0A%0A%20%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%20included%20in%20all%0A%20%20copies%20or%20substantial%20portions%20of%20the%20Software.%0A%0A%20%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22%2C%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND%2C%20EXPRESS%20OR%0A%20%20IMPLIED%2C%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%20MERCHANTABILITY%2C%20FITNESS%0A%20%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%20IN%20NO%20EVENT%20SHALL%20THE%20AUTHORS%20OR%0A%20%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%20CLAIM%2C%20DAMAGES%20OR%20OTHER%20LIABILITY%2C%20WHETHER%0A%20%20IN%20AN%20ACTION%20OF%20CONTRACT%2C%20TORT%20OR%20OTHERWISE%2C%20ARISING%20FROM%2C%20OUT%20OF%20OR%20IN%0A%20%20CONNECTION%20WITH%20THE%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%20THE%20SOFTWARE.%0A%20%20*%2F%0A%20%20%2F*%20eslint-disable%20*%2F%0A%20%20const%20md5%20%3D%20(function%20()%20%7B%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Add%20integers%2C%20wrapping%20at%202%5E32.%0A%20%20%20%20%20*%20This%20uses%2016-bit%20operations%20internally%20to%20work%20around%20bugs%20in%20interpreters.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20First%20integer%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20y%20Second%20integer%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Sum%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20safeAdd(x%2C%20y)%20%7B%0A%20%20%20%20%20%20var%20lsw%20%3D%20(x%20%26%200xffff)%20%2B%20(y%20%26%200xffff)%3B%0A%20%20%20%20%20%20var%20msw%20%3D%20(x%20%3E%3E%2016)%20%2B%20(y%20%3E%3E%2016)%20%2B%20(lsw%20%3E%3E%2016)%3B%0A%20%20%20%20%20%20return%20(msw%20%3C%3C%2016)%20%7C%20(lsw%20%26%200xffff)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Bitwise%20rotate%20a%2032-bit%20number%20to%20the%20left.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20num%2032-bit%20number%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20cnt%20Rotation%20count%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Rotated%20number%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20bitRotateLeft(num%2C%20cnt)%20%7B%0A%20%20%20%20%20%20return%20(num%20%3C%3C%20cnt)%20%7C%20(num%20%3E%3E%3E%20(32%20-%20cnt))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20q%20q%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5cmn(q%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20safeAdd(%0A%20%20%20%20%20%20%20%20bitRotateLeft(safeAdd(safeAdd(a%2C%20q)%2C%20safeAdd(x%2C%20t))%2C%20s)%2C%0A%20%20%20%20%20%20%20%20b%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn((b%20%26%20c)%20%7C%20(~b%20%26%20d)%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn((b%20%26%20d)%20%7C%20(c%20%26%20~d)%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn(b%20%5E%20c%20%5E%20d%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Basic%20operation%20the%20algorithm%20uses.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20a%20a%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20b%20b%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20c%20c%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20d%20d%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20x%20x%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20s%20s%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20t%20t%0A%20%20%20%20%20*%20%40returns%20%7Bnumber%7D%20Result%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%2C%20s%2C%20t)%20%7B%0A%20%20%20%20%20%20return%20md5cmn(c%20%5E%20(b%20%7C%20~d)%2C%20a%2C%20b%2C%20x%2C%20s%2C%20t)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculate%20the%20MD5%20of%20an%20array%20of%20little-endian%20words%2C%20and%20a%20bit%20length.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7BArray%7D%20x%20Array%20of%20little-endian%20words%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20len%20Bit%20length%0A%20%20%20%20%20*%20%40returns%20%7BArray%3Cnumber%3E%7D%20MD5%20Array%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20binlMD5(x%2C%20len)%20%7B%0A%20%20%20%20%20%20%2F*%20append%20padding%20*%2F%0A%20%20%20%20%20%20x%5Blen%20%3E%3E%205%5D%20%7C%3D%200x80%20%3C%3C%20len%20%25%2032%3B%0A%20%20%20%20%20%20x%5B(((len%20%2B%2064)%20%3E%3E%3E%209)%20%3C%3C%204)%20%2B%2014%5D%20%3D%20len%3B%0A%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20olda%3B%0A%20%20%20%20%20%20var%20oldb%3B%0A%20%20%20%20%20%20var%20oldc%3B%0A%20%20%20%20%20%20var%20oldd%3B%0A%20%20%20%20%20%20var%20a%20%3D%201732584193%3B%0A%20%20%20%20%20%20var%20b%20%3D%20-271733879%3B%0A%20%20%20%20%20%20var%20c%20%3D%20-1732584194%3B%0A%20%20%20%20%20%20var%20d%20%3D%20271733878%3B%0A%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20x.length%3B%20i%20%2B%3D%2016)%20%7B%0A%20%20%20%20%20%20%20%20olda%20%3D%20a%3B%0A%20%20%20%20%20%20%20%20oldb%20%3D%20b%3B%0A%20%20%20%20%20%20%20%20oldc%20%3D%20c%3B%0A%20%20%20%20%20%20%20%20oldd%20%3D%20d%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%5D%2C%207%2C%20-680876936)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%201%5D%2C%2012%2C%20-389564586)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%202%5D%2C%2017%2C%20606105819)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%203%5D%2C%2022%2C%20-1044525330)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%204%5D%2C%207%2C%20-176418897)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%205%5D%2C%2012%2C%201200080426)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%206%5D%2C%2017%2C%20-1473231341)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%207%5D%2C%2022%2C%20-45705983)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%208%5D%2C%207%2C%201770035416)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%209%5D%2C%2012%2C%20-1958414417)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2010%5D%2C%2017%2C%20-42063)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2011%5D%2C%2022%2C%20-1990404162)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ff(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2012%5D%2C%207%2C%201804603682)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ff(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2013%5D%2C%2012%2C%20-40341101)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ff(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2014%5D%2C%2017%2C%20-1502002290)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ff(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2015%5D%2C%2022%2C%201236535329)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%201%5D%2C%205%2C%20-165796510)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%206%5D%2C%209%2C%20-1069501632)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2011%5D%2C%2014%2C%20643717713)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%5D%2C%2020%2C%20-373897302)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%205%5D%2C%205%2C%20-701558691)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2010%5D%2C%209%2C%2038016083)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2015%5D%2C%2014%2C%20-660478335)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%204%5D%2C%2020%2C%20-405537848)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%209%5D%2C%205%2C%20568446438)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2014%5D%2C%209%2C%20-1019803690)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%203%5D%2C%2014%2C%20-187363961)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%208%5D%2C%2020%2C%201163531501)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5gg(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2013%5D%2C%205%2C%20-1444681467)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5gg(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%202%5D%2C%209%2C%20-51403784)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5gg(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%207%5D%2C%2014%2C%201735328473)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5gg(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2012%5D%2C%2020%2C%20-1926607734)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%205%5D%2C%204%2C%20-378558)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%208%5D%2C%2011%2C%20-2022574463)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2011%5D%2C%2016%2C%201839030562)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2014%5D%2C%2023%2C%20-35309556)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%201%5D%2C%204%2C%20-1530992060)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%204%5D%2C%2011%2C%201272893353)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%207%5D%2C%2016%2C%20-155497632)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2010%5D%2C%2023%2C%20-1094730640)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2013%5D%2C%204%2C%20681279174)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%5D%2C%2011%2C%20-358537222)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%203%5D%2C%2016%2C%20-722521979)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%206%5D%2C%2023%2C%2076029189)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5hh(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%209%5D%2C%204%2C%20-640364487)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5hh(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2012%5D%2C%2011%2C%20-421815835)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5hh(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2015%5D%2C%2016%2C%20530742520)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5hh(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%202%5D%2C%2023%2C%20-995338651)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%5D%2C%206%2C%20-198630844)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%207%5D%2C%2010%2C%201126891415)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2014%5D%2C%2015%2C%20-1416354905)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%205%5D%2C%2021%2C%20-57434055)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%2012%5D%2C%206%2C%201700485571)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%203%5D%2C%2010%2C%20-1894986606)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%2010%5D%2C%2015%2C%20-1051523)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%201%5D%2C%2021%2C%20-2054922799)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%208%5D%2C%206%2C%201873313359)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2015%5D%2C%2010%2C%20-30611744)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%206%5D%2C%2015%2C%20-1560198380)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%2013%5D%2C%2021%2C%201309151649)%3B%0A%20%20%20%20%20%20%20%20a%20%3D%20md5ii(a%2C%20b%2C%20c%2C%20d%2C%20x%5Bi%20%2B%204%5D%2C%206%2C%20-145523070)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20md5ii(d%2C%20a%2C%20b%2C%20c%2C%20x%5Bi%20%2B%2011%5D%2C%2010%2C%20-1120210379)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20md5ii(c%2C%20d%2C%20a%2C%20b%2C%20x%5Bi%20%2B%202%5D%2C%2015%2C%20718787259)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20md5ii(b%2C%20c%2C%20d%2C%20a%2C%20x%5Bi%20%2B%209%5D%2C%2021%2C%20-343485551)%3B%0A%0A%20%20%20%20%20%20%20%20a%20%3D%20safeAdd(a%2C%20olda)%3B%0A%20%20%20%20%20%20%20%20b%20%3D%20safeAdd(b%2C%20oldb)%3B%0A%20%20%20%20%20%20%20%20c%20%3D%20safeAdd(c%2C%20oldc)%3B%0A%20%20%20%20%20%20%20%20d%20%3D%20safeAdd(d%2C%20oldd)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%5Ba%2C%20b%2C%20c%2C%20d%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Convert%20an%20array%20of%20little-endian%20words%20to%20a%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7BArray%3Cnumber%3E%7D%20input%20MD5%20Array%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20binl2rstr(input)%20%7B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20output%20%3D%20%22%22%3B%0A%20%20%20%20%20%20var%20length32%20%3D%20input.length%20*%2032%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20length32%3B%20i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20output%20%2B%3D%20String.fromCharCode((input%5Bi%20%3E%3E%205%5D%20%3E%3E%3E%20i%20%25%2032)%20%26%200xff)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Convert%20a%20raw%20string%20to%20an%20array%20of%20little-endian%20words%0A%20%20%20%20%20*%20Characters%20%3E255%20have%20their%20high-byte%20silently%20ignored.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20input%20Raw%20input%20string%0A%20%20%20%20%20*%20%40returns%20%7BArray%3Cnumber%3E%7D%20Array%20of%20little-endian%20words%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstr2binl(input)%20%7B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20output%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20output%5B(input.length%20%3E%3E%202)%20-%201%5D%20%3D%20undefined%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20output.length%3B%20i%20%2B%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20output%5Bi%5D%20%3D%200%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20length8%20%3D%20input.length%20*%208%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20length8%3B%20i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20output%5Bi%20%3E%3E%205%5D%20%7C%3D%20(input.charCodeAt(i%20%2F%208)%20%26%200xff)%20%3C%3C%20i%20%25%2032%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculate%20the%20MD5%20of%20a%20raw%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20s%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstrMD5(s)%20%7B%0A%20%20%20%20%20%20return%20binl2rstr(binlMD5(rstr2binl(s)%2C%20s.length%20*%208))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20HMAC-MD5%20of%20a%20key%20and%20some%20data%20(raw%20strings)%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20key%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20data%20Raw%20input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstrHMACMD5(key%2C%20data)%20%7B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20var%20bkey%20%3D%20rstr2binl(key)%3B%0A%20%20%20%20%20%20var%20ipad%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20var%20opad%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20var%20hash%3B%0A%20%20%20%20%20%20ipad%5B15%5D%20%3D%20opad%5B15%5D%20%3D%20undefined%3B%0A%20%20%20%20%20%20if%20(bkey.length%20%3E%2016)%20%7B%0A%20%20%20%20%20%20%20%20bkey%20%3D%20binlMD5(bkey%2C%20key.length%20*%208)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%2016%3B%20i%20%2B%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20ipad%5Bi%5D%20%3D%20bkey%5Bi%5D%20%5E%200x36363636%3B%0A%20%20%20%20%20%20%20%20opad%5Bi%5D%20%3D%20bkey%5Bi%5D%20%5E%200x5c5c5c5c%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20hash%20%3D%20binlMD5(ipad.concat(rstr2binl(data))%2C%20512%20%2B%20data.length%20*%208)%3B%0A%20%20%20%20%20%20return%20binl2rstr(binlMD5(opad.concat(hash)%2C%20512%20%2B%20128))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Convert%20a%20raw%20string%20to%20a%20hex%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20input%20Raw%20input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Hex%20encoded%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rstr2hex(input)%20%7B%0A%20%20%20%20%20%20var%20hexTab%20%3D%20%220123456789abcdef%22%3B%0A%20%20%20%20%20%20var%20output%20%3D%20%22%22%3B%0A%20%20%20%20%20%20var%20x%3B%0A%20%20%20%20%20%20var%20i%3B%0A%20%20%20%20%20%20for%20(i%20%3D%200%3B%20i%20%3C%20input.length%3B%20i%20%2B%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20x%20%3D%20input.charCodeAt(i)%3B%0A%20%20%20%20%20%20%20%20output%20%2B%3D%20hexTab.charAt((x%20%3E%3E%3E%204)%20%26%200x0f)%20%2B%20hexTab.charAt(x%20%26%200x0f)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Encode%20a%20string%20as%20UTF-8%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20input%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20UTF8%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20str2rstrUTF8(input)%20%7B%0A%20%20%20%20%20%20return%20unescape(encodeURIComponent(input))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Encodes%20input%20string%20as%20raw%20MD5%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20s%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rawMD5(s)%20%7B%0A%20%20%20%20%20%20return%20rstrMD5(str2rstrUTF8(s))%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Encodes%20input%20string%20as%20Hex%20encoded%20string%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20s%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Hex%20encoded%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20hexMD5(s)%20%7B%0A%20%20%20%20%20%20return%20rstr2hex(rawMD5(s))%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20raw%20HMAC-MD5%20for%20the%20given%20key%20and%20data%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20k%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20d%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20rawHMACMD5(k%2C%20d)%20%7B%0A%20%20%20%20%20%20return%20rstrHMACMD5(str2rstrUTF8(k)%2C%20str2rstrUTF8(d))%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20the%20Hex%20encoded%20HMAC-MD5%20for%20the%20given%20key%20and%20data%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20k%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20d%20Input%20string%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20Raw%20MD5%20string%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20hexHMACMD5(k%2C%20d)%20%7B%0A%20%20%20%20%20%20return%20rstr2hex(rawHMACMD5(k%2C%20d))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculates%20MD5%20value%20for%20a%20given%20string.%0A%20%20%20%20%20*%20If%20a%20key%20is%20provided%2C%20calculates%20the%20HMAC-MD5%20value.%0A%20%20%20%20%20*%20Returns%20a%20Hex%20encoded%20string%20unless%20the%20raw%20argument%20is%20given.%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20string%20Input%20string%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20%5Bkey%5D%20HMAC%20key%0A%20%20%20%20%20*%20%40param%20%7Bboolean%7D%20%5Braw%5D%20Raw%20output%20switch%0A%20%20%20%20%20*%20%40returns%20%7Bstring%7D%20MD5%20output%0A%20%20%20%20%20*%2F%0A%20%20%20%20function%20md5(string%2C%20key%2C%20raw)%20%7B%0A%20%20%20%20%20%20if%20(!key)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!raw)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20hexMD5(string)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20rawMD5(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(!raw)%20%7B%0A%20%20%20%20%20%20%20%20return%20hexHMACMD5(key%2C%20string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20rawHMACMD5(key%2C%20string)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20md5%3B%0A%20%20%7D)()%3B%0A%20%20%2F*%20eslint-enable%20*%2F%0A%0A%20%20class%20Encoding%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22Encoding%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Encoding%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%236495ed%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23739fee%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%2383aaf0%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%3A%20icon2%2C%0A%20%20%20%20%20%20%20%20blockIconURI%3A%20icon%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22encode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Encode%20%5Bstring%5D%20in%20%5Bcode%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20code%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22encode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Base64%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22decode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Decode%20%5Bstring%5D%20with%20%5Bcode%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22VHVyYm9XYXJw%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20code%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22encode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Base64%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22hash%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Hash%20%5Bstring%5D%20with%20%5Bhash%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22apple%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20hash%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22hash%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22MD5%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Conversioncodes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Convert%20the%20character%20%5Bstring%5D%20to%20%5BCodeList%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CodeList%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22Code%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22UNICODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Restorecode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5Bstring%5D%20corresponding%20to%20the%20%5BCodeList%5D%20character%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20string%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%2265%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CodeList%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22Code%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22UNICODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Randomstrings%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Randomly%20generated%20%5Bposition%5D%20character%20string%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22Fontgenerationstring%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Use%20%5Bwordbank%5D%20to%20generate%20a%20random%20%5Bposition%5D%20character%20string%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20wordbank%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%221234567890%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20Code%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Unicode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22UNICODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20encode%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Base%2064%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22Base64%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22URL%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20hash%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22MD5%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20encode(%7B%20string%2C%20code%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(code)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22Base64%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20btoa(string)%3B%0A%20%20%20%20%20%20%20%20case%20%22URL%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20encodeURIComponent(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20decode(%7B%20string%2C%20code%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(code)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22Base64%22%3A%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20atob(string)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(error)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20console.error(%22invalid%20base%2064%22%2C%20error)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20case%20%22URL%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20decodeURIComponent(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20hash(%7B%20string%2C%20hash%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(hash)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22MD5%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20md5(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20Conversioncodes(%7B%20string%2C%20CodeList%20%7D)%20%7B%0A%20%20%20%20%20%20string%20%3D%20Scratch.Cast.toString(string)%3B%0A%20%20%20%20%20%20switch%20(CodeList)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22UNICODE%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20string.charCodeAt(0)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%200%3B%0A%20%20%20%20%7D%0A%20%20%20%20Restorecode(%7B%20string%2C%20CodeList%20%7D)%20%7B%0A%20%20%20%20%20%20switch%20(CodeList)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22UNICODE%22%3A%0A%20%20%20%20%20%20%20%20%20%20return%20String.fromCharCode(string)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20Randomstrings(%7B%20position%20%7D)%20%7B%0A%20%20%20%20%20%20position%20%3D%20Scratch.Cast.toNumber(position)%20%7C%7C%2032%3B%0A%20%20%20%20%20%20let%20t%20%3D%20%22ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678%22%3B%0A%20%20%20%20%20%20let%20a%20%3D%20t.length%3B%0A%20%20%20%20%20%20let%20string%20%3D%20%22%22%3B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20position%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20string%20%2B%3D%20t.charAt(Math.floor(Math.random()%20*%20a))%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20string%3B%0A%20%20%20%20%7D%0A%20%20%20%20Fontgenerationstring(%7B%20wordbank%2C%20position%20%7D)%20%7B%0A%20%20%20%20%20%20position%20%3D%20Scratch.Cast.toNumber(position)%20%7C%7C%2032%3B%0A%20%20%20%20%20%20let%20t%20%3D%20String(wordbank)%3B%0A%20%20%20%20%20%20let%20a%20%3D%20t.length%3B%0A%20%20%20%20%20%20let%20string%20%3D%20%22%22%3B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20position%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20string%20%2B%3D%20t.charAt(Math.floor(Math.random()%20*%20a))%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20string%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20Scratch.extensions.register(new%20Encoding())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20ShovelUtils%0A%2F%2F%20ID%3A%20ShovelUtils%0A%2F%2F%20Description%3A%20A%20bunch%20of%20miscellaneous%20blocks.%0A%2F%2F%20By%3A%20TheShovel%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20%7B%0A%20%20%20%20throw%20new%20Error(%22ShovelUtils%20must%20be%20run%20unsandboxed%22)%3B%0A%20%20%7D%0A%20%20console.log(%22ShovelUtils%20v1.4%22)%3B%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%0A%20%20%2F%2F%20Based%20on%20from%20https%3A%2F%2Fwww.growingwiththeweb.com%2F2017%2F12%2Ffast-simple-js-fps-counter.html%0A%20%20const%20times%20%3D%20%5B%5D%3B%0A%20%20let%20fps%20%3D%20vm.runtime.frameLoop.framerate%3B%0A%20%20const%20oldStep%20%3D%20vm.runtime._step%3B%0A%20%20vm.runtime._step%20%3D%20function%20()%20%7B%0A%20%20%20%20oldStep.call(this)%3B%0A%20%20%20%20const%20now%20%3D%20performance.now()%3B%0A%20%20%20%20while%20(times.length%20%3E%200%20%26%26%20times%5B0%5D%20%3C%3D%20now%20-%201000)%20%7B%0A%20%20%20%20%20%20times.shift()%3B%0A%20%20%20%20%7D%0A%20%20%20%20times.push(now)%3B%0A%20%20%20%20fps%20%3D%20times.length%3B%0A%20%20%7D%3B%0A%0A%20%20class%20ShovelUtils%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22ShovelUtils%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22ShovelUtils%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23f54242%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23f54242%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23f54242%22%2C%0A%20%20%20%20%20%20%20%20docsURI%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2FTheShovel%2FShovelUtils%22%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20image%20from%20%5BTEXT%5D%20name%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fdango.png%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Dango%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getlist%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22get%20list%20%5BTEXT%5D%20as%20array%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22MyList%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setlist%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20list%20%5BNAME%5D%20to%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%5B1%2C2%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22MyList%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importSprite%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20sprite%20from%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Link%20or%20data%20uri%20here%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importSound%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20sound%20from%20%5BTEXT%5D%20name%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fmeow.mp3%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Meow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importProject%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20project%20from%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fsamples%2FBox2D.sb3%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22loadExtension%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22load%20extension%20from%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Futilities.js%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22restartProject%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22restart%20project%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%220%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteSprite%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20sprite%20%5BSPRITE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Sprite1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20costume%20%5BCOSNAME%5D%20in%20%5BSPRITE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COSNAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22costume1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Sprite1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setedtarget%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20editing%20target%20to%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Sprite1%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22brightnessByColor%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22brightness%20of%20%5Bcolor%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%23ffffff%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getAllSprites%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22all%20sprites%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getfps%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22fps%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importImage(%7B%20TEXT%2C%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((arrayBuffer)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20storage%20%3D%20vm.runtime.storage%3B%0A%20%20%20%20%20%20%20%20%20%20vm.addCostume(NAME%20%2B%20%22.PNG%22%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20NAME%20%2B%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20asset%3A%20new%20storage.Asset(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20storage.AssetType.ImageBitmap%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20null%2C%20%2F%2F%20asset%20id%2C%20doesn't%20need%20to%20be%20set%20here%20because%20of%20%60true%60%20at%20the%20end%20will%20make%20Scratch%20generate%20it%20for%20you%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20storage.DataFormat.PNG%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Uint8Array(arrayBuffer)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importSprite(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((buffer)%20%3D%3E%20vm.addSprite(buffer))%0A%20%20%20%20%20%20%20%20.then(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Done%22)%3B%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20.catch((error)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Error%22%2C%20error)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteSprite(%7B%20SPRITE%20%7D)%20%7B%0A%20%20%20%20%20%20const%20target%20%3D%20vm.runtime.getSpriteTargetByName(SPRITE)%3B%0A%20%20%20%20%20%20if%20(!target%20%7C%7C%20target.isStage)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%0A%20%20%20%20%20%20if%20(typeof%20ScratchBlocks%20!%3D%3D%20%22undefined%22)%20%7B%0A%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20!confirm(%0A%20%20%20%20%20%20%20%20%20%20%20%20%60Do%20you%20want%20to%20delete%20the%20sprite%20%22%24%7BSPRITE%7D%22%3F%20This%20cannot%20be%20undone.%60%0A%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20vm.deleteSprite(target.id)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importSound(%7B%20TEXT%2C%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((arrayBuffer)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20storage%20%3D%20vm.runtime.storage%3B%0A%20%20%20%20%20%20%20%20%20%20const%20asset%20%3D%20new%20storage.Asset(%0A%20%20%20%20%20%20%20%20%20%20%20%20storage.AssetType.Sound%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20storage.DataFormat.MP3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20new%20Uint8Array(arrayBuffer)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20true%0A%20%20%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.addSound(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20md5%3A%20asset.assetId%20%2B%20%22.%22%20%2B%20asset.dataFormat%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20asset%3A%20asset%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20NAME%20%2B%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20importProject(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20%2F%2F%20%40ts-ignore%0A%20%20%20%20%20%20if%20(typeof%20ScratchBlocks%20!%3D%3D%20%22undefined%22)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20We%20are%20in%20the%20editor.%20Ask%20before%20loading%20a%20new%20project%20to%20avoid%20unrecoverable%20data%20loss.%0A%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20!confirm(%0A%20%20%20%20%20%20%20%20%20%20%20%20%60Do%20you%20want%20to%20import%20a%20project%20from%20%22%24%7BTEXT%7D%22%3F%20Everything%20in%20the%20current%20project%20will%20be%20permanently%20deleted.%60%0A%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20Scratch.fetch(TEXT)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.arrayBuffer())%0A%20%20%20%20%20%20%20%20.then((buffer)%20%3D%3E%20vm.loadProject(buffer))%0A%20%20%20%20%20%20%20%20.then(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Done%22)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.greenFlag()%3B%0A%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20.catch((error)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20console.log(%22Error%22%2C%20error)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20restartProject()%20%7B%0A%20%20%20%20%20%20vm.greenFlag()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20loadExtension(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20if%20(await%20vm.securityManager.canLoadExtensionFromProject(TEXT))%20%7B%0A%20%20%20%20%20%20%20%20vm.extensionManager.loadExtensionURL(TEXT)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20getlist(%7B%20TEXT%20%7D)%20%7B%0A%20%20%20%20%20%20const%20list%20%3D%20vm.runtime%0A%20%20%20%20%20%20%20%20.getTargetForStage()%0A%20%20%20%20%20%20%20%20.lookupVariableByNameAndType(TEXT%2C%20%22list%22)%3B%0A%20%20%20%20%20%20if%20(list)%20%7B%0A%20%20%20%20%20%20%20%20return%20JSON.stringify(list.value)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20setlist(%7B%20TEXT%2C%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20let%20parsed%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20parsed%20%3D%20JSON.parse(TEXT)%3B%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20JSON%20was%20invalid%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(!Array.isArray(parsed))%20%7B%0A%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20it's%20not%20an%20array%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20for%20(const%20element%20of%20parsed)%20%7B%0A%20%20%20%20%20%20%20%20const%20type%20%3D%20typeof%20element%3B%0A%20%20%20%20%20%20%20%20if%20(type%20!%3D%3D%20%22string%22%20%26%26%20type%20!%3D%3D%20%22number%22%20%26%26%20type%20!%3D%3D%20%22boolean%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20One%20of%20the%20elements%20has%20a%20disallowed%20type%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20list%20%3D%20vm.runtime%0A%20%20%20%20%20%20%20%20.getTargetForStage()%0A%20%20%20%20%20%20%20%20.lookupVariableByNameAndType(NAME%2C%20%22list%22)%3B%0A%20%20%20%20%20%20if%20(!list)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%20%2F%2F%20List%20was%20not%20found%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20list.value%20%3D%20parsed%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setedtarget(%7B%20NAME%20%7D)%20%7B%0A%20%20%20%20%20%20let%20target%3B%0A%0A%20%20%20%20%20%20%2F%2FI%20know%20this%20might%20cause%20sprites%20called%20%22stage%22%20to%20be%20ignored.%20But%20lets%20be%20real%2C%20who%20names%20their%20sprite%20%22stage%22%3F%0A%20%20%20%20%20%20if%20(NAME.toLowerCase()%20%3D%3D%3D%20%22stage%22)%20%7B%0A%20%20%20%20%20%20%20%20target%20%3D%20vm.runtime.getTargetForStage()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20target%20%3D%20vm.runtime.getSpriteTargetByName(NAME)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(target)%20%7B%0A%20%20%20%20%20%20%20%20vm.setEditingTarget(target.id)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20Calculate%20brightness%20value%20by%20RGB%20or%20HEX%20color.%0A%20%20%20%20%20*%20%40param%20color%20(String)%20The%20color%20value%20in%20RGB%20or%20HEX%20(for%20example%3A%20%23000000%20%7C%7C%20%23000%20%7C%7C%20rgb(0%2C0%2C0)%20%7C%7C%20rgba(0%2C0%2C0%2C0))%0A%20%20%20%20%20*%20%40returns%20(Number)%20The%20brightness%20value%20(dark)%200%20...%20255%20(light)%0A%20%20%20%20%20*%2F%0A%20%20%20%20brightnessByColor(%7B%20color%20%7D)%20%7B%0A%20%20%20%20%20%20%2F%2F%20https%3A%2F%2Fwww.w3.org%2FTR%2FAERT%2F%23color-contrast%0A%20%20%20%20%20%20const%20%7B%20r%2C%20g%2C%20b%20%7D%20%3D%20Scratch.Cast.toRgbColorObject(color)%3B%0A%20%20%20%20%20%20return%20(r%20*%20299%20%2B%20g%20*%20587%20%2B%20b%20*%20114)%20%2F%201000%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getfps()%20%7B%0A%20%20%20%20%20%20return%20fps%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteImage(%7B%20SPRITE%2C%20COSNAME%20%7D)%20%7B%0A%20%20%20%20%20%20%2F%2F%200znzw%2C%20since%20shovel%20did%20not%20add%20it%20yet.%0A%20%20%20%20%20%20const%20target%20%3D%20vm.runtime.getSpriteTargetByName(SPRITE)%3B%0A%20%20%20%20%20%20if%20(!target)%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20target.deleteCostume(target.getCostumeIndexByName(COSNAME))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getAllSprites()%20%7B%0A%20%20%20%20%20%20%2F%2F%200znzw%2C%20since%20shovel%20did%20not%20add%20it%20yet.%0A%20%20%20%20%20%20let%20sprites%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20for%20(const%20target%20of%20vm.runtime.targets)%20%7B%0A%20%20%20%20%20%20%20%20if%20(target.isOriginal)%20sprites.push(target.sprite.name)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20JSON.stringify(sprites)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20Scratch.extensions.register(new%20ShovelUtils())%3B%0A%20%20%2F%2F%20%40ts-ignore%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Animated%20Text%0A%2F%2F%20ID%3A%20text%0A%2F%2F%20Description%3A%20An%20easy%20way%20to%20display%20and%20animate%20text.%20Compatible%20with%20Scratch%20Lab's%20Animated%20Text%20experiment.%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20%2F%2F%20This%20extension%20was%20created%20by%20making%20projects%20with%20https%3A%2F%2Flab.scratch.mit.edu%2Ftext%2F%0A%20%20%2F%2F%20To%20determine%20block%20and%20argument%20IDs%2C%20we%20extracted%20project.json%20and%20examined%20the%20result.%0A%20%20%2F%2F%20To%20determine%20block%20behaviors%20we%20simply%20experiment%20with%20Scratch%20Lab%20and%20made%20sure%20our%0A%20%20%2F%2F%20blocks%20do%20the%20same%20things.%0A%20%20%2F%2F%20This%20extension's%20code%20is%20not%20based%20on%20the%20source%20code%20of%20Scratch%20Lab's.%0A%0A%20%20%2F%2F%20by%20%40LilyMakesThings%0A%20%20const%20blockIconURI%20%3D%0A%20%20%20%20%22data%3Aimage%2Fsvg%2Bxml%3B%2C%253Csvg%2520xmlns%253D%2522http%253A%252F%252Fwww.w3.org%252F2000%252Fsvg%2522%2520width%253D%2522284.242%2522%2520height%253D%2522284.242%2522%253E%253Cg%2520fill-rule%253D%2522evenodd%2522%2520stroke-miterlimit%253D%252210%2522%2520data-paper-data%253D%2522%257B%2526quot%253BisPaintingLayer%2526quot%253B%253Atrue%257D%2522%2520style%253D%2522mix-blend-mode%253Anormal%2522%253E%253Cpath%2520fill%253D%2522none%2522%2520d%253D%2522M188.894%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.48%25209.888a1671.47%25201671.47%25200%25200%25200-4.174%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.83%2520522.83%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.329%2520157.508H225.43l-9.636-26.111h-54.08l-9.636%252026.11h-43.432l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522%252396f%2522%2520stroke%253D%2522%25237240d6%2522%2520stroke-linejoin%253D%2522round%2522%2520stroke-width%253D%252229%2522%2520d%253D%2522M188.894%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.48%25209.888a1671.47%25201671.47%25200%25200%25200-4.174%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.83%2520522.83%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.329%2520157.508H225.43l-9.636-26.111h-54.08l-9.636%252026.11h-43.432l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522none%2522%2520d%253D%2522M188.894%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.48%25209.888a1671.47%25201671.47%25200%25200%25200-4.174%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.827%2520522.827%25200%25200%25201-4.065-11.242%2520408.302%2520408.302%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.329%2520157.508H225.43l-9.636-26.111h-54.08l-9.636%252026.11h-43.432l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522%2523ffa24d%2522%2520stroke%253D%2522%2523fff%2522%2520stroke-linejoin%253D%2522round%2522%2520stroke-width%253D%25229%2522%2520d%253D%2522M188.894%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.48%25209.888a1671.47%25201671.47%25200%25200%25200-4.174%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.827%2520522.827%25200%25200%25201-4.065-11.242%2520408.302%2520408.302%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.329%2520157.508H225.43l-9.636-26.111h-54.08l-9.636%252026.11h-43.432l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522none%2522%2520d%253D%2522M143.696%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888a1671.47%25201671.47%25200%25200%25200-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.827%2520522.827%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.33%2520157.508h-44.312l-9.637-26.111h-54.08l-9.636%252026.11H63.448l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522%252396f%2522%2520stroke%253D%2522%25237240d6%2522%2520stroke-linejoin%253D%2522round%2522%2520stroke-width%253D%252229%2522%2520d%253D%2522M143.696%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888a1671.47%25201671.47%25200%25200%25200-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.827%2520522.827%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.33%2520157.508h-44.312l-9.637-26.111h-54.08l-9.636%252026.11H63.448l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522none%2522%2520d%253D%2522M143.696%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888a1671.47%25201671.47%25200%25200%25200-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.827%2520522.827%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.33%2520157.508h-44.312l-9.637-26.111h-54.08l-9.636%252026.11H63.448l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522%2523ff774d%2522%2520stroke%253D%2522%2523fff%2522%2520stroke-linejoin%253D%2522round%2522%2520stroke-width%253D%25229%2522%2520d%253D%2522M143.696%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888a1671.47%25201671.47%25200%25200%25200-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.827%2520522.827%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.519-56.092%252062.33%2520157.508h-44.312l-9.637-26.111h-54.08l-9.636%252026.11H63.448l62.768-157.507Z%2522%252F%253E%253Cpath%2520fill%253D%2522none%2522%2520d%253D%2522M94.748%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888-1.27%25203.442-2.66%25207.263-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.885%2520522.885%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.52-56.092%252062.328%2520157.508h-44.311l-9.637-26.111h-54.08l-9.635%252026.11H14.5L77.269%252063.368Z%2522%252F%253E%253Cpath%2520fill%253D%2522%252396f%2522%2520stroke%253D%2522%25237240d6%2522%2520stroke-linejoin%253D%2522round%2522%2520stroke-width%253D%252229%2522%2520d%253D%2522M94.748%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888-1.27%25203.442-2.66%25207.263-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.885%2520522.885%25200%25200%25201-4.065-11.242%2520408.343%2520408.343%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.52-56.092%252062.328%2520157.508h-44.311l-9.637-26.111h-54.08l-9.635%252026.11H14.5L77.269%252063.368Z%2522%252F%253E%253Cpath%2520fill%253D%2522none%2522%2520d%253D%2522M94.748%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888-1.27%25203.442-2.66%25207.263-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.885%2520522.885%25200%25200%25201-4.065-11.242%2520408.302%2520408.302%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.52-56.092%252062.328%2520157.508h-44.311l-9.637-26.111h-54.08l-9.635%252026.11H14.5L77.269%252063.368Z%2522%252F%253E%253Cpath%2520fill%253D%2522%2523ff4c4c%2522%2520stroke%253D%2522%2523fff%2522%2520stroke-linejoin%253D%2522round%2522%2520stroke-width%253D%25229%2522%2520d%253D%2522M94.748%2520119.459c-.706%25202.378-1.43%25204.69-2.172%25206.933-1.05%25203.15-2.21%25206.445-3.479%25209.888-1.27%25203.442-2.66%25207.263-4.175%252011.462l-5.73%252015.528h30.833l-5.73-15.528a522.885%2520522.885%25200%25200%25201-4.065-11.242%2520408.302%2520408.302%25200%25200%25201-3.37-10.108%2520350.767%2520350.767%25200%25200%25201-2.112-6.933zm18.52-56.092%252062.328%2520157.508h-44.311l-9.637-26.111h-54.08l-9.635%252026.11H14.5L77.269%252063.368Z%2522%252F%253E%253C%252Fg%253E%253C%252Fsvg%253E%22%3B%0A%0A%20%20const%20CUSTOM_STATE_KEY%20%3D%20Symbol()%3B%0A%0A%20%20const%20ALIGN_LEFT%20%3D%200%3B%0A%20%20const%20ALIGN_RIGHT%20%3D%201%3B%0A%20%20const%20ALIGN_CENTER%20%3D%202%3B%0A%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%20%20const%20renderer%20%3D%20vm.renderer%3B%0A%20%20const%20gl%20%3D%20renderer.gl%3B%0A%0A%20%20let%20compatibilityMode%20%3D%20true%3B%0A%0A%20%20const%20FONTS%20%3D%20%5B%0A%20%20%20%20%22Sans%20Serif%22%2C%0A%20%20%20%20%22Serif%22%2C%0A%20%20%20%20%22Handwriting%22%2C%0A%20%20%20%20%22Marker%22%2C%0A%20%20%20%20%22Curly%22%2C%0A%20%20%20%20%22Pixel%22%2C%0A%20%20%5D%3B%0A%0A%20%20const%20DEFAULT_COLOR%20%3D%20%22%23575e75%22%3B%0A%20%20const%20DEFAULT_FONT%20%3D%20%22Handwriting%22%3B%0A%20%20const%20DEFAULT_WIDTH%20%3D%20vm.runtime.stageWidth%3B%0A%20%20const%20DEFAULT_ALIGN%20%3D%20ALIGN_CENTER%3B%0A%20%20const%20DEFAULT_FONT_SIZE%20%3D%2024%3B%0A%0A%20%20const%20DEFAULT_TYPE_DELAY%20%3D%201000%20%2F%2015%3B%0A%0A%20%20const%20RAINBOW_TIME_PER%20%3D%201000%3B%0A%20%20const%20DEFAULT_RAINBOW_DURATION%20%3D%202000%3B%0A%0A%20%20const%20DEFAULT_ZOOM_DURATION%20%3D%20500%3B%0A%0A%20%20let%20globalFrameTime%20%3D%200%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40typedef%20TextState%0A%20%20%20*%20%40property%20%7BTextCostumeSkin%7D%20skin%0A%20%20%20*%2F%0A%0A%20%20%2F%2F%20temporary%0A%20%20if%20(!renderer.exports%20%7C%7C%20!renderer.exports.Skin%20%7C%7C%20!vm.exports)%20%7B%0A%20%20%20%20alert(%22VM%20is%20too%20old%20for%20animated%20text%20extension%22)%3B%0A%20%20%20%20throw%20new%20Error(%22VM%20is%20too%20old%22)%3B%0A%20%20%7D%0A%0A%20%20const%20Skin%20%3D%20renderer.exports.Skin%3B%0A%20%20const%20CanvasMeasurementProvider%20%3D%20renderer.exports.CanvasMeasurementProvider%3B%0A%20%20const%20twgl%20%3D%20renderer.exports.twgl%3B%0A%20%20const%20RenderedTarget%20%3D%20vm.exports.RenderedTarget%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7Bnumber%7D%20c%0A%20%20%20*%20%40returns%20%7Bstring%7D%0A%20%20%20*%2F%0A%20%20const%20formatComponent%20%3D%20(c)%20%3D%3E%20Math.round(c).toString(16).padStart(2%2C%20%220%22)%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7B%5Bnumber%2C%20number%2C%20number%5D%7D%20color%0A%20%20%20*%20%40returns%20%7Bstring%7D%0A%20%20%20*%2F%0A%20%20const%20formatColor%20%3D%20(color)%20%3D%3E%0A%20%20%20%20%60%23%24%7BformatComponent(color%5B0%5D)%7D%24%7BformatComponent(color%5B1%5D)%7D%24%7BformatComponent(%0A%20%20%20%20%20%20color%5B2%5D%0A%20%20%20%20)%7D%60%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7Bnumber%7D%20h%20hue%20from%200-1%0A%20%20%20*%20%40param%20%7Bnumber%7D%20s%20saturation%20from%200-1%0A%20%20%20*%20%40param%20%7Bnumber%7D%20v%20value%20from%200-1%0A%20%20%20*%20%40returns%20%7B%5Bnumber%2C%20number%2C%20number%5D%7D%20RGB%20channels%20from%200-255%0A%20%20%20*%2F%0A%20%20const%20hsvToRGB%20%3D%20(h%2C%20s%2C%20v)%20%3D%3E%20%7B%0A%20%20%20%20%2F%2F%20https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FHSL_and_HSV%0A%20%20%20%20var%20r%2C%20g%2C%20b%3B%0A%20%20%20%20var%20i%20%3D%20Math.floor(h%20*%206)%3B%0A%20%20%20%20var%20f%20%3D%20h%20*%206%20-%20i%3B%0A%20%20%20%20var%20p%20%3D%20v%20*%20(1%20-%20s)%3B%0A%20%20%20%20var%20q%20%3D%20v%20*%20(1%20-%20f%20*%20s)%3B%0A%20%20%20%20var%20t%20%3D%20v%20*%20(1%20-%20(1%20-%20f)%20*%20s)%3B%0A%20%20%20%20switch%20(i%20%25%206)%20%7B%0A%20%20%20%20%20%20case%200%3A%0A%20%20%20%20%20%20%20%20(r%20%3D%20v)%2C%20(g%20%3D%20t)%2C%20(b%20%3D%20p)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%201%3A%0A%20%20%20%20%20%20%20%20(r%20%3D%20q)%2C%20(g%20%3D%20v)%2C%20(b%20%3D%20p)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%202%3A%0A%20%20%20%20%20%20%20%20(r%20%3D%20p)%2C%20(g%20%3D%20v)%2C%20(b%20%3D%20t)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%203%3A%0A%20%20%20%20%20%20%20%20(r%20%3D%20p)%2C%20(g%20%3D%20q)%2C%20(b%20%3D%20v)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%204%3A%0A%20%20%20%20%20%20%20%20(r%20%3D%20t)%2C%20(g%20%3D%20p)%2C%20(b%20%3D%20v)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%205%3A%0A%20%20%20%20%20%20%20%20(r%20%3D%20v)%2C%20(g%20%3D%20p)%2C%20(b%20%3D%20q)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%5B(r%20*%20255)%20%7C%200%2C%20(g%20*%20255)%20%7C%200%2C%20(b%20*%20255)%20%7C%200%5D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7BCanvasGradient%7D%20gradient%0A%20%20%20*%20%40param%20%7Bnumber%7D%20offset%20number%20of%20cycles%20to%20offset%20by%0A%20%20%20*%2F%0A%20%20const%20addRainbowStops%20%3D%20(gradient%2C%20offset)%20%3D%3E%20%7B%0A%20%20%20%20const%20NUMBER_STOPS%20%3D%2020%3B%0A%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20NUMBER_STOPS%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20const%20exactPosition%20%3D%20i%20%2F%20NUMBER_STOPS%3B%0A%20%20%20%20%20%20let%20offsetPosition%20%3D%20(exactPosition%20-%20offset)%20%25%201%3B%0A%20%20%20%20%20%20if%20(offsetPosition%20%3C%200)%20%7B%0A%20%20%20%20%20%20%20%20offsetPosition%20%2B%3D%201%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20rgb%20%3D%20hsvToRGB(offsetPosition%2C%201%2C%201)%3B%0A%20%20%20%20%20%20gradient.addColorStop(exactPosition%2C%20formatColor(rgb))%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20class%20TextCostumeSkin%20extends%20Skin%20%7B%0A%20%20%20%20constructor(id%2C%20drawable)%20%7B%0A%20%20%20%20%20%20super(id%2C%20renderer)%3B%0A%0A%20%20%20%20%20%20%2F**%20%40type%20%7BRenderWebGL.Drawable%7D%20*%2F%0A%20%20%20%20%20%20this.drawable%20%3D%20drawable%3B%0A%20%20%20%20%20%20%2F**%20%40type%20%7Bnumber%7D%20*%2F%0A%20%20%20%20%20%20this._previousDrawableXScale%20%3D%20100%3B%0A%0A%20%20%20%20%20%20this.canvas%20%3D%20document.createElement(%22canvas%22)%3B%0A%20%20%20%20%20%20this.canvas.width%20%3D%200%3B%0A%20%20%20%20%20%20this.canvas.height%20%3D%200%3B%0A%20%20%20%20%20%20this.ctx%20%3D%20this.canvas.getContext(%222d%22)%3B%0A%0A%20%20%20%20%20%20this.text%20%3D%20%22%22%3B%0A%20%20%20%20%20%20this.color%20%3D%20DEFAULT_COLOR%3B%0A%20%20%20%20%20%20this.textWidth%20%3D%20DEFAULT_WIDTH%3B%0A%20%20%20%20%20%20this.fontFamily%20%3D%20DEFAULT_FONT%3B%0A%20%20%20%20%20%20this.baseFontSize%20%3D%20DEFAULT_FONT_SIZE%3B%0A%20%20%20%20%20%20this.align%20%3D%20DEFAULT_ALIGN%3B%0A%0A%20%20%20%20%20%20%2F**%20%40type%20%7BArray%3C%7Btext%3A%20string%3B%20width%3A%20number%3B%7D%3E%7D%20*%2F%0A%20%20%20%20%20%20this.lines%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%2F**%20%40type%20%7B%5Bnumber%2C%20number%5D%7D%20*%2F%0A%20%20%20%20%20%20this._size%20%3D%20%5B0%2C%200%5D%3B%0A%20%20%20%20%20%20%2F**%20%40type%20%7B%5Bnumber%2C%20number%5D%7D%20*%2F%0A%20%20%20%20%20%20this._rotationCenter%20%3D%20%5B0%2C%200%5D%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Updated%20in%20_updateFontDimensions%0A%20%20%20%20%20%20this.calculatedFontSize%20%3D%200%3B%0A%20%20%20%20%20%20this.lineHeight%20%3D%200%3B%0A%20%20%20%20%20%20this.verticalPadding%20%3D%200%3B%0A%20%20%20%20%20%20this.wrapWidth%20%3D%200%3B%0A%0A%20%20%20%20%20%20this._textDirty%20%3D%20false%3B%0A%20%20%20%20%20%20this._textureDirty%20%3D%20false%3B%0A%20%20%20%20%20%20this._renderedAtScale%20%3D%201%3B%0A%20%20%20%20%20%20this._renderTime%20%3D%200%3B%0A%20%20%20%20%20%20this._reflowTime%20%3D%200%3B%0A%0A%20%20%20%20%20%20this.isTyping%20%3D%20false%3B%0A%20%20%20%20%20%20this.typeAnimationInterval%20%3D%20null%3B%0A%20%20%20%20%20%20this.typeDelay%20%3D%20DEFAULT_TYPE_DELAY%3B%0A%0A%20%20%20%20%20%20this.isRainbow%20%3D%20false%3B%0A%20%20%20%20%20%20this.rainbowStartTime%20%3D%200%3B%0A%20%20%20%20%20%20this.rainbowTimeout%20%3D%20null%3B%0A%20%20%20%20%20%20this.rainbowDuration%20%3D%20DEFAULT_RAINBOW_DURATION%3B%0A%0A%20%20%20%20%20%20this.isZooming%20%3D%20false%3B%0A%20%20%20%20%20%20this.zoomStartTime%20%3D%200%3B%0A%20%20%20%20%20%20this.zoomTimeout%20%3D%20null%3B%0A%20%20%20%20%20%20this.zoomDuration%20%3D%20DEFAULT_ZOOM_DURATION%3B%0A%0A%20%20%20%20%20%20%2F**%20%40type%20%7B(()%20%3D%3E%20void)%7Cnull%7D%20*%2F%0A%20%20%20%20%20%20this.resolveOngoingAnimation%20%3D%20null%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Part%20of%20Skin%20API%0A%20%20%20%20dispose()%20%7B%0A%20%20%20%20%20%20if%20(this._texture)%20%7B%0A%20%20%20%20%20%20%20%20gl.deleteTexture(this._texture)%3B%0A%20%20%20%20%20%20%20%20this._texture%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this.canvas%20%3D%20null%3B%0A%20%20%20%20%20%20this.ctx%20%3D%20null%3B%0A%20%20%20%20%20%20super.dispose()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Part%20of%20Skin%20API%0A%20%20%20%20get%20size()%20%7B%0A%20%20%20%20%20%20if%20(this._needsReflow())%20%7B%0A%20%20%20%20%20%20%20%20this._reflowText()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20this._size%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Part%20of%20Skin%20API%0A%20%20%20%20useNearest()%20%7B%0A%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_needsReflow()%20%7B%0A%20%20%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20this._textDirty%20%7C%7C%0A%20%20%20%20%20%20%20%20(this.isZooming%20%26%26%20this._reflowTime%20!%3D%3D%20globalFrameTime)%20%7C%7C%0A%20%20%20%20%20%20%20%20this._previousDrawableXScale%20!%3D%3D%20Math.abs(this.drawable.scale%5B0%5D)%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_updateFontDimensions()%20%7B%0A%20%20%20%20%20%20this.calculatedFontSize%20%3D%20this.baseFontSize%3B%0A%20%20%20%20%20%20if%20(this.isZooming)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20TODO%3A%20it%20looks%20like%20Scratch's%20animation%20always%20starts%20at%20least%20a%20little%20visible%0A%20%20%20%20%20%20%20%20const%20time%20%3D%20globalFrameTime%20-%20this.zoomStartTime%3B%0A%20%20%20%20%20%20%20%20const%20progress%20%3D%20Math.max(0%2C%20Math.min(1%2C%20time%20%2F%20this.zoomDuration))%3B%0A%20%20%20%20%20%20%20%20this.calculatedFontSize%20*%3D%20progress%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this.lineHeight%20%3D%20(this.baseFontSize%20*%208)%20%2F%207%3B%0A%20%20%20%20%20%20%2F%2F%20Always%20use%20the%20base%20size%20for%20padding.%20This%20makes%20the%20zoom%20animation%20look%20better.%0A%20%20%20%20%20%20this.verticalPadding%20%3D%20this.baseFontSize%20%2F%207%3B%0A%20%20%20%20%20%20%2F%2F%20Only%20use%20horizontal%20scale%20for%20wrap%20width%20for%20compatibility%20with%20stretch%20extension.%0A%20%20%20%20%20%20this.wrapWidth%20%3D%0A%20%20%20%20%20%20%20%20this.textWidth%20%2F%20(Math.abs(this.drawable.scale%5B0%5D)%20%2F%20100)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_getFontStyle()%20%7B%0A%20%20%20%20%20%20return%20%60%24%7Bthis.calculatedFontSize%7Dpx%20%24%7Bthis.fontFamily%7D%2C%20sans-serif%60%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_reflowText()%20%7B%0A%20%20%20%20%20%20this._textDirty%20%3D%20false%3B%0A%20%20%20%20%20%20this._textureDirty%20%3D%20true%3B%0A%20%20%20%20%20%20this._reflowTime%20%3D%20globalFrameTime%3B%0A%20%20%20%20%20%20this._previousDrawableXScale%20%3D%20Math.abs(this.drawable.scale%5B0%5D)%3B%0A%0A%20%20%20%20%20%20this._updateFontDimensions()%3B%0A%20%20%20%20%20%20this.ctx.font%20%3D%20this._getFontStyle()%3B%0A%0A%20%20%20%20%20%20%2F%2F%20need%20to%20make%20new%20ones%20each%20time%20to%20avoid%20caching%20incorrectly%20across%20fonts%0A%20%20%20%20%20%20const%20measurementProvider%20%3D%20new%20CanvasMeasurementProvider(this.ctx)%3B%0A%20%20%20%20%20%20%2F**%20%40type%20%7BRenderWebGL.TextWrapper%7D%20*%2F%0A%20%20%20%20%20%20const%20textWrapper%20%3D%20renderer.createTextWrapper(measurementProvider)%3B%0A%0A%20%20%20%20%20%20const%20lines%20%3D%20textWrapper.wrapText(this.wrapWidth%2C%20this.text)%3B%0A%20%20%20%20%20%20this.lines%20%3D%20lines.map((line)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20const%20trimmed%20%3D%20line.trimEnd()%3B%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20text%3A%20trimmed%2C%0A%20%20%20%20%20%20%20%20%20%20width%3A%20measurementProvider.measureText(trimmed)%2C%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20this._size%5B0%5D%20%3D%20this.wrapWidth%3B%0A%20%20%20%20%20%20this._size%5B1%5D%20%3D%0A%20%20%20%20%20%20%20%20this.lines.length%20*%20this.lineHeight%20%2B%202%20*%20this.verticalPadding%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Centered%20horizontally%0A%20%20%20%20%20%20this._rotationCenter%5B0%5D%20%3D%20this._size%5B0%5D%20%2F%202%3B%0A%20%20%20%20%20%20%2F%2F%20Vertical%20center%20is%20roughly%20below%20the%20first%20line%20of%20text%0A%20%20%20%20%20%20this._rotationCenter%5B1%5D%20%3D%0A%20%20%20%20%20%20%20%20this.calculatedFontSize%20*%200.9%20%2B%20this.verticalPadding%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_renderAtScale(requestedScale)%20%7B%0A%20%20%20%20%20%20this._renderedAtScale%20%3D%20requestedScale%3B%0A%20%20%20%20%20%20this._textureDirty%20%3D%20false%3B%0A%20%20%20%20%20%20this._renderTime%20%3D%20globalFrameTime%3B%0A%0A%20%20%20%20%20%20const%20scratchWidth%20%3D%20this._size%5B0%5D%3B%0A%20%20%20%20%20%20const%20scratchHeight%20%3D%20this._size%5B1%5D%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Renderer's%20requested%20scale%20is%20accounted%20for%20at%20this%20point.%20Do%20not%20touch%20%60requestedScale%60%0A%20%20%20%20%20%20%2F%2F%20ever%20after%20this%20point.%0A%20%20%20%20%20%20this.canvas.width%20%3D%20Math.ceil(scratchWidth%20*%20requestedScale)%3B%0A%20%20%20%20%20%20this.canvas.height%20%3D%20Math.ceil(scratchHeight%20*%20requestedScale)%3B%0A%20%20%20%20%20%20this.ctx.scale(requestedScale%2C%20requestedScale)%3B%0A%0A%20%20%20%20%20%20const%20rainbowOffset%20%3D%20this.isRainbow%0A%20%20%20%20%20%20%20%20%3F%20(globalFrameTime%20-%20this.rainbowStartTime)%20%2F%20RAINBOW_TIME_PER%0A%20%20%20%20%20%20%20%20%3A%200%3B%0A%20%20%20%20%20%20this.ctx.fillStyle%20%3D%20this.color%3B%0A%20%20%20%20%20%20this.ctx.font%20%3D%20this._getFontStyle()%3B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20this.lines.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20const%20line%20%3D%20this.lines%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20const%20text%20%3D%20line.text%3B%0A%20%20%20%20%20%20%20%20const%20lineWidth%20%3D%20line.width%3B%0A%0A%20%20%20%20%20%20%20%20let%20xOffset%20%3D%200%3B%0A%20%20%20%20%20%20%20%20if%20(this.align%20%3D%3D%3D%20ALIGN_LEFT)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20already%20correct%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(this.align%20%3D%3D%3D%20ALIGN_CENTER)%20%7B%0A%20%20%20%20%20%20%20%20%20%20xOffset%20%3D%20(this.wrapWidth%20-%20lineWidth)%20%2F%202%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20xOffset%20%3D%20this.wrapWidth%20-%20lineWidth%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20(this.isRainbow)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20gradient%20%3D%20this.ctx.createLinearGradient(%0A%20%20%20%20%20%20%20%20%20%20%20%20xOffset%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20xOffset%20%2B%20lineWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200%0A%20%20%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%20%20%20%20addRainbowStops(gradient%2C%20rainbowOffset)%3B%0A%20%20%20%20%20%20%20%20%20%20this.ctx.fillStyle%20%3D%20gradient%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20TODO%3A%20something%20here%20is%20wrong%0A%20%20%20%20%20%20%20%20this.ctx.fillText(%0A%20%20%20%20%20%20%20%20%20%20text%2C%0A%20%20%20%20%20%20%20%20%20%20xOffset%2C%0A%20%20%20%20%20%20%20%20%20%20this.verticalPadding%20%2B%20i%20*%20this.lineHeight%20%2B%20this.baseFontSize%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(!this._texture)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%20-%20twgl%20not%20typed%20yet%0A%20%20%20%20%20%20%20%20this._texture%20%3D%20twgl.createTexture(gl%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20auto%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20wrap%3A%20gl.CLAMP_TO_EDGE%2C%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this._setTexture(this.canvas)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_invalidateTexture()%20%7B%0A%20%20%20%20%20%20this._textureDirty%20%3D%20true%3B%0A%20%20%20%20%20%20this._renderTime%20%3D%200%3B%0A%20%20%20%20%20%20this.emitWasAltered()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_invalidateText()%20%7B%0A%20%20%20%20%20%20this._textDirty%20%3D%20true%3B%0A%20%20%20%20%20%20this._textureDirty%20%3D%20true%3B%0A%20%20%20%20%20%20this._reflowTime%20%3D%200%3B%0A%20%20%20%20%20%20this.emitWasAltered()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setText(text)%20%7B%0A%20%20%20%20%20%20if%20(text%20!%3D%3D%20this.text)%20%7B%0A%20%20%20%20%20%20%20%20this.text%20%3D%20text%3B%0A%20%20%20%20%20%20%20%20this._invalidateText()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setColor(color)%20%7B%0A%20%20%20%20%20%20if%20(color%20!%3D%3D%20this.color)%20%7B%0A%20%20%20%20%20%20%20%20this.color%20%3D%20color%3B%0A%20%20%20%20%20%20%20%20this._invalidateTexture()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setAlign(align)%20%7B%0A%20%20%20%20%20%20if%20(align%20!%3D%3D%20this.align)%20%7B%0A%20%20%20%20%20%20%20%20this.align%20%3D%20align%3B%0A%20%20%20%20%20%20%20%20this._invalidateTexture()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setWidth(width)%20%7B%0A%20%20%20%20%20%20if%20(width%20!%3D%3D%20this.textWidth)%20%7B%0A%20%20%20%20%20%20%20%20this.textWidth%20%3D%20width%3B%0A%20%20%20%20%20%20%20%20this._invalidateText()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setFontFamily(font)%20%7B%0A%20%20%20%20%20%20if%20(font%20!%3D%3D%20this.fontFamily)%20%7B%0A%20%20%20%20%20%20%20%20this.fontFamily%20%3D%20font%3B%0A%20%20%20%20%20%20%20%20this._invalidateText()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20getFontFamily()%20%7B%0A%20%20%20%20%20%20return%20this.fontFamily%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getColor()%20%7B%0A%20%20%20%20%20%20return%20this.color%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getWidth()%20%7B%0A%20%20%20%20%20%20return%20this.textWidth%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getAlign()%20%7B%0A%20%20%20%20%20%20return%20this.align%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_oneAnimationAtATime(newCallback)%20%7B%0A%20%20%20%20%20%20this.cancelAnimation()%3B%0A%20%20%20%20%20%20return%20new%20Promise((resolve)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.resolveOngoingAnimation%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.resolveOngoingAnimation%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20newCallback(this.resolveOngoingAnimation)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20startTypeAnimation()%20%7B%0A%20%20%20%20%20%20return%20this._oneAnimationAtATime((resolve)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.isTyping%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20const%20originalText%20%3D%20this.text%3B%0A%20%20%20%20%20%20%20%20let%20i%20%3D%201%3B%0A%20%20%20%20%20%20%20%20const%20update%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.setText(originalText.substring(0%2C%20i))%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20update()%3B%0A%0A%20%20%20%20%20%20%20%20this.typeAnimationInterval%20%3D%20setInterval(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20i%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20update()%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(i%20%3E%3D%20originalText.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20clearInterval(this.typeAnimationInterval)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.isTyping%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%20this.typeDelay)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setTypeDelay(delay)%20%7B%0A%20%20%20%20%20%20this.typeDelay%20%3D%20delay%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20startRainbowAnimation()%20%7B%0A%20%20%20%20%20%20return%20this._oneAnimationAtATime((resolve)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.isRainbow%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20this.rainbowStartTime%20%3D%20Date.now()%3B%0A%20%20%20%20%20%20%20%20this._invalidateTexture()%3B%0A%20%20%20%20%20%20%20%20this.rainbowTimeout%20%3D%20setTimeout(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.isRainbow%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%20%20%20%20%20%20this._invalidateTexture()%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20this.rainbowDuration)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setRainbowDuration(duration)%20%7B%0A%20%20%20%20%20%20this.rainbowDuration%20%3D%20duration%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20startZoomAnimation()%20%7B%0A%20%20%20%20%20%20return%20this._oneAnimationAtATime((resolve)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.isZooming%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20this.zoomStartTime%20%3D%20Date.now()%3B%0A%20%20%20%20%20%20%20%20this._invalidateText()%3B%0A%20%20%20%20%20%20%20%20this.zoomTimeout%20%3D%20setTimeout(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.isZooming%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%20%20%20%20%20%20this._invalidateText()%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20this.zoomDuration)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setZoomDuration(duration)%20%7B%0A%20%20%20%20%20%20this.zoomDuration%20%3D%20duration%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20cancelAnimation()%20%7B%0A%20%20%20%20%20%20if%20(this.resolveOngoingAnimation)%20%7B%0A%20%20%20%20%20%20%20%20this.resolveOngoingAnimation()%3B%0A%20%20%20%20%20%20%20%20this.resolveOngoingAnimation%20%3D%20null%3B%0A%0A%20%20%20%20%20%20%20%20this.isTyping%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20clearInterval(this.typeAnimationInterval)%3B%0A%0A%20%20%20%20%20%20%20%20this.isRainbow%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20clearTimeout(this.rainbowTimeout)%3B%0A%0A%20%20%20%20%20%20%20%20this.isZooming%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20clearTimeout(this.zoomTimeout)%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20TODO%3A%20sometimes%20we%20only%20need%20to%20invalidate%20the%20texture%20at%20this%20point%0A%20%20%20%20%20%20%20%20this._invalidateText()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Part%20of%20Skin%20API%0A%20%20%20%20updateSilhouette(scale)%20%7B%0A%20%20%20%20%20%20this.getTexture(scale)%3B%0A%20%20%20%20%20%20this._silhouette.unlazy()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Part%20of%20Skin%20API%0A%20%20%20%20getTexture(scale)%20%7B%0A%20%20%20%20%20%20const%20MAX_SCALE%20%3D%2010%3B%0A%20%20%20%20%20%20const%20upperScale%20%3D%20scale%0A%20%20%20%20%20%20%20%20%3F%20Math.max(Math.abs(scale%5B0%5D)%2C%20Math.abs(scale%5B1%5D))%0A%20%20%20%20%20%20%20%20%3A%20100%3B%0A%20%20%20%20%20%20const%20calculatedScale%20%3D%20Math.min(MAX_SCALE%2C%20upperScale%20%2F%20100)%3B%0A%0A%20%20%20%20%20%20if%20(this._needsReflow())%20%7B%0A%20%20%20%20%20%20%20%20this._reflowText()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20this._textureDirty%20%7C%7C%0A%20%20%20%20%20%20%20%20(this.isRainbow%20%26%26%20this._renderTime%20!%3D%3D%20globalFrameTime)%20%7C%7C%0A%20%20%20%20%20%20%20%20calculatedScale%20!%3D%3D%20this._renderedAtScale%0A%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20this._renderAtScale(calculatedScale)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20this._texture%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F**%0A%20%20%20*%20Note%20that%20the%20returned%20skin%20is%20only%20usable%20by%20the%20given%20target.%20Things%20will%20break%20if%20another%0A%20%20%20*%20target%20tries%20to%20use%20it.%0A%20%20%20*%20%40param%20%7BVM.Target%7D%20target%0A%20%20%20*%20%40returns%20%7BTextCostumeSkin%7D%0A%20%20%20*%2F%0A%20%20const%20createTextCostumeSkin%20%3D%20(target)%20%3D%3E%20%7B%0A%20%20%20%20const%20drawable%20%3D%20renderer._allDrawables%5Btarget.drawableID%5D%3B%0A%20%20%20%20const%20id%20%3D%20renderer._nextSkinId%2B%2B%3B%0A%20%20%20%20const%20skin%20%3D%20new%20TextCostumeSkin(id%2C%20drawable)%3B%0A%20%20%20%20renderer._allSkins%5Bid%5D%20%3D%20skin%3B%0A%20%20%20%20return%20skin%3B%0A%20%20%7D%3B%0A%0A%20%20vm.runtime.on(%22BEFORE_EXECUTE%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20globalFrameTime%20%3D%20Date.now()%3B%0A%0A%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20renderer._allSkins.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20const%20skin%20%3D%20renderer._allSkins%5Bi%5D%3B%0A%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20skin%20instanceof%20TextCostumeSkin%20%26%26%0A%20%20%20%20%20%20%20%20(skin.isRainbow%20%7C%7C%20skin.isZooming)%0A%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20skin.emitWasAltered()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D)%3B%0A%0A%20%20class%20AnimatedText%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20vm.runtime.on(%22PROJECT_START%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this._hideAllText()%3B%0A%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20vm.runtime.on(%22PROJECT_STOP_ALL%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this._hideAllText()%3B%0A%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%2F%2F%20targetWasCreated%20does%20not%20work%20because%20it%20runs%20before%20the%20Drawable%20is%20set%20up%0A%20%20%20%20%20%20const%20extension%20%3D%20this%3B%0A%20%20%20%20%20%20const%20originalMakeClone%20%3D%20RenderedTarget.prototype.makeClone%3B%0A%20%20%20%20%20%20RenderedTarget.prototype.makeClone%20%3D%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20const%20newClone%20%3D%20originalMakeClone.call(this)%3B%0A%20%20%20%20%20%20%20%20if%20(extension._hasState(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20TODO%3A%20creates%20much%20unneeded%20state%0A%20%20%20%20%20%20%20%20%20%20const%20originalSkin%20%3D%20extension._getState(this).skin%3B%0A%20%20%20%20%20%20%20%20%20%20const%20newSkin%20%3D%20extension._getState(newClone).skin%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setAlign(originalSkin.align)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setColor(originalSkin.color)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setFontFamily(originalSkin.fontFamily)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setWidth(originalSkin.textWidth)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setText(originalSkin.text)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setRainbowDuration(originalSkin.rainbowDuration)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setZoomDuration(originalSkin.zoomDuration)%3B%0A%20%20%20%20%20%20%20%20%20%20newSkin.setTypeDelay(originalSkin.typeDelay)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20renderer._allDrawables%5Bthis.drawableID%5D.skin%20instanceof%0A%20%20%20%20%20%20%20%20%20%20%20%20TextCostumeSkin%0A%20%20%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20renderer.updateDrawableSkinId(newClone.drawableID%2C%20newSkin.id)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20newClone%3B%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20vm.runtime.on(%22targetWasRemoved%22%2C%20(target)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(this._hasState(target))%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20state%20%3D%20this._getState(target)%3B%0A%20%20%20%20%20%20%20%20%20%20renderer.destroySkin(state.skin.id)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22text%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Animated%20Text%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%239966FF%22%2C%0A%20%20%20%20%20%20%20%20blockIconURI%3A%20blockIconURI%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setText%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22show%20text%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Welcome%20to%20my%20project!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22animateText%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BANIMATE%5D%20text%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ANIMATE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22animate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22rainbow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Here%20we%20go!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22clearText%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22show%20sprite%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFont%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20font%20to%20%5BFONT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20FONT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22font%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setColor%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20text%20color%20to%20%5BCOLOR%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.COLOR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setWidth%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20width%20to%20%5BWIDTH%5D%20aligned%20%5BALIGN%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WIDTH%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22200%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ALIGN%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22align%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%2F**%0A%20%20%20%20%20%20%20%20%20%20%20*%20Contributors%3A%0A%20%20%20%20%20%20%20%20%20%20%20*%20-%20LilyMakesThings%0A%20%20%20%20%20%20%20%20%20%20%20*%2F%0A%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20func%3A%20%22disableCompatibilityMode%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BUTTON%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Enable%20Non-Scratch%20Lab%20Features%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20!compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.LABEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Incompatible%20with%20Scratch%20Lab%3A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAlignment%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22align%20text%20to%20%5BALIGN%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ALIGN%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22twAlign%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20why%20is%20the%20other%20block%20called%20%22setWidth%22%20%3A(%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setWidthValue%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20width%20to%20%5BWIDTH%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WIDTH%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetWidth%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20text%20width%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22addLine%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22add%20line%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Hello!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getLines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%23%20of%20lines%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22startAnimate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22start%20%5BANIMATE%5D%20animation%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ANIMATE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22twAnimate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22rainbow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22animateUntilDone%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22animate%20%5BANIMATE%5D%20until%20done%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ANIMATE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22twAnimate%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22rainbow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isAnimating%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20animating%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAnimateDuration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BANIMATE%5D%20duration%20to%20%5BNUM%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ANIMATE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22twAnimateDuration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22rainbow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%203%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetAnimateDuration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20%5BANIMATE%5D%20duration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ANIMATE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22twAnimateDuration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22rainbow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getAnimateDuration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BANIMATE%5D%20duration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ANIMATE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22twAnimateDuration%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22rainbow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setTypeDelay%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20typing%20delay%20to%20%5BNUM%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200.1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetTypeDelay%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20typing%20delay%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getTypeDelay%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22typing%20delay%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22textActive%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20showing%20text%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getDisplayedText%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22displayed%20text%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getTextAttribute%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22text%20%5BATTRIBUTE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ATTRIBUTE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22attribute%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20compatibilityMode%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20These%20all%20need%20acceptReporters%3A%20false%20for%20parity%20with%20the%20Scratch%20Labs%20version.%0A%20%20%20%20%20%20%20%20%20%20animate%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22type%22%2C%20%22rainbow%22%2C%20%22zoom%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20font%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%22getFonts%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20align%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22left%22%2C%20%22center%22%2C%20%22right%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20attribute%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22font%22%2C%20%22color%22%2C%20%22width%22%2C%20%22alignment%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20TurboWarp%20menus%20(acceptReporters%3A%20true)%0A%20%20%20%20%20%20%20%20%20%20twAnimate%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22type%22%2C%20%22rainbow%22%2C%20%22zoom%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20twAnimateDuration%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22rainbow%22%2C%20%22zoom%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20twAlign%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22left%22%2C%20%22center%22%2C%20%22right%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getFonts()%20%7B%0A%20%20%20%20%20%20const%20customFonts%20%3D%20Scratch.vm.runtime.fontManager%0A%20%20%20%20%20%20%20%20%3F%20Scratch.vm.runtime.fontManager.getFonts().map((i)%20%3D%3E%20(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20i.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20i.family%2C%0A%20%20%20%20%20%20%20%20%20%20%7D))%0A%20%20%20%20%20%20%20%20%3A%20%5B%5D%3B%0A%0A%20%20%20%20%20%20return%20%5B%0A%20%20%20%20%20%20%20%20...FONTS%2C%0A%20%20%20%20%20%20%20%20...customFonts%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20text%3A%20%22random%20font%22%2C%0A%20%20%20%20%20%20%20%20%20%20value%3A%20%22Random%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7BVM.Target%7D%20target%0A%20%20%20%20%20*%20%40returns%20%7BTextState%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20_getState(target)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20target%5BCUSTOM_STATE_KEY%5D%3B%0A%20%20%20%20%20%20if%20(!state)%20%7B%0A%20%20%20%20%20%20%20%20%2F**%20%40type%20%7BTextState%7D%20*%2F%0A%20%20%20%20%20%20%20%20const%20newState%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20skin%3A%20createTextCostumeSkin(target)%2C%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20target%5BCUSTOM_STATE_KEY%5D%20%3D%20newState%3B%0A%20%20%20%20%20%20%20%20return%20newState%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20state%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7BVM.Target%7D%20target%0A%20%20%20%20%20*%20%40returns%20%7Bboolean%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20_hasState(target)%20%7B%0A%20%20%20%20%20%20return%20!!target%5BCUSTOM_STATE_KEY%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20_hideAllText()%20%7B%0A%20%20%20%20%20%20for%20(const%20target%20of%20vm.runtime.targets)%20%7B%0A%20%20%20%20%20%20%20%20if%20(this._hasState(target))%20%7B%0A%20%20%20%20%20%20%20%20%20%20this._hideText(target%2C%20this._getState(target))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7BVM.Target%7D%20target%0A%20%20%20%20%20*%20%40param%20%7BTextState%7D%20state%0A%20%20%20%20%20*%2F%0A%20%20%20%20_renderText(target%2C%20state)%20%7B%0A%20%20%20%20%20%20state.skin.cancelAnimation()%3B%0A%20%20%20%20%20%20renderer.updateDrawableSkinId(target.drawableID%2C%20state.skin.id)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7BVM.Target%7D%20target%0A%20%20%20%20%20*%20%40param%20%7BTextState%7D%20state%0A%20%20%20%20%20*%2F%0A%20%20%20%20_hideText(target%2C%20state)%20%7B%0A%20%20%20%20%20%20state.skin.cancelAnimation()%3B%0A%20%20%20%20%20%20target.setCostume(target.currentCostume)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setText(%7B%20TEXT%20%7D%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20this._renderText(util.target%2C%20state)%3B%0A%20%20%20%20%20%20state.skin.setText(Scratch.Cast.toString(TEXT))%3B%0A%20%20%20%20%20%20%2F%2F%20Scratch%20forces%201%20frame%20delay%20by%20returning%20promise.%20I%20think%20that's%20silly.%0A%20%20%20%20%20%20util.runtime.requestRedraw()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20animateText(%7B%20ANIMATE%2C%20TEXT%20%7D%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20this._renderText(util.target%2C%20state)%3B%0A%0A%20%20%20%20%20%20state.skin.setText(Scratch.Cast.toString(TEXT))%3B%0A%20%20%20%20%20%20state.skin.cancelAnimation()%3B%0A%0A%20%20%20%20%20%20if%20(ANIMATE%20%3D%3D%3D%20%22type%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.startTypeAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(ANIMATE%20%3D%3D%3D%20%22rainbow%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.startRainbowAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(ANIMATE%20%3D%3D%3D%20%22zoom%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.startZoomAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Scratch%20does%20nothing%20here%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20clearText(args%2C%20util)%20%7B%0A%20%20%20%20%20%20if%20(this._hasState(util.target))%20%7B%0A%20%20%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20%20%20this._hideText(util.target%2C%20state)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20Scratch%20forces%201%20frame%20delay%20by%20returning%20promise.%20I%20think%20that's%20silly.%0A%20%20%20%20%20%20util.runtime.requestRedraw()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setFont(%7B%20FONT%20%7D%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20if%20(FONT%20%3D%3D%3D%20%22Random%22)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Random%20font%20always%20switches%20to%20a%20new%20font%2C%20never%20the%20same%20one%0A%20%20%20%20%20%20%20%20const%20possibleFonts%20%3D%20FONTS.filter((i)%20%3D%3E%20i%20!%3D%3D%20state.skin.fontFamily)%3B%0A%20%20%20%20%20%20%20%20state.skin.setFontFamily(%0A%20%20%20%20%20%20%20%20%20%20possibleFonts%5BMath.floor(Math.random()%20*%20possibleFonts.length)%5D%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setFontFamily(Scratch.Cast.toString(FONT))%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setColor(%7B%20COLOR%20%7D%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.setColor(Scratch.Cast.toString(COLOR))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setWidth(%7B%20WIDTH%2C%20ALIGN%20%7D%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%0A%20%20%20%20%20%20if%20(ALIGN%20%3D%3D%3D%20%22center%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setAlign(ALIGN_CENTER)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(ALIGN%20%3D%3D%3D%20%22right%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setAlign(ALIGN_RIGHT)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Scratch%20treats%20unknown%20values%20as%20left%20alignment.%0A%20%20%20%20%20%20%20%20state.skin.setAlign(ALIGN_LEFT)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20state.skin.setWidth(Scratch.Cast.toNumber(WIDTH))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%20Extra%20blocks%2C%20not%20compatible%20with%20Scratch%3A%0A%20%20%20%20%20*%2F%0A%0A%20%20%20%20disableCompatibilityMode()%20%7B%0A%20%20%20%20%20%20let%20popup%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22This%20will%20enable%20new%20blocks%20and%20features%20that%20WILL%20NOT%20WORK%20in%20the%20offical%20Scratch%20Lab.%22%2C%0A%20%20%20%20%20%20%20%20%22Do%20you%20wish%20to%20continue%3F%22%2C%0A%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20if%20(confirm(popup.join(%22%5Cn%5Cn%22)))%20%7B%0A%20%20%20%20%20%20%20%20compatibilityMode%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20Scratch.vm.extensionManager.refreshBlocks()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setAlignment(args%2C%20util)%20%7B%0A%20%20%20%20%20%20%2F%2F%20see%20setWidth%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20if%20(args.ALIGN%20%3D%3D%3D%20%22center%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setAlign(ALIGN_CENTER)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(args.ALIGN%20%3D%3D%3D%20%22right%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setAlign(ALIGN_RIGHT)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setAlign(ALIGN_LEFT)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setWidthValue(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.setWidth(Scratch.Cast.toNumber(args.WIDTH))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetWidth(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.setWidth(DEFAULT_WIDTH)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20addLine(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20this._renderText(util.target%2C%20state)%3B%0A%0A%20%20%20%20%20%20const%20originalText%20%3D%20state.skin.text%3B%0A%20%20%20%20%20%20const%20addingText%20%3D%20Scratch.Cast.toString(args.TEXT)%3B%0A%20%20%20%20%20%20state.skin.setText(%0A%20%20%20%20%20%20%20%20originalText%20%3F%20%60%24%7BoriginalText%7D%5Cn%24%7BaddingText%7D%60%20%3A%20addingText%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20util.runtime.requestRedraw()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getLines(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20drawableID%20%3D%20util.target.drawableID%3B%0A%20%20%20%20%20%20const%20skin%20%3D%20renderer._allDrawables%5BdrawableID%5D.skin%3B%0A%20%20%20%20%20%20if%20(!(skin%20instanceof%20TextCostumeSkin))%20return%200%3B%0A%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20const%20text%20%3D%20state.skin.text%3B%0A%20%20%20%20%20%20return%20text.split(%22%5Cn%22).length%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20startAnimate(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20drawableID%20%3D%20util.target.drawableID%3B%0A%20%20%20%20%20%20const%20skin%20%3D%20renderer._allDrawables%5BdrawableID%5D.skin%3B%0A%20%20%20%20%20%20if%20(!(skin%20instanceof%20TextCostumeSkin))%20return%3B%0A%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.cancelAnimation()%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Don't%20return%20the%20promise%0A%20%20%20%20%20%20if%20(args.ANIMATE%20%3D%3D%3D%20%22type%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.startTypeAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(args.ANIMATE%20%3D%3D%3D%20%22rainbow%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.startRainbowAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(args.ANIMATE%20%3D%3D%3D%20%22zoom%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.startZoomAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Scratch%20does%20nothing%20here%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20animateUntilDone(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20drawableID%20%3D%20util.target.drawableID%3B%0A%20%20%20%20%20%20const%20skin%20%3D%20renderer._allDrawables%5BdrawableID%5D.skin%3B%0A%20%20%20%20%20%20if%20(!(skin%20instanceof%20TextCostumeSkin))%20return%3B%0A%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.cancelAnimation()%3B%0A%0A%20%20%20%20%20%20if%20(args.ANIMATE%20%3D%3D%3D%20%22type%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.startTypeAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(args.ANIMATE%20%3D%3D%3D%20%22rainbow%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.startRainbowAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(args.ANIMATE%20%3D%3D%3D%20%22zoom%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.startZoomAnimation()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Scratch%20does%20nothing%20here%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20isAnimating(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20skin%20%3D%20this._getState(util.target).skin%3B%0A%20%20%20%20%20%20return%20skin.isTyping%20%7C%7C%20skin.isRainbow%20%7C%7C%20skin.isZooming%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setAnimateDuration(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20const%20animation%20%3D%20args.ANIMATE%3B%0A%20%20%20%20%20%20const%20milliseconds%20%3D%20Scratch.Cast.toNumber(args.NUM)%20*%201000%3B%0A%20%20%20%20%20%20if%20(animation%20%3D%3D%3D%20%22rainbow%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setRainbowDuration(milliseconds)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(animation%20%3D%3D%3D%20%22zoom%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setZoomDuration(milliseconds)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetAnimateDuration(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20const%20animation%20%3D%20args.ANIMATE%3B%0A%20%20%20%20%20%20if%20(animation%20%3D%3D%3D%20%22rainbow%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setRainbowDuration(DEFAULT_RAINBOW_DURATION)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(animation%20%3D%3D%3D%20%22zoom%22)%20%7B%0A%20%20%20%20%20%20%20%20state.skin.setZoomDuration(DEFAULT_ZOOM_DURATION)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20getAnimateDuration(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20const%20animation%20%3D%20args.ANIMATE%3B%0A%20%20%20%20%20%20if%20(animation%20%3D%3D%3D%20%22rainbow%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.rainbowDuration%20%2F%201000%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(animation%20%3D%3D%3D%20%22zoom%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.zoomDuration%20%2F%201000%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20should%20never%20happen%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setTypeDelay(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.setTypeDelay(Scratch.Cast.toNumber(args.NUM)%20*%201000)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetTypeDelay(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20state.skin.setTypeDelay(DEFAULT_TYPE_DELAY)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getTypeDelay(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20%2F%2F%20TODO%3A%20Should%20we%20round%20this%3F%0A%20%20%20%20%20%20return%20state.skin.typeDelay%20%2F%201000%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20textActive(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20drawableID%20%3D%20util.target.drawableID%3B%0A%20%20%20%20%20%20const%20skin%20%3D%20renderer._allDrawables%5BdrawableID%5D.skin%3B%0A%20%20%20%20%20%20return%20skin%20instanceof%20TextCostumeSkin%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getDisplayedText(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20return%20state.skin.text%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getTextAttribute(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20state%20%3D%20this._getState(util.target)%3B%0A%20%20%20%20%20%20const%20attrib%20%3D%20args.ATTRIBUTE%3B%0A%20%20%20%20%20%20if%20(attrib%20%3D%3D%3D%20%22font%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.getFontFamily()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(attrib%20%3D%3D%3D%20%22color%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.getColor()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(attrib%20%3D%3D%3D%20%22width%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20state.skin.getWidth()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(attrib%20%3D%3D%3D%20%22alignment%22)%20%7B%0A%20%20%20%20%20%20%20%20switch%20(state.skin.getAlign())%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20ALIGN_LEFT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22left%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20ALIGN_RIGHT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22right%22%3B%0A%20%20%20%20%20%20%20%20%20%20case%20ALIGN_CENTER%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22center%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20should%20never%20happen%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20AnimatedText())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B"]) {
vm.extensionManager.loadExtensionURL(extension);
}
@@ -377,7 +377,7 @@ scaffolding.addCloudProviderOverride("☁ Nachrichten", providers["ws"] || null)
}
-
+