-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
327 lines (303 loc) · 124 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
<!DOCTYPE html>
<!-- Created with https://studio.penguinmod.com/PenguinMod-Packager/ -->
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- We only include this to explicitly loosen the CSP of various packager environments. It does not provide any security. -->
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: blob:">
<title>YouTube+</title>
<style>
body {
color: #ffffff;
font-family: sans-serif;
overflow: hidden;
margin: 0;
padding: 0;
}
:root, body.is-fullscreen {
background-color: #000000;
}
[hidden] {
display: none !important;
}
h1 {
font-weight: normal;
}
a {
color: inherit;
text-decoration: underline;
cursor: pointer;
}
#app, #loading, #error, #launch {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.screen {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
cursor: default;
user-select: none;
-webkit-user-select: none;
background-color: #000000;
}
#launch {
background-color: rgba(0, 0, 0, 0.7);
cursor: pointer;
}
.green-flag {
width: 80px;
height: 80px;
padding: 16px;
border-radius: 100%;
background: rgba(255, 255, 255, 0.75);
border: 3px solid hsla(0, 100%, 100%, 1);
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
#loading {
}
.progress-bar-outer {
border: 1px solid currentColor;
height: 10px;
width: 200px;
max-width: 200px;
}
.progress-bar-inner {
height: 100%;
width: 0;
background-color: currentColor;
}
.loading-text, noscript {
font-weight: normal;
font-size: 36px;
margin: 0 0 16px;
}
.loading-image {
margin: 0 0 16px;
}
#error-message, #error-stack {
font-family: monospace;
max-width: 600px;
white-space: pre-wrap;
user-select: text;
-webkit-user-select: text;
}
#error-stack {
text-align: left;
max-height: 200px;
overflow: auto;
}
.control-button {
width: 2rem;
height: 2rem;
padding: 0.375rem;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
user-select: none;
-webkit-user-select: none;
cursor: pointer;
border: 0;
border-radius: 4px;
}
.control-button:hover {
background: #00c3ff26;
}
.control-button.active {
background: #00c3ff59;
}
.fullscreen-button {
background: white !important;
}
.standalone-fullscreen-button {
position: absolute;
top: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 0 0 0 4px;
padding: 4px;
cursor: pointer;
}
.sc-canvas {
cursor: auto;
}
.sc-monitor-root[data-opcode^="data_"] .sc-monitor-value-color {
background-color: #ff8c1a;
}
.sc-monitor-row-value-outer {
background-color: #fc662c;
}
.sc-monitor-row-value-editing .sc-monitor-row-value-outer {
background-color: #e25b27;
}
</style>
<meta name="theme-color" content="#000000">
<link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMC44MDk1NiIgaGVpZ2h0PSIyMC45NTk1NSIgdmlld0JveD0iMCwwLDIwLjgwOTU2LDIwLjk1OTU1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzA5LjU5NTIyLC0xNjkuNTIwMjIpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PHBhdGggZD0iTTMyMC43Nzc4NSwxNzUuNzcwMjNsLTEuMjMzNDQsOC40NTk1NSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmYwMDAwIiBzdHJva2Utd2lkdGg9IjEyLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjxwYXRoIGQ9Ik0zMTUuODQ1MjIsMTc5LjMyMDQ3bDguMzA5NTYsMS40MzY4OCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmYwMDAwIiBzdHJva2Utd2lkdGg9IjEyLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjxwYXRoIGQ9Ik0zMTcuNjkzODEsMTgzLjE0Nzc4di02Ljc2MTlsNS42NTAzNSwzLjUxOTg5YzAsMCAtMC4zNDA4NiwwLjE5NTU3IC0wLjY2NjAxLDAuMzgyMTRjLTAuODg5NSwwLjUxMDM3IC00Ljk4NDM1LDIuODU5ODcgLTQuOTg0MzUsMi44NTk4N3oiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIiBzdHJva2UtbGluZWNhcD0iYnV0dCIvPjwvZz48L2c+PC9zdmc+PCEtLXJvdGF0aW9uQ2VudGVyOjEwLjQwNDc3OTk5OTk5OTk2OjEwLjQ3OTc3NTAwMDAwMDAxOC0tPg==">
</head>
<body>
<div id="app"></div>
<div id="launch" class="screen" hidden title="Click to start">
<div class="green-flag">
<svg viewBox="0 0 16.63 17.5" width="42" height="44">
<defs><style>.cls-1,.cls-2{fill:#007AF4;stroke:#003080;stroke-linecap:round;stroke-linejoin:round;}.cls-2{stroke-width:1.5px;}</style></defs>
<path class="cls-1" d="M.75,2A6.44,6.44,0,0,1,8.44,2h0a6.44,6.44,0,0,0,7.69,0V12.4a6.44,6.44,0,0,1-7.69,0h0a6.44,6.44,0,0,0-7.69,0"/>
<line class="cls-2" x1="0.75" y1="16.75" x2="0.75" y2="0.75"/>
</svg>
</div>
</div>
<div id="loading" class="screen">
<noscript>Enable JavaScript</noscript>
</div>
<div id="error" class="screen" hidden>
<h1>Error</h1>
<details>
<summary id="error-message"></summary>
<p id="error-stack"></p>
</details>
</div>
<script src="script.js"></script>
<script>
const appElement = document.getElementById('app');
const launchScreen = document.getElementById('launch');
const loadingScreen = document.getElementById('loading');
const loadingInner = document.getElementById('loading-inner');
const errorScreen = document.getElementById('error');
const errorScreenMessage = document.getElementById('error-message');
const errorScreenStack = document.getElementById('error-stack');
const handleError = (error) => {
console.error(error);
if (!errorScreen.hidden) return;
errorScreen.hidden = false;
errorScreenMessage.textContent = '' + error;
let debug = error && error.stack || 'no stack';
debug += '\nUser agent: ' + navigator.userAgent;
errorScreenStack.textContent = debug;
};
const setProgress = (progress) => {
if (loadingInner) loadingInner.style.width = progress * 100 + '%';
};
const interpolate = (a, b, t) => a + t * (b - a);
try {
setProgress(0.1);
const scaffolding = new Scaffolding.Scaffolding();
scaffolding.width = 640;
scaffolding.height = 360;
scaffolding.resizeMode = "preserve-ratio";
scaffolding.editableLists = false;
scaffolding.usePackagedRuntime = true;
scaffolding.setup();
scaffolding.appendTo(appElement);
const vm = scaffolding.vm;
window.scaffolding = scaffolding;
window.vm = scaffolding.vm;
window.Scratch = {
vm,
renderer: vm.renderer,
audioEngine: vm.runtime.audioEngine,
bitmapAdapter: vm.runtime.v2BitmapAdapter,
videoProvider: vm.runtime.ioDevices.video.provider
};
scaffolding.setUsername("player####".replace(/#/g, () => Math.floor(Math.random() * 10)));
scaffolding.setAccentColor("#00c3ff");
try {
scaffolding.addCloudProvider(new Scaffolding.Cloud.WebSocketProvider(["wss://clouddata.turbowarp.org","wss://clouddata.turbowarp.xyz"], "p4-@YouTube+.pmp"));
} catch (error) {
console.error(error);
}
vm.setTurboMode(false);
if (vm.setInterpolation) vm.setInterpolation(false);
if (vm.setFramerate) vm.setFramerate(60);
if (vm.renderer.setUseHighQualityRender) vm.renderer.setUseHighQualityRender(false);
if (vm.setRuntimeOptions) vm.setRuntimeOptions({
fencing: true,
miscLimits: true,
maxClones: 300,
dangerousOptimizations: false
});
if (vm.setCompilerOptions) vm.setCompilerOptions({
enabled: true,
warpTimer: false
});
if (vm.renderer.setMaxTextureDimension) vm.renderer.setMaxTextureDimension(2048);
if (typeof ScaffoldingAddons !== 'undefined') {
ScaffoldingAddons.run(scaffolding, {"gamepad":false,"pointerlock":false,"specialCloudBehaviors":false,"unsafeCloudBehaviors":false,"pause":false});
}
scaffolding.setExtensionSecurityManager({
getSandboxMode: () => 'unsandboxed',
canLoadExtensionFromProject: () => true
});
for (const extension of ["data:application/javascript,class%20Extension%20%7B%0A%20%20getInfo()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20id%3A%20'arrayCounter'%2C%0A%20%20%20%20%20%20name%3A%20'Array%20Counter'%2C%0A%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'countItems'%2C%0A%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%20text%3A%20'number%20of%20items%20in%20array%20%5BARRAY%5D'%2C%0A%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%20ARRAY%3A%20%7B%0A%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%20defaultValue%3A%20'%5B%5D'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%5D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20countItems(args)%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20array%20%3D%20JSON.parse(args.ARRAY)%3B%0A%20%20%20%20%20%20if%20(Array.isArray(array))%20%7B%0A%20%20%20%20%20%20%20%20return%20array.length%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20'Not%20an%20array'%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20return%20'Invalid%20array'%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0AScratch.extensions.register(new%20Extension())%3B%0A","data:application/javascript,class%20ListsPlus%20%7B%0A%20%20getInfo()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20id%3A%20'listsPlus'%2C%0A%20%20%20%20%20%20name%3A%20'Lists%2B'%2C%0A%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'removeDuplicates'%2C%0A%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%20text%3A%20'remove%20duplicates%20from%20list%20%5BLIST%5D'%2C%0A%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%20LIST%3A%20%7B%0A%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%20defaultValue%3A%20'%5B%5D'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%5D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20removeDuplicates(args)%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20list%20%3D%20JSON.parse(args.LIST)%3B%0A%20%20%20%20%20%20if%20(Array.isArray(list))%20%7B%0A%20%20%20%20%20%20%20%20const%20uniqueList%20%3D%20%5B...new%20Set(list)%5D%3B%0A%20%20%20%20%20%20%20%20return%20JSON.stringify(uniqueList)%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20'Not%20a%20list'%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20return%20'Invalid%20list'%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0AScratch.extensions.register(new%20ListsPlus())%3B%0A","data:application/javascript,class%20NumberFlipper%20%7B%0A%20%20getInfo()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20id%3A%20'numberFlipper'%2C%0A%20%20%20%20%20%20name%3A%20'Number%20Flipper'%2C%0A%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'flipNumber'%2C%0A%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%20text%3A%20'flip%20number%20%5BNUMBER%5D'%2C%0A%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%20NUMBER%3A%20%7B%0A%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%20defaultValue%3A%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%5D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20flipNumber(args)%20%7B%0A%20%20%20%20const%20number%20%3D%20parseFloat(args.NUMBER)%3B%0A%20%20%20%20if%20(isNaN(number))%20%7B%0A%20%20%20%20%20%20return%20'Not%20a%20number'%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20-number%3B%0A%20%20%7D%0A%7D%0A%0AScratch.extensions.register(new%20NumberFlipper())%3B%0A","data:application/javascript,class%20RelativeTime%20%7B%0A%20%20getInfo()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20id%3A%20'relativeTime'%2C%0A%20%20%20%20%20%20name%3A%20'Relative%20Time'%2C%0A%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'timeAgo'%2C%0A%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%20text%3A%20'time%20ago%20from%20%5BDATE%5D'%2C%0A%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%20DATE%3A%20%7B%0A%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%20defaultValue%3A%20new%20Date().toISOString()%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%5D%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20timeAgo(args)%20%7B%0A%20%20%20%20const%20date%20%3D%20new%20Date(args.DATE)%3B%0A%20%20%20%20if%20(isNaN(date.getTime()))%20%7B%0A%20%20%20%20%20%20return%20'Invalid%20date'%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20now%20%3D%20new%20Date()%3B%0A%20%20%20%20const%20diffInSeconds%20%3D%20Math.floor((now%20-%20date)%20%2F%201000)%3B%0A%0A%20%20%20%20const%20intervals%20%3D%20%5B%0A%20%20%20%20%20%20%7B%20label%3A%20'year'%2C%20seconds%3A%2031536000%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20'month'%2C%20seconds%3A%202592000%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20'week'%2C%20seconds%3A%20604800%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20'day'%2C%20seconds%3A%2086400%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20'hour'%2C%20seconds%3A%203600%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20'minute'%2C%20seconds%3A%2060%20%7D%2C%0A%20%20%20%20%20%20%7B%20label%3A%20'second'%2C%20seconds%3A%201%20%7D%0A%20%20%20%20%5D%3B%0A%0A%20%20%20%20for%20(const%20interval%20of%20intervals)%20%7B%0A%20%20%20%20%20%20const%20count%20%3D%20Math.floor(diffInSeconds%20%2F%20interval.seconds)%3B%0A%20%20%20%20%20%20if%20(count%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20return%20%60%24%7Bcount%7D%20%24%7Binterval.label%7D%24%7Bcount%20!%3D%3D%201%20%3F%20's'%20%3A%20''%7D%20ago%60%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20'just%20now'%3B%0A%20%20%7D%0A%7D%0A%0AScratch.extensions.register(new%20RelativeTime())%3B%0A","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20YouTube%20Operations%0A%2F%2F%20ID%3A%20SPyoutubeoperations%0A%2F%2F%20Description%3A%20Fetch%20and%20play%20Youtube%20videos%20and%20statistics%20in%20your%20project.%0A%2F%2F%20By%3A%20SharkPool%20and%20Nekl300%0A%0A%2F%2F%20Version%20V.1.7.1%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22YouTube%20Operations%20must%20run%20unsandboxed%22)%3B%0A%0A%20%20const%20menuIconURI%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNDUuMzU3NjQiIGhlaWdodD0iMTQ1LjM1NzY0IiB2aWV3Qm94PSIwLDAsMTQ1LjM1NzY0LDE0NS4zNTc2NCI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Ny4zMjExOCwtMTA3LjMyMTE4KSI%2BPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS13aWR0aD0iMCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0xNjcuMzIxMTgsMTgwYzAsLTQwLjEzOTQgMzIuNTM5NDIsLTcyLjY3ODgyIDcyLjY3ODgyLC03Mi42Nzg4MmM0MC4xMzk0LDAgNzIuNjc4ODIsMzIuNTM5NDIgNzIuNjc4ODIsNzIuNjc4ODJjMCw0MC4xMzk0IC0zMi41Mzk0Miw3Mi42Nzg4MiAtNzIuNjc4ODIsNzIuNjc4ODJjLTQwLjEzOTQsMCAtNzIuNjc4ODIsLTMyLjUzOTQyIC03Mi42Nzg4MiwtNzIuNjc4ODJ6IiBmaWxsPSIjYzMwMDAwIiBzdHJva2U9IiMwMDAwMDAiLz48cGF0aCBkPSJNMTc2LjM2MTcyLDE4MGMwLC0zNS4xNDY0NSAyOC40OTE4MywtNjMuNjM4MjggNjMuNjM4MjgsLTYzLjYzODI4YzM1LjE0NjQ1LDAgNjMuNjM4MjgsMjguNDkxODMgNjMuNjM4MjgsNjMuNjM4MjhjMCwzNS4xNDY0NSAtMjguNDkxODMsNjMuNjM4MjggLTYzLjYzODI4LDYzLjYzODI4Yy0zNS4xNDY0NSwwIC02My42MzgyOCwtMjguNDkxODMgLTYzLjYzODI4LC02My42MzgyOHoiIGZpbGw9IiNmZjAwMDAiIHN0cm9rZT0iIzAwMDAwMCIvPjxwYXRoIGQ9Ik0yNjYuNzM1MTEsMTgzLjk2MjE3Yy0xMC41ODYzOCw1Ljg1OTA2IC0zMC4wOTk0NywxNi42NTg2MiAtMzYuMjg2NjksMjAuMDgyOTVjLTMuNjk0OTYsMi4wNDQ5OSAtNy45MTIxNiwxLjAzODY2IC03LjkxMjE2LC0zLjkxMjc4YzAsLTExLjc1NjkyIDAsLTMyLjU5NzE1IDAsLTM5LjM3MTAxYzAsLTQuMTg0MTYgMy41MjM3LC03LjA1Mzk2IDYuNzY5NywtNS4yNTc0NWM2LjAwNDI1LDMuMzIzMDcgMjYuNTAwMTUsMTQuNjY2NTcgMzcuNDI4ODksMjAuNzE1MTFjNC4yMDYzOCwyLjMyODAzIDQuMjAwNDYsNS40MTg1NiAwLjAwMDI1LDcuNzQzMTh6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiLz48L2c%2BPC9nPjwvc3ZnPg%3D%3D%22%3B%0A%0A%20%20const%20blockIconURI%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIzMy4yMDU3MyIgaGVpZ2h0PSIyNS4xOTYyMiIgdmlld0JveD0iMCwwLDMzLjIwNTczLDI1LjE5NjIyIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjIzLjM5NzE0LC0xNjcuNDAxODkpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTogbm9ybWFsIj48cGF0aCBkPSJNMjU2LjYwMjg3LDE4MGMwLDAgMCw1Ljg1NzYxIC0wLjY5NDMzLDguNjYzNDdjLTAuMzgyNjIsMS41NDk1NyAtMS41MDYxNywyLjc2NzMxIC0yLjkzNTc0LDMuMTgyMDNjLTIuNTg4NDUsMC43NTI2MSAtMTIuOTcyODUsMC43NTI2MSAtMTIuOTcyODUsMC43NTI2MWMwLDAgLTEwLjM4NDI1LDAgLTEyLjk3MjgyLC0wLjc1MjYxYy0xLjQyOTU3LC0wLjQxNDcyIC0yLjU1MzAyLC0xLjYzMjQ2IC0yLjkzNTcsLTMuMTgyMDNjLTAuNjk0MjksLTIuODA1ODUgLTAuNjk0MjksLTguNjYzNDcgLTAuNjk0MjksLTguNjYzNDdjMCwwIDAsLTUuODU3NTkgMC42OTQyOSwtOC42NjM0MmMwLjM4MjY4LC0xLjU0OTU4IDEuNTA2MTIsLTIuNzY3MzMgMi45MzU3LC0zLjE4MjEzYzIuNTg4NTYsLTAuNzUyNTYgMTIuOTcyODIsLTAuNzUyNTYgMTIuOTcyODIsLTAuNzUyNTZjMCwwIDEwLjM4NDQsMCAxMi45NzI4NSwwLjc1MjU2YzEuNDI5NTcsMC40MTQ4IDIuNTUzMTMsMS42MzI1NCAyLjkzNTc0LDMuMTgyMTNjMC42OTE1NCwyLjgwNTgyIDAuNjk0MzMsOC42NjM0MiAwLjY5NDMzLDguNjYzNDJ6IiBmaWxsPSIjZmZmZmZmIi8%2BPHBhdGggZD0iTTI1NC4yODUwNiwxODBjMCwwIDAsNC42NDk2IC0wLjU5NzQsNi44NzY4Yy0wLjMyOTIsMS4yMyAtMS4yOTU5LDIuMTk2NiAtMi41MjU5LDIuNTI1OGMtMi4yMjcxLDAuNTk3NCAtMTEuMTYxOCwwLjU5NzQgLTExLjE2MTgsMC41OTc0YzAsMCAtOC45MzQ1OCwwIC0xMS4xNjE3NywtMC41OTc0Yy0xLjIzLC0wLjMyOTIgLTIuMTk2NjEsLTEuMjk1OCAtMi41MjU4NiwtMi41MjU4Yy0wLjU5NzM3LC0yLjIyNzIgLTAuNTk3MzcsLTYuODc2OCAtMC41OTczNywtNi44NzY4YzAsMCAwLC00LjY0OTU4IDAuNTk3MzcsLTYuODc2NzZjMC4zMjkyNiwtMS4yMzAwMSAxLjI5NTg2LC0yLjE5NjYyIDIuNTI1ODYsLTIuNTI1ODdjMi4yMjcxOSwtMC41OTczNyAxMS4xNjE3NywtMC41OTczNyAxMS4xNjE3NywtMC41OTczN2MwLDAgOC45MzQ3LDAgMTEuMTYxOCwwLjU5NzM3YzEuMjMsMC4zMjkyNiAyLjE5NjcsMS4yOTU4NiAyLjUyNTksMi41MjU4N2MwLjU5NSwyLjIyNzE4IDAuNTk3NCw2Ljg3Njc2IDAuNTk3NCw2Ljg3Njc2eiIgZmlsbD0iI2ZmMDAwMCIvPjxwYXRoIGQ9Ik0yMzcuMTQwMjYsMTc1LjcxNTMzbDcuNDIyNCw0LjI4NTA3bC03LjQyMjQsNC4yODV6IiBmaWxsPSIjZmZmZmZmIi8%2BPC9nPjwvZz48L3N2Zz4%3D%22%3B%0A%0A%20%20let%20player%20%3D%20%22window%22%3B%0A%20%20%2F%2Flet%20playerOpts%20%3D%20%7B%20controls%3A%201%2C%20autoplay%3A%201%2C%20loop%3A%200%20%7D%20--%20Stopped%20Working%2C%20see%20L%3A378%0A%0A%20%20%2F%2F%20Modified%20From%20iFrame%20(Turbowarp%20--%20Garbomuffin)%0A%20%20let%20iframe%20%3D%20null%3B%0A%20%20const%20createFrame%20%3D%20(src%2C%20args)%20%3D%3E%20%7B%0A%20%20%20%20iframe%20%3D%20document.createElement(%22iframe%22)%3B%0A%20%20%20%20iframe.style.width%20%3D%20%60%24%7BScratch.Cast.toNumber(args.WIDTH)%7Dpx%60%3B%0A%20%20%20%20iframe.style.height%20%3D%20%60%24%7BScratch.Cast.toNumber(args.HEIGHT)%7Dpx%60%3B%0A%20%20%20%20iframe.style.border%20%3D%20%22none%22%3B%0A%20%20%20%20iframe.style.position%20%3D%20%22absolute%22%3B%0A%20%20%20%20iframe.style.transform%20%3D%0A%20%20%20%20%20%20%60translate(%24%7BScratch.Cast.toNumber(args.LEFT)%20-%2050%7D%25%2C%20%24%7BScratch.Cast.toNumber(args.TOP%20*%20-1)%20-%2050%7D%25)%60%3B%0A%20%20%20%20iframe.setAttribute(%22allowtransparency%22%2C%20%22true%22)%3B%0A%20%20%20%20iframe.setAttribute(%22src%22%2C%20src)%3B%0A%20%20%20%20iframe.style.pointerEvents%20%3D%20%22auto%22%3B%20%2F%2FplayerOpts.controls%20%3F%20%22auto%22%20%3A%20%22none%22%3B%0A%20%20%20%20Scratch.renderer.addOverlay(iframe%2C%20%22scale-centered%22)%3B%0A%20%20%7D%3B%0A%20%20const%20closeFrame%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20if%20(iframe)%20%7B%0A%20%20%20%20%20%20Scratch.renderer.removeOverlay(iframe)%3B%0A%20%20%20%20%20%20iframe%20%3D%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%20%20Scratch.vm.runtime.on(%22RUNTIME_DISPOSED%22%2C%20closeFrame)%3B%0A%20%20Scratch.vm.runtime.on(%22PROJECT_STOP_ALL%22%2C%20closeFrame)%3B%0A%0A%20%20class%20SPyoutubeoperations%20%7B%0A%20%20%20%20constructor()%20%7B%20this.youtubeWindows%20%3D%20%7B%7D%20%7D%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%22SPyoutubeoperations%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22YouTube%20Operations%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%2C%0A%20%20%20%20%20%20%20%20blockIconURI%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23FF0000%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23c10000%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23820000%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Videos%22%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%22extractVideoID%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%22extract%20video%20ID%20from%20%5BURL%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%20URL%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%2Fwww.youtube.com%2Fwatch%3Fv%3DdQw4w9WgXcQ%26pp%3DygUJcmljayByb2xs%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22fetchStats%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%22fetch%20%5BSTAT%5D%20count%20of%20video%20%5BVIDEO_ID%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%20STAT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22STAT_OPTIONS%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VIDEO_ID%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%22dQw4w9WgXcQ%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22fetchtitle%22%2C%20%2F%2Fmade%20with%20Nekl300%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%22fetch%20%5BSTAT%5D%20of%20video%20%5BVIDEO_ID%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%20STAT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22STAT_OPTION%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VIDEO_ID%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%22dQw4w9WgXcQ%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22vid2MP4%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%22video%20%5BVIDEO_ID%5D%20to%20mp4%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%20VIDEO_ID%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%22dQw4w9WgXcQ%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22getResults%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%20video%20results%20from%20search%20%5BQUERY%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%20QUERY%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%22SharkPool%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Users%22%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%22fetchUserThing%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%22fetch%20%5BTHING%5D%20from%20channel%20%5BURL%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%20URL%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%2Fwww.youtube.com%2F%40SharkPool_SP%22%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%20THING%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%22USER_STUFF%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Video%20Player%22%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%22setPlayer%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%22play%20videos%20on%20%5BTYPE%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%20TYPE%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%22DISPLAY%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22openYouTubeLinkInNewWindow%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%22open%20video%20window%20with%20ID%3A%20%5BID%5D%20with%20width%3A%20%5BWIDTH%5D%20height%3A%20%5BHEIGHT%5D%20x%3A%20%5BLEFT%5D%20y%3A%20%5BTOP%5D%20and%20play%20from%20start%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%20ID%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%22dQw4w9WgXcQ%22%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%20WIDTH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20480%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20HEIGHT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20360%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20LEFT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TOP%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22openYouTubeLinkInNewWindowAtTime%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%22open%20video%20window%20with%20ID%3A%20%5BID%5D%20with%20width%3A%20%5BWIDTH%5D%20height%3A%20%5BHEIGHT%5D%20x%3A%20%5BLEFT%5D%20y%3A%20%5BTOP%5D%20and%20play%20video%20at%20%5BMINUTES%5D%3A%5BSECONDS%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%20ID%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%22dQw4w9WgXcQ%22%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%20WIDTH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20480%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20HEIGHT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20360%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20LEFT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TOP%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MINUTES%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECONDS%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%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%22closeYouTubeWindow%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%22close%20video%20window%20with%20ID%3A%20%5BVIDEO_ID%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%20VIDEO_ID%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%22dQw4w9WgXcQ%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%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%20DISPLAY%3A%20%5B%22window%22%2C%20%22canvas%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20STAT_OPTIONS%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%22like%22%2C%20%22dislike%22%2C%20%22view%20count%22%2C%20%22rating%22%2C%20%22date%20created%22%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20STAT_OPTION%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%22author%22%2C%20%22title%22%2C%20%22thumbnail%22%2C%20%22length%22%2C%20%22description%22%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20USER_STUFF%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%22profile%22%2C%20%22name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22description%22%2C%20%22location%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22subscriber%20count%22%2C%20%22video%20count%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22total%20view%20count%22%2C%20%22joined%20date%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%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%20async%20fetchStats(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20stat%20%3D%20args.STAT.toLowerCase().replace(%22%20%22%2C%20%22%22)%3B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%60https%3A%2F%2Freturnyoutubedislikeapi.com%2Fvotes%3FvideoId%3D%24%7Bargs.VIDEO_ID%7D%60)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20jsonData%20%3D%20await%20response.json()%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(stat%20%3D%3D%3D%20%22like%22)%20return%20jsonData.likes%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20(stat%20%3D%3D%3D%20%22dislike%22)%20return%20jsonData.dislikes%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20(stat%20%3D%3D%3D%20%22viewcount%22%20%7C%7C%20stat%20%3D%3D%3D%20%22view%20count%22)%20return%20jsonData.viewCount%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20(stat%20%3D%3D%3D%20%22rating%22)%20return%20jsonData.rating%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20(stat%20%3D%3D%3D%20%22datecreated%22)%20return%20jsonData.dateCreated%3B%0A%20%20%20%20%20%20%20%20%20%20else%20return%20%22Invalid%20Selection%22%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%20return%20%22%22%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20extractVideoID(args)%20%7B%0A%20%20%20%20%20%20const%20url%20%3D%20args.URL%3B%0A%20%20%20%20%20%20if%20(!url.includes(%22youtu.be%22))%20%7B%0A%20%20%20%20%20%20%20%20if%20(url.includes(%22https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20convertedUrl%20%3D%20url.replace(%22www.youtube.com%22%2C%20%22youtu.be%22)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20convertedUrlObj%20%3D%20new%20URL(convertedUrl)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20videoId%20%3D%20convertedUrlObj.searchParams.get(%22v%22)%3B%0A%20%20%20%20%20%20%20%20%20%20return%20videoId%20%7C%7C%20%22Invalid%20Link%22%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%20return%20%22Invalid%20Link%22%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20url.split(%22%2F%22).pop().split(%22%26%22)%5B0%5D%20%7C%7C%20%22Invalid%20Link%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20fetchDateCreated(videoId)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%60https%3A%2F%2Freturnyoutubedislikeapi.com%2Fvideo%2F%24%7BvideoId%7D%60)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20jsonData%20%3D%20await%20response.json()%3B%0A%20%20%20%20%20%20%20%20%20%20return%20jsonData.dateCreated%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20fetchtitle(args)%20%7B%0A%20%20%20%20%20%20const%20stat%20%3D%20args.STAT.toLowerCase().replace(%22%20%22%2C%20%22%22)%3B%0A%20%20%20%20%20%20if%20(stat%20%3D%3D%3D%20%22description%22%20%7C%7C%20stat%20%3D%3D%3D%20%22length%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20await%20this.fetchOthersVideo(args)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20videoId%20%3D%20args.VIDEO_ID%3B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%22https%3A%2F%2Fwww.youtube.com%2Foembed%3Furl%3Dhttp%253A%2F%2Fyoutube.com%2Fwatch%253Fv%253D%22%2BvideoId%2B%22%26format%3Djson%22)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20jsonData%20%3D%20await%20response.json()%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(stat%20%3D%3D%20%22author%22)%20return%20jsonData.author_url.slice(24)%3B%0A%20%20%20%20%20%20%20%20%20%20else%20if%20(stat%20%3D%3D%20%22title%22)%20return%20jsonData.title%3B%20%0A%20%20%20%20%20%20%20%20%20%20else%20return%20jsonData.thumbnail_url%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20vid2MP4(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%60https%3A%2F%2Fyt2html5.com%2F%3Fid%3D%24%7Bargs.VIDEO_ID%7D%60)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20text%20%3D%20await%20response.text()%3B%0A%20%20%20%20%20%20%20%20%20%20const%20json%20%3D%20JSON.parse(text)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(Object.keys(json.data).length%20%3D%3D%3D%200)%20return%20%22Failed%20to%20Fetch%22%3B%0A%20%20%20%20%20%20%20%20%20%20const%20start%20%3D%20text.indexOf(%60%22url%22%3A%22%60)%20%2B%207%3B%0A%20%20%20%20%20%20%20%20%20%20const%20end%20%3D%20text.indexOf(%22%5C%22%22%2C%20start%20%2B%201)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(start%20!%3D%3D%20-1%20%26%26%20end%20!%3D%3D%20-1)%20return%20text.substring(start%2C%20end)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20fetchUserThing(args)%20%7B%0A%20%20%20%20%20%20if%20(args.URL.split(%22%2F%22).slice(-1)%5B0%5D.split(%22%2F%22).length%20%3E%203)%20%7B%0A%20%20%20%20%20%20%20%20args.URL%20%3D%20args.URL.substring(0%2C%20lastIndex)%20%2B%20args.URL.substring(lastIndex%20%2B%201)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(args.THING%20%3D%3D%3D%20%22total%20view%20count%22%20%7C%7C%20args.THING%20%3D%3D%3D%20%22joined%20date%22)%20args.URL%20%3D%20args.URL%20%2B%20%22%2Fabout%22%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%22https%3A%2F%2Fcorsproxy.io%3F%22%20%2B%20args.URL)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20text%20%3D%20await%20response.text()%3B%0A%20%20%20%20%20%20%20%20%20%20let%20match%3B%0A%20%20%20%20%20%20%20%20%20%20let%20pattern%3B%0A%20%20%20%20%20%20%20%20%20%20switch%20(args.THING)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22profile%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2Fhttps%3A%5C%2F%5C%2Fyt3%5C.googleusercontent%5C.com%5C%2F(%5Ba-zA-Z0-9_.%2B-%3D%5D%2B)%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20%22https%3A%2F%2Fyt3.googleusercontent.com%2F%22%20%2B%20match%5B1%5D%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22subscriber%20count%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2F%22%7D%2C%22subscriberCountText%22%3A%7B%22accessibility%22%3A%7B%22accessibilityData%22%3A%7B%22label%22%3A%22(%5B0-9%2C%5D%2B%5C.%5B0-9%5D%3F%5Cs%3F%5BmkbMKB%5D%3F)%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20this%20is%20very%20case%20sensitive%20for%20some%20reason...%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!match)%20match%20%3D%20text.match(%2F%22%7D%2C%22subscriberCountText%22%3A%7B%22accessibility%22%3A%7B%22accessibilityData%22%3A%7B%22label%22%3A%22(%5B0-9%2C%5D%2B%5Cs%3F%5BmkbMKB%5D%3F)%2F)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!match)%20match%20%3D%20text.match(%2F%7D%7D%2C%22subscriberCountText%22%3A%7B%22accessibility%22%3A%7B%22accessibilityData%22%3A%7B%22label%22%3A%22(%5B0-9%2C%5D%2B%5C.%5B0-9%5D%3F%5B0-9%5D%3F%5Cs%3F%5BmkbMKB%5D%3F)%2F)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!match)%20match%20%3D%20text.match(%2F%7D%7D%2C%22subscriberCountText%22%3A%7B%22accessibility%22%3A%7B%22accessibilityData%22%3A%7B%22label%22%3A%22(%5B0-9%2C%5D%2B)%2F)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22video%20count%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2FvideosCountText%22%3A%7B%22runs%22%3A%5C%5B%7B%22text%22%3A%22(%5B%5E%22%5D*)%22%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22total%20view%20count%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2FviewCountText%22%3A%22(%5B%5Cd%5Cs%2C%5D%2B)%5B%5E%22%5D*%22%2C%22joinedDateText%22%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22joined%20date%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2FjoinedDateText%22%3A%7B%22content%22%3A%22%5Cw%2B%5Cs(%5B%5E%22%5D*)%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D.trim()%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22name%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2F%22c4TabbedHeaderRenderer%22%3A%5C%7B%22channelId%22%3A%22%5B%5E%22%5D%2B%22%2C%22title%22%3A%22(%5B%5E%22%5D%2B)%22%2C%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22description%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2F%22description%22%3A%22((%3F%3A%5B%5E%22%5C%5C%5D%7C%5C%5C.)*)%22%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D.replace(%2F%5C%5Cn%2Fg%2C%20%22%5Cn%22)%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22location%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2F%22country%22%3A%5C%7B%22simpleText%22%3A%22(%5B%5E%22%5D%2B)%22%5C%7D%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%20%26%26%20match%5B1%5D%20%3F%20match%5B1%5D%20%3A%20%22Not%20Available%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%20return%20%22Invalid%20Selection%22%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%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20fetchOthersVideo(args)%20%7B%0A%20%20%20%20%20%20args.VIDEO_ID%20%3D%20%60https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D%24%7Bargs.VIDEO_ID%7D%60%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%22https%3A%2F%2Fapi.codetabs.com%2Fv1%2Fproxy%3Fquest%3D%22%20%2B%20args.VIDEO_ID)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20text%20%3D%20await%20response.text()%3B%0A%20%20%20%20%20%20%20%20%20%20let%20match%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20let%20pattern%3B%0A%20%20%20%20%20%20%20%20%20%20switch%20(args.STAT)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22description%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2FattributedDescriptionBodyText%22%3A%7B%22content%22%3A%22((%3F%3A%5B%5E%22%5C%5C%5D%7C%5C%5C.)*)%22%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20match%5B1%5D.replace(%2F%5C%5Cn%2Fg%2C%20%22%5Cn%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22length%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2F%22endTimeMs%22%3A%22(%5B%5E%22%5D%2B)%22%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(match%20%26%26%20match%5B1%5D)%20match%20%3D%20match%5B1%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.error(%22error%2C%20finding%20failsafe...%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pattern%20%3D%20%2F%22lengthSeconds%22%3A%22(%5B%5E%22%5D%2B)%22%2F%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20text.match(pattern)%5B1%5D%20*%201000%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20totalSeconds%20%3D%20Math.floor(match%20%2F%201000)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20hours%20%3D%20Math.floor(totalSeconds%20%2F%203600).toString().padStart(2%2C%20%220%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20remainingSeconds%20%3D%20totalSeconds%20%25%203600%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20minutes%20%3D%20Math.floor(remainingSeconds%20%2F%2060).toString().padStart(2%2C%20%220%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20seconds%20%3D%20(remainingSeconds%20%25%2060).toString().padStart(2%2C%20%220%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%60%24%7Bhours%7D%3A%24%7Bminutes%7D%3A%24%7Bseconds%7D%60%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%20return%20%22Invalid%20Selection%22%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%20%22%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20getResults(args)%20%7B%0A%20%20%20%20%20%20args.QUERY%20%3D%20encodeURIComponent(args.QUERY.replace(%2F%20%2Fg%2C%20%22%2B%22))%3B%0A%20%20%20%20%20%20args.QUERY%20%3D%20args.QUERY.replaceAll(%22%252B%22%2C%20%22%2B%22)%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20fetch(%60https%3A%2F%2Fapi.codetabs.com%2Fv1%2Fproxy%3Fquest%3Dhttps%3A%2F%2Fwww.youtube.com%2Fresults%3Fsearch_query%3D%24%7Bargs.QUERY%7D%60)%3B%0A%20%20%20%20%20%20%20%20if%20(response.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20text%20%3D%20await%20response.text()%3B%0A%20%20%20%20%20%20%20%20%20%20const%20pattern%20%3D%20%2F%5C%2Fwatch%5C%3Fv%3D(%5Ba-zA-Z0-9_-%5D%7B11%7D)%2Fg%3B%0A%20%20%20%20%20%20%20%20%20%20const%20matchArray%20%3D%20text.match(pattern)%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20%20%20return%20JSON.stringify(matchArray.map(match%20%3D%3E%20match.slice(9)))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%22%5B%5D%22%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%22Failed%20to%20Fetch%22%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20openYouTubeLinkInNewWindow(args)%20%7B%20this.openYouTubeLinkInNewWindowAtTime(args)%20%7D%0A%0A%20%20%20%20openYouTubeLinkInNewWindowAtTime(args)%20%7B%0A%20%20%20%20%20%20const%20minutes%20%3D%20Scratch.Cast.toNumber(args.MINUTES)%20%7C%7C%200%3B%0A%20%20%20%20%20%20const%20seconds%20%3D%20Scratch.Cast.toNumber(args.SECONDS)%20%7C%7C%200%3B%0A%20%20%20%20%20%20const%20startTime%20%3D%20minutes%20*%2060%20%2B%20seconds%3B%0A%20%20%20%20%20%20let%20url%20%3D%20%60https%3A%2F%2Fwww.yout-ube.com%2Fwatch%3Fv%3D%24%7Bargs.ID%7D%26t%3D%24%7BstartTime%7D%26fullscreen%3Dyes%60%3B%0A%20%20%20%20%20%20let%20params%20%3D%20%22%22%3B%0A%0A%20%20%20%20%20%20params%20%2B%3D%20%60%26width%3D%24%7BMath.max(100%2C%20Math.min(Scratch.Cast.toNumber(args.WIDTH)%2C%20window.screen.width))%7D%60%3B%0A%20%20%20%20%20%20params%20%2B%3D%20%60%26height%3D%24%7BMath.max(100%2C%20Math.min(Scratch.Cast.toNumber(args.HEIGHT)%2C%20window.screen.height))%7D%60%3B%0A%20%20%20%20%20%20params%20%2B%3D%20%60%26left%3D%24%7BMath.max(0%2C%20Math.min(Scratch.Cast.toNumber(args.LEFT)%2C%20window.screen.width))%7D%60%3B%0A%20%20%20%20%20%20params%20%2B%3D%20%60%26top%3D%24%7BMath.max(0%2C%20Math.min(Scratch.Cast.toNumber(args.TOP)%2C%20window.screen.height))%7D%60%3B%0A%20%20%20%20%20%20%2F*%0A%20%20%20%20%20%20%20%20params%20%2B%3D%20%60%26autoplay%3D%24%7BplayerOpts.autoplay%7D%60%3B%0A%20%20%20%20%20%20%20%20params%20%2B%3D%20%60%26controls%3D%24%7BplayerOpts.controls%7D%26disablekb%3D%24%7BplayerOpts.controls%7D%60%3B%0A%20%20%20%20%20%20%20%20params%20%2B%3D%20%60%26loop%3D%24%7BplayerOpts.loop%7D%60%3B%0A%20%20%20%20%20%20%20%20--These%20stopped%20working%20for%20some%20reason.%20No%20Idea%20Why.%20Keeping%20it%20in%20just%20in%20case%0A%20%20%20%20%20%20*%2F%0A%20%20%20%20%20%20url%20%2B%3D%20params%3B%0A%20%20%20%20%20%20if%20(player%20%3D%3D%3D%20%22window%22)%20%7B%0A%20%20%20%20%20%20%20%20const%20newWindow%20%3D%20window.open(url%2C%20%22_blank%22%2C%20params.replaceAll(%22%26%22%2C%20%22%2C%22))%3B%0A%20%20%20%20%20%20%20%20if%20(newWindow)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.youtubeWindows%5Bargs.ID%5D%20%3D%20newWindow%3B%0A%20%20%20%20%20%20%20%20%20%20const%20onWindLoad%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20newWindow.removeEventListener(%22load%22%2C%20onWindLoad)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20newWindow.focus()%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20newWindow.addEventListener(%22load%22%2C%20onWindLoad)%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%20closeFrame()%3B%0A%20%20%20%20%20%20%20%20createFrame(url%2C%20args)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20closeYouTubeWindow(args)%20%7B%0A%20%20%20%20%20%20const%20videoId%20%3D%20args.VIDEO_ID%3B%0A%20%20%20%20%20%20if%20(player%20%3D%3D%3D%20%22window%22)%20%7B%0A%20%20%20%20%20%20%20%20const%20windowToClose%20%3D%20this.youtubeWindows%5BvideoId%5D%3B%0A%20%20%20%20%20%20%20%20if%20(windowToClose)%20%7B%0A%20%20%20%20%20%20%20%20%20%20windowToClose.close()%3B%0A%20%20%20%20%20%20%20%20%20%20delete%20this.youtubeWindows%5BvideoId%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%20closeFrame()%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setPlayer(args)%20%7B%20player%20%3D%20args.TYPE%20%7D%0A%20%20%7D%0A%20%20%0A%20%20Scratch.extensions.register(new%20SPyoutubeoperations())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Variables%20Expanded%0A%2F%2F%20ID%3A%20DICandSPmonitorsPlus%0A%2F%2F%20Description%3A%20Expansion%20of%20Monitor%20Types%20and%20Variable%20Blocks.%0A%2F%2F%20By%3A%20SharkPool%20and%20DogeIsCut%0A%0A%2F%2F%20Version%201.3.2%20(Duplicate)%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22Variables%20Expanded%20must%20run%20unsandboxed!%22)%3B%0A%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%20%20const%20runtime%20%3D%20vm.runtime%3B%0A%0A%20%20const%20menuIconURI%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIzMjEiIGhlaWdodD0iMzIxIiB2aWV3Qm94PSIwLDAsMzIxLDMyMSI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc5LjUsLTE5LjUpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTogbm9ybWFsIj48cGF0aCBkPSJNOTQsMTgwYzAsLTgwLjYzMzU3IDY1LjM2NjQyLC0xNDYgMTQ2LC0xNDZjODAuNjMzNTgsMCAxNDYsNjUuMzY2NDMgMTQ2LDE0NmMwLDgwLjYzMzU4IC02NS4zNjY0MiwxNDYgLTE0NiwxNDZjLTgwLjYzMzU4LDAgLTE0NiwtNjUuMzY2NDIgLTE0NiwtMTQ2eiIgZmlsbD0iI2ZmOGMxYSIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIvPjxwYXRoIGQ9Ik0xNjkuMDg3MzIsODQuMDM5NzRjNi4yMTQ2MSwyLjczMDg3IDkuMDQ1MDIsOS45Nzc2MyA2LjMyNjQyLDE2LjE5NzYxYy05LjQ4MDc2LDIxLjc0MDEgLTE0LjM1NDY2LDQ1LjIwODYxIC0xNC4zMTQ0NSw2OC45MjYwMmMwLDI0LjUzMDI3IDUuMTIwMjEsNDcuODI5NzMgMTQuMzI2NzYsNjguOTI2MDJjMi40NzI4OSw2LjE3MzU1IC0wLjQwNTQxLDEzLjE5NDk2IC02LjUwMDA2LDE1Ljg1NjM4Yy02LjA5NDY0LDIuNjYxNDIgLTEzLjIwMTE4LDAuMDAwMTkgLTE2LjA0ODYxLC02LjAwOTgxYy0xMC44NDQ4LC0yNC44NDQwMiAtMTYuNDI2ODYsLTUxLjY2NDc3IC0xNi4zOTQ1NCwtNzguNzcyNTljMCwtMjcuOTg4ODggNS44NDY0LC01NC42NDg0OCAxNi4zOTQ1NCwtNzguNzcyNTljMS4zMDY4OCwtMi45OTIxOSAzLjc0OTEzLC01LjM0MjQ2IDYuNzg5MjgsLTYuNTMzNThjMy4wNDAxMiwtMS4xOTExMiA2LjQyODk2LC0xLjEyNTQ2IDkuNDIwNjYsMC4xODI1NHpNMjcxLjM4MDkyLDEzMi4yMzg3MmMtMTEuMjE0NjcsMC4wMDI1MiAtMjEuODIwNDIsNS4xMDE2MiAtMjguODI1ODUsMTMuODU5MDZsLTQuMDM3MSw1LjA0NjM2bC0xLjM2NjIxLC0zLjQzMzk5Yy0zLjczNzYsLTkuMzQwOCAtMTIuNzgzMjIsLTE1LjQ2NzA3IC0yMi44NDQwNiwtMTUuNDcxNDNoLTMuOTc1NTZjLTYuNzk3NjQsMCAtMTIuMzA4MjIsNS41MTA1OCAtMTIuMzA4MjIsMTIuMzA4MjJjMCw2Ljc5NzY0IDUuNTEwNTgsMTIuMzA4MjIgMTIuMzA4MjIsMTIuMzA4MjJoMy45NzU1Nmw2LjU0Nzk3LDE2LjM2OTkybC0xMi43MzksMTUuOTM5MTRjLTIuMzM2ODUsMi45MTg3MyAtNS44NzM3NSw0LjYxNjk5IC05LjYxMjcyLDQuNjE1NTloLTAuNDgwMDJjLTYuNzk3NjQsMCAtMTIuMzA4MjIsNS41MTA1NyAtMTIuMzA4MjIsMTIuMzA4MjJjMCw2Ljc5NzY0IDUuNTEwNTcsMTIuMzA4MjIgMTIuMzA4MjIsMTIuMzA4MjJoMC40ODAwMmMxMS4yMTQ2NywtMC4wMDI1MiAyMS44MjA0MSwtNS4xMDE2MiAyOC44MjU4NSwtMTMuODU5MDZsNC4wMzcxLC01LjA0NjM2bDEuMzY2MjIsMy40MzRjMy43MzkyNiw5LjM0NDk2IDEyLjc5MTA0LDE1LjQ3MjExIDIyLjg1NjM3LDE1LjQ3MTQzaDMuOTc1NTVjNi43OTc2NCwwIDEyLjMwODIyLC01LjUxMDU4IDEyLjMwODIyLC0xMi4zMDgyMmMwLC02Ljc5NzY0IC01LjUxMDU4LC0xMi4zMDgyMiAtMTIuMzA4MjIsLTEyLjMwODIyaC0zLjk3NTU1bC02LjU0Nzk4LC0xNi4zNjk5MmwxMi43MzkwMSwtMTUuOTM5MTNjMi4zMzY4NiwtMi45MTg3MyA1Ljg3Mzc2LC00LjYxNjk4IDkuNjEyNzMsLTQuNjE1NTloMC40ODAwMWM2Ljc5NzY1LDAgMTIuMzA4MjIsLTUuNTEwNTggMTIuMzA4MjIsLTEyLjMwODIyYzAsLTYuNzk3NjQgLTUuNTEwNTcsLTEyLjMwODIyIC0xMi4zMDgyMiwtMTIuMzA4MjJoLTAuNDgwMDF6TTI5NC40NDY1MSwxMDAuMjM3MzdjLTIuNjc2MjMsLTYuMjIxMTEgMC4xNzYxNCwtMTMuNDM1NTMgNi4zODMwNiwtMTYuMTQ0NTFjNi4yMDY5MywtMi43MDg5NyAxMy40MzYyNywwLjEwNTM0IDE2LjE3NzksNi4yOTc5M2MxMC44NDkwMiwyNC44NDMxMSAxNi40MzUzLDUxLjY2MzkxIDE2LjQwNjg2LDc4Ljc3MjZjMCwyNy45ODg4OCAtNS44NDYzOSw1NC42NDg0OCAtMTYuMzk0NTQsNzguNzcyNmMtMS42Njg2Niw0LjE2NTc0IC01LjQ3MjI0LDcuMDkzMTggLTkuOTI2MzMsNy42Mzk4M2MtNC40NTQwOSwwLjU0NjY1IC04Ljg1MjcsLTEuMzc0MTQgLTExLjQ3OTE3LC01LjAxMjczYy0yLjYyNjQ3LC0zLjYzODYxIC0zLjA2NDUsLTguNDE4MjggLTEuMTQzMTUsLTEyLjQ3MzY3YzkuNDg1MzIsLTIxLjczOTA4IDE0LjM2MzQ1LC00NS4yMDc3MSAxNC4zMjY3OCwtNjguOTI2MDFjMCwtMjQuNTMwMjcgLTUuMTIwMjIsLTQ3LjgyOTc0IC0xNC4zMzkwOCwtNjguOTI2MDJ6IiBmaWxsPSIjZmZmZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIi8%2BPGcgZmlsbC1ydWxlPSJub256ZXJvIj48cGF0aCBkPSJNMjk1LjEwNTIxLDMwOC45OTEwMmMtMTAuMjYxNjgsMCAtMTguNTgwNDIsLTguMzE4NzMgLTE4LjU4MDQyLC0xOC41ODA0MXYtOTAuNDI0NjdjMCwtMTAuMjYxNjggOC4zMTg3MywtMTguNTgwNDEgMTguNTgwNDIsLTE4LjU4MDQxaDEuMjM4N2MxMC4yNjE2OCwwIDE4LjU4MDQxLDguMzE4NzMgMTguNTgwNDEsMTguNTgwNDF2OTAuNDI0NjdjMCwxMC4yNjE2OCAtOC4zMTg3MywxOC41ODA0MSAtMTguNTgwNDEsMTguNTgwNDF6IiBmaWxsPSIjZmY4YzFhIiBzdHJva2U9IiNmZjhjMWEiIHN0cm9rZS13aWR0aD0iMTIuNSIvPjxwYXRoIGQ9Ik0yMzEuOTMxODIsMjQ0LjU3ODkzYzAsLTEwLjI2MTY4IDguMzE4NzQsLTE4LjU4MDQyIDE4LjU4MDQxLC0xOC41ODA0Mmg5MC40MjQ2NmMxMC4yNjE2OCwwIDE4LjU4MDQsOC4zMTg3MyAxOC41ODA0LDE4LjU4MDQydjEuMjM4N2MwLDEwLjI2MTY5IC04LjMxODcyLDE4LjU4MDQgLTE4LjU4MDQsMTguNTgwNGgtOTAuNDI0NjZjLTEwLjI2MTY3LDAgLTE4LjU4MDQxLC04LjMxODczIC0xOC41ODA0MSwtMTguNTgwNHoiIGZpbGw9IiNmZjhjMWEiIHN0cm9rZT0iI2ZmOGMxYSIgc3Ryb2tlLXdpZHRoPSIxMi41Ii8%2BPHBhdGggZD0iTTIzOS44ODAxMiwyNDQuNzkwMDZjMCwtNi43NjM1MSA1LjQ4MjkxLC0xMi4yNDY0MSAxMi4yNDY0MiwtMTIuMjQ2NDFoODcuMjk5M2M2Ljc2MzUxLDAgMTIuMjQ2NDIsNS40ODI5IDEyLjI0NjQyLDEyLjI0NjQxdjAuODE2NDVjMCw2Ljc2MzUxIC01LjQ4MjkxLDEyLjI0NjQyIC0xMi4yNDY0MiwxMi4yNDY0MmgtODcuMjk5M2MtNi43NjM1MSwwIC0xMi4yNDY0MiwtNS40ODI5MiAtMTIuMjQ2NDIsLTEyLjI0NjQyeiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz48cGF0aCBkPSJNMjk2LjE4NDM5LDE4OS4zMDIxOWM2Ljc2MzUxLDAgMTIuMjQ2NDEsNS40ODI5MSAxMi4yNDY0MSwxMi4yNDY0MXY4Ny4yOTkzYzAsNi43NjM1MSAtNS40ODI5LDEyLjI0NjQyIC0xMi4yNDY0MSwxMi4yNDY0MmgtMC44MTY0NWMtNi43NjM1MSwwIC0xMi4yNDY0MiwtNS40ODI5MSAtMTIuMjQ2NDEsLTEyLjI0NjQyYzAsMCAwLC00OS4yMzE5NSAwLC02NC44NjIyN2MwLC04Ljg0ODEzIDAsLTIyLjQzNzA0IDAsLTIyLjQzNzA0YzAsLTYuNzYzNTEgNS40ODI5MSwtMTIuMjQ2NDEgMTIuMjQ2NDIsLTEyLjI0NjQyeiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz48L2c%2BPHBhdGggZD0iTTg3LDE4MGMwLC04NC40OTk1NyA2OC41MDA0MywtMTUzIDE1MywtMTUzYzg0LjQ5OTU3LDAgMTUzLDY4LjUwMDQzIDE1MywxNTNjMCw4NC40OTk1NyAtNjguNTAwNDMsMTUzIC0xNTMsMTUzYy04NC40OTk1NywwIC0xNTMsLTY4LjUwMDQzIC0xNTMsLTE1M3oiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjZGI2ZTAwIiBzdHJva2Utd2lkdGg9IjE1Ii8%2BPC9nPjwvZz48L3N2Zz4%3D%22%3B%0A%0A%20%20const%20xmlEscape%20%3D%20function%20(unsafe)%20%7B%0A%20%20%20%20return%20Scratch.Cast.toString(unsafe).replace(%2F%5B%3C%3E%26'%22%5D%2Fg%2C%20c%20%3D%3E%20%7B%0A%20%20%20%20%20%20switch%20(c)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22%3C%22%3A%20return%20%22%26lt%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22%3E%22%3A%20return%20%22%26gt%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22%26%22%3A%20return%20%22%26amp%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22'%22%3A%20return%20%22%26apos%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22%5C%22%22%3A%20return%20%22%26quot%3B%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D)%3B%0A%20%20%7D%3B%0A%0A%20%20function%20removeAllEventListeners(element)%20%7B%0A%20%20%20%20const%20clonedElement%20%3D%20element.cloneNode(true)%3B%0A%20%20%20%20element.parentNode.replaceChild(clonedElement%2C%20element)%3B%0A%20%20%20%20return%20clonedElement%3B%0A%20%20%7D%0A%0A%20%20const%20builtInFonts%20%3D%20%5B%22Sans%20Serif%22%2C%20%22Serif%22%2C%20%22Handwriting%22%2C%20%22Marker%22%2C%20%22Curly%22%2C%20%22Pixel%22%5D%3B%0A%0A%20%20runtime.on(%22BEFORE_EXECUTE%22%2C%20()%20%3D%3E%20%7B%20runtime.startHats(%22DICandSPmonitorsPlus_whenButtonPressed%22)%3B%20%7D)%3B%0A%0A%20%20class%20MonitorsPlus%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20this.varButtonStatus%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20this.monitorsUpdateListeners%20%3D%20%5B%5D%3B%0A%20%20%20%20%7D%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%22DICandSPmonitorsPlus%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Variables%20Expanded%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23FF8C1A%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23e67e17%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23cc7015%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%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%20func%3A%20%22notify%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%22Editor%20Debugging%22%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%22exists%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%22does%20%5BVARIABLE%5D%20exist%3F%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20variable%22%20%7D%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%22isShowing%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%20%5BVARIABLE%5D%20showing%3F%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22setVis%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%5BVIS%5D%20variable%20%5BVAR%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%20VAR%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VIS%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22VISIBLE%22%20%7D%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%22setString%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%5BVARIABLE%5D%20to%20%5BSTRING%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%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%20%5BVARIABLE%5D%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%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22swapVars%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%22swap%20%5BVAR1%5D%20with%20%5BVAR2%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%20VAR1%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VAR2%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22reportVal%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%22value%20of%20%5BVARIABLE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22makeVariable%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%22create%20variable%20named%20%5BVARIABLE%5D%20%5BTYPE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20variable%202%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableTypeCreate%22%20%7D%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%22deleteVariable%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%20variable%20named%20%5BVARIABLE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20variable%202%22%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Positioning%22%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%22setPosition%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%20position%20of%20%5BVARIABLE%5D%20to%20x%3A%20%5BX%5D%20y%3A%20%5BY%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%20X%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22currentPos%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%22current%20%5BPOSITION%5D%20of%20%5BVARIABLE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20POSITION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22POSITIONS%22%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Variable%20Monitors%22%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%22setVariableToType%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%5BVARIABLE%5D%20monitor%20type%20to%20%5BTYPE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variablesTypeMenu%22%20%7D%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%22getVariableType%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%22monitor%20type%20of%20%5BVARIABLE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Sliders%22%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%22setSliderMinMaxOfVaribleTo%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%20slider%20min%20%5BMIN%5D%20and%20max%20%5BMAX%5D%20of%20%5BVARIABLE%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%20MIN%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20-100%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MAX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22sliderMinMaxOfVarible%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%22slider%20%5BMINMAX%5D%20of%20%5BVARIABLE%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%20MINMAX%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22sliderMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Buttons%22%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%22whenButtonPressed%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.HAT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20isEdgeActivated%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20%5BVARIABLE%5D%20button%20%5BTYPE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22BUTTON_CLICK%22%20%7D%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%22isButtonPressed%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%20%5BVARIABLE%5D%20button%20%5BTYPE%5D%3F%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22BUTTON_CLICK%22%20%7D%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%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Effects%22%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%22setDisplay%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%20display%20name%20of%20%5BVARIABLE%5D%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%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20cooler%20variable%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%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%20of%20%5BVARIABLE%5D%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%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22allFonts%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22resetEffect%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%20effects%20of%20%5BVARIABLE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22setEffect%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%5BEFFECT%5D%20of%20%5BVARIABLE%5D%20to%20%5BAMOUNT%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%20AMOUNT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EFFECT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22EFFECTS%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%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%22currentEffect%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%22current%20%5BEFFECT%5D%20of%20%5BVARIABLE%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%20VARIABLE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22variableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EFFECT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22EFFECTS%22%20%7D%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%20variablesTypeMenu%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%22normal%20readout%22%2C%20%22large%20readout%22%2C%20%22slider%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Custom%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%22%2C%20%22checkbox%22%2C%20%22color%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22button%22%2C%20%22file%22%2C%20%22image%22%2C%20%22audio%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20sliderMenu%3A%20%5B%22min%22%2C%20%22max%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20variableMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%22getVariables%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20allFonts%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%22getFonts%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20variableTypeCreate%3A%20%5B%22globally%22%2C%20%22for%20this%20sprite%20only%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20POSITIONS%3A%20%5B%22x%22%2C%20%22y%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20BUTTON_CLICK%3A%20%5B%22clicked%22%2C%20%22held%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20VISIBLE%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22show%22%2C%20%22hide%22%5D%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20EFFECTS%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%22blur%22%2C%20%22saturation%22%2C%20%22contrast%22%2C%20%22brightness%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22hue%22%2C%20%22opacity%22%2C%20%22sepia%22%2C%20%22invert%22%2C%20%22direction%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22scale%20x%22%2C%20%22scale%20y%22%2C%20%22skew%20x%22%2C%20%22skew%20y%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%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%2F%20Helper%20Functions%0A%0A%20%20%20%20notify()%20%7B%0A%20%20%20%20%20%20alert(%0A%20%20%20%20%20%20%20%20%22Upon%20Double-Clicking%20New%20Monitors%2C%20it%20will%20open%20up%20the%20Debug%20Menu%22%20%2B%0A%20%20%20%20%20%20%20%20%22%5Cn%5CnThis%20feature%20is%20only%20accessible%20within%20the%20Editor%20and%20can%20be%20reset%20by%20using%20the%20set%20monitor%20block%22%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getVariables()%20%7B%0A%20%20%20%20%20%20const%20globalVars%20%3D%20Object.values(vm.runtime.getTargetForStage().variables).filter((x)%20%3D%3E%20x.type%20%3D%3D%20%22%22)%3B%0A%20%20%20%20%20%20const%20localVars%20%3D%20Object.values(vm.editingTarget.variables).filter((x)%20%3D%3E%20x.type%20%3D%3D%20%22%22)%3B%0A%20%20%20%20%20%20const%20uniqueVars%20%3D%20%5B...new%20Set(%5B...globalVars%2C%20...localVars%5D)%5D%3B%0A%20%20%20%20%20%20if%20(uniqueVars.length%20%3D%3D%3D%200)%20return%20%5B%22make%20a%20variable%22%5D%3B%0A%20%20%20%20%20%20return%20uniqueVars.map((i)%20%3D%3E%20(Scratch.Cast.toString(i.name)))%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%20%3F%20Scratch.vm.runtime.fontManager.getFonts().map((i)%20%3D%3E%20(%7Btext%3A%20i.name%2C%20value%3A%20i.family%7D))%20%3A%20%5B%5D%3B%0A%20%20%20%20%20%20return%20%5B%20...builtInFonts%2C%20...customFonts%20%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20findVariable(variable%2C%20sprite)%20%7B%0A%20%20%20%20%20%20%2F%2Fsupport%20for%20all%20variable%20types%0A%20%20%20%20%20%20const%20cloudID%20%3D%20runtime.getTargetForStage().lookupVariableByNameAndType(Scratch.Cast.toString(%22%C3%83%C6%92%C3%82%C2%A2%C3%83%E2%80%B9%C3%82%C5%93%C3%83%E2%80%9A%C3%82%C2%81%20%22%20%2B%20variable)%2C%20%22%22)%3B%0A%20%20%20%20%20%20if%20(cloudID)%20return%20cloudID.id%3B%0A%20%20%20%20%20%20let%20varFind%20%3D%20%22%22%3B%0A%20%20%20%20%20%20for%20(const%20name%20of%20Object.getOwnPropertyNames(sprite.target.variables))%20%7B%0A%20%20%20%20%20%20%20%20varFind%20%3D%20sprite.target.variables%5Bname%5D.name%3B%0A%20%20%20%20%20%20%20%20if%20(varFind%20%3D%3D%3D%20variable)%20return%20sprite.target.variables%5Bname%5D.id%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20ID%20%3D%20runtime.getTargetForStage().lookupVariableByNameAndType(variable%2C%20%22%22)%3B%0A%20%20%20%20%20%20if%20(!ID)%20return%20%22%22%3B%0A%20%20%20%20%20%20return%20ID.id%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetFormat(variableId)%20%7B%0A%20%20%20%20%20%20%2F%2F%20Use%20to%20avoid%20formatting%20and%20GUI%20errors%20when%20switching%20to%20and%20from%20custom%20monitors%0A%20%20%20%20%20%20runtime.requestUpdateMonitor(new%20Map(%5B%0A%20%20%20%20%20%20%20%20%5B%22id%22%2C%20variableId%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22visible%22%2C%20false%5D%0A%20%20%20%20%20%20%5D))%3B%0A%20%20%20%20%20%20setTimeout(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20runtime.requestUpdateMonitor(new%20Map(%5B%0A%20%20%20%20%20%20%20%20%20%20%5B%22id%22%2C%20variableId%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%5B%22visible%22%2C%20true%5D%0A%20%20%20%20%20%20%20%20%5D))%3B%0A%20%20%20%20%20%20%7D%2C%2030)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20refresh()%20%7B%0A%20%20%20%20%20%20%2F%2F%20Use%20to%20refresh%20the%20toolbox%20to%20show%20new%2Fdeleted%20variables%0A%20%20%20%20%20%20if%20(!runtime.isPackaged)%20%7B%0A%20%20%20%20%20%20%20%20Scratch.vm.emitWorkspaceUpdate()%3B%0A%20%20%20%20%20%20%20%20window.ScratchBlocks.getMainWorkspace().toolboxRefreshEnabled_%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20window.ScratchBlocks.getMainWorkspace().refreshToolboxSelection_()%3B%0A%20%20%20%20%20%20%20%20window.ScratchBlocks.getMainWorkspace().toolboxRefreshEnabled_%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20setTimeout(function()%20%7B%20vm.runtime.requestBlocksUpdate()%20%7D%2C%2010)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20generateId()%20%7B%0A%20%20%20%20%20%20%2F%2F%20Used%20for%20creating%20new%20variables%0A%20%20%20%20%20%20const%20soup%20%3D%20%22!%23%25()*%2B%2C-.%2F%3A%3B%3D%3F%40%5B%5D%5E_%60%7B%7C%7D~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%22%3B%0A%20%20%20%20%20%20const%20id%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%2020%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20id%5Bi%5D%20%3D%20soup.charAt(Math.random()%20*%20soup.length)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20id.join(%22%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20reAddDeleted(variable%2C%20id%2C%20name%2C%20util)%20%7B%0A%20%20%20%20%20%20%2F%2F%20use%20to%20reimplement%20changed%20styles%20of%20monitors%0A%20%20%20%20%20%20const%20waitAndExecute%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(!this.isShowing(%7BVARIABLE%20%3A%20name%7D%2C%20util))%20%7B%0A%20%20%20%20%20%20%20%20%20%20setTimeout(waitAndExecute%2C%205)%3B%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%20%20setTimeout(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7Bid%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20inlineStyles%20%3D%20variable.getAttribute(%22style%22)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.style)%20variableMonitor.style%20%3D%20inlineStyles%3B%0A%20%20%20%20%20%20%20%20%7D%2C%2010)%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20waitAndExecute()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setValue(variableN%2C%20value%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(variableN%2C%20variableN)%3B%0A%20%20%20%20%20%20variable.value%20%3D%20value%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetEffects(variableId%2C%20currentTransform)%20%7B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%3B%0A%20%20%20%20%20%20const%20translationRegex%20%3D%20%2Ftranslate%5C((%5B%5E%2C%5D%2B)%2C%5Cs*(%5B%5E)%5D%2B)%5C)%2F%3B%0A%20%20%20%20%20%20const%20matches%20%3D%20currentTransform.match(translationRegex)%3B%0A%20%20%20%20%20%20const%20translation%20%3D%20matches%20%3F%20%60translate(%24%7Bmatches%5B1%5D%7D%2C%20%24%7Bmatches%5B2%5D%7D)%60%20%3A%20%22%22%3B%0A%20%20%20%20%20%20variableMonitor.style.filter%20%3D%20%22%22%3B%0A%20%20%20%20%20%20variableMonitor.style.transform%20%3D%20translation%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Block%20Functions%0A%0A%20%20%20%20isShowing(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20info%20%3D%20runtime.getMonitorState().get(this.findVariable(args.VARIABLE%2C%20util))%3B%0A%20%20%20%20%20%20return%20info%20%3F%20(info.get(%22visible%22)%20!%3D%3D%20undefined%20%26%26%20info.get(%22visible%22)%20!%3D%3D%20false)%20%3A%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20exists(args%2C%20util)%20%7B%20return%20Scratch.Cast.toBoolean(this.findVariable(args.VARIABLE%2C%20util))%20%7D%0A%0A%20%20%20%20setVis(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupVariableByNameAndType(args.VAR%2C%20%22%22)%3B%0A%20%20%20%20%20%20if%20(!variable)%20return%3B%0A%20%20%20%20%20%20runtime.monitorBlocks.changeBlock(%7B%0A%20%20%20%20%20%20%20%20id%3A%20variable.id%2C%20element%3A%20%22checkbox%22%2C%20value%3A%20args.VIS%20%3D%3D%3D%20%22show%22%0A%20%20%20%20%20%20%7D%2C%20runtime)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setString(args%2C%20util)%20%7B%20this.setValue(args.VARIABLE%2C%20args.STRING%2C%20util)%20%7D%0A%20%20%20%20setColor(args%2C%20util)%20%7B%20this.setValue(args.VARIABLE%2C%20args.COLOR%2C%20util)%20%7D%0A%0A%20%20%20%20swapVars(args%2C%20util)%20%7B%0A%20%20%20%20%20%20let%20var1%20%3D%20Scratch.Cast.toString(args.VAR1)%3B%0A%20%20%20%20%20%20let%20var2%20%3D%20Scratch.Cast.toString(args.VAR2)%3B%0A%20%20%20%20%20%20var1%20%3D%20util.target.lookupOrCreateVariable(var1%2C%20var1)%3B%0A%20%20%20%20%20%20var2%20%3D%20util.target.lookupOrCreateVariable(var2%2C%20var2)%3B%0A%20%20%20%20%20%20const%20temp%20%3D%20var1.value%3B%0A%20%20%20%20%20%20var1.value%20%3D%20var2.value%3B%0A%20%20%20%20%20%20var2.value%20%3D%20temp%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20reportVal(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20if%20(!variableId)%20return%200%3B%0A%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupVariableById(variableId)%3B%0A%20%20%20%20%20%20return%20variable.value%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20makeVariable(args%2C%20util)%20%7B%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22for%20this%20sprite%20only%22)%20util.target.lookupOrCreateVariable(this.generateId()%2C%20args.VARIABLE%2C%20%22%22)%3B%0A%20%20%20%20%20%20else%20runtime.createNewGlobalVariable(args.VARIABLE%2C%20%22%22)%3B%0A%20%20%20%20%20%20return%20this.refresh()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteVariable(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20if%20(variableId)%20%7B%0A%20%20%20%20%20%20%20%20runtime.getTargetForStage().deleteVariable(variableId)%0A%20%20%20%20%20%20%20%20util.target.deleteVariable(variableId)%3B%0A%20%20%20%20%20%20%20%20return%20this.refresh()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setPosition(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20canvas%20%3D%20%5BScratch.vm.runtime.stageWidth%20%2F%202%2C%20Scratch.vm.runtime.stageHeight%20%2F%202%5D%3B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%3B%0A%20%20%20%20%20%20let%20x%20%3D%20Scratch.Cast.toNumber(args.X)%20%2B%20canvas%5B0%5D%20-%20(variableMonitor.offsetWidth%20%2F%202)%3B%0A%20%20%20%20%20%20let%20y%20%3D%20(Scratch.Cast.toNumber(args.Y)%20-%20canvas%5B1%5D%20%2B%20(variableMonitor.offsetHeight%20%2F%202))%20*%20-1%3B%0A%20%20%20%20%20%20x%20%3D%20x%20-%20(parseInt(variableMonitor.style.left)%20%7C%7C%205)%3B%0A%20%20%20%20%20%20y%20%3D%20y%20-%20(parseInt(variableMonitor.style.top)%20%7C%7C%205)%3B%0A%0A%20%20%20%20%20%20let%20styleAttribute%20%3D%20variableMonitor.getAttribute(%22style%22)%3B%0A%20%20%20%20%20%20const%20transformRegex%20%3D%20%2Ftransform%3A(%5B%5E%3B%5D%2B)%3B%2F%3B%0A%20%20%20%20%20%20const%20transformMatch%20%3D%20styleAttribute.match(transformRegex)%3B%0A%20%20%20%20%20%20if%20(transformMatch)%20%7B%0A%20%20%20%20%20%20%20%20const%20existingTransform%20%3D%20transformMatch%5B1%5D%3B%0A%20%20%20%20%20%20%20%20const%20updatedTransform%20%3D%20existingTransform.replace(%2Ftranslate%5C(%5B%5E)%5D%2B%5C)%2F%2C%20%60translate(%24%7Bx%7Dpx%2C%20%24%7By%7Dpx)%60)%3B%0A%20%20%20%20%20%20%20%20styleAttribute%20%3D%20styleAttribute.replace(transformRegex%2C%20%60transform%3A%24%7BupdatedTransform%7D%3B%60)%3B%0A%20%20%20%20%20%20%20%20variableMonitor.setAttribute(%22style%22%2C%20styleAttribute)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20currentPos(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20canvas%20%3D%20%5BScratch.vm.runtime.stageWidth%20%2F%202%2C%20Scratch.vm.runtime.stageHeight%20%2F%202%5D%3B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%20%22%22%3B%0A%0A%20%20%20%20%20%20const%20styleAttribute%20%3D%20variableMonitor.getAttribute(%22style%22)%3B%0A%20%20%20%20%20%20if%20(styleAttribute)%20%7B%0A%20%20%20%20%20%20%20%20const%20match%20%3D%20styleAttribute.match(%2Ftransform%5Cs*%3A%5Cs*translate%5C((-%3F%5Cd%2B(%3F%3A%5C.%5Cd%2B)%3Fpx)%2C%5Cs*(-%3F%5Cd%2B(%3F%3A%5C.%5Cd%2B)%3Fpx)%5C)%2F)%3B%0A%20%20%20%20%20%20%20%20if%20(match)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(args.POSITION%20%3D%3D%3D%20%22x%22)%20return%20Math.round(parseInt(match%5B1%5D)%20-%20canvas%5B0%5D%20%2B%20(variableMonitor.offsetWidth%20%2F%202))%20%2B%20parseInt(variableMonitor.style.left)%3B%0A%20%20%20%20%20%20%20%20%20%20else%20return%20Math.round(((parseInt(match%5B2%5D)%20*%20-1)%20%2B%20canvas%5B1%5D)%20-%20(variableMonitor.offsetHeight%20%2F%202)%20-%20parseInt(variableMonitor.style.top))%20-%201%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%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setSliderMinMaxOfVaribleTo(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20if%20(!(this.getMonitor(args.VARIABLE%2C%20util).includes(%22readout%22)%20%7C%7C%20this.getMonitor(args.VARIABLE%2C%20util)%20%3D%3D%3D%20%22slider%22))%20%7B%0A%20%20%20%20%20%20%20%20this.resetFormat(variableId)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20state%20%3D%20runtime.getMonitorState().get(variableId)%3B%0A%20%20%20%20%20%20if%20(!state)%20return%20%22%22%3B%0A%20%20%20%20%20%20state%20%3D%20state.set(%22mode%22%2C%20%22slider%22)%3B%0A%20%20%20%20%20%20runtime.requestUpdateMonitor(state)%3B%0A%20%20%20%20%20%20runtime.requestUpdateMonitor(new%20Map(%5B%0A%20%20%20%20%20%20%20%20%5B%22id%22%2C%20variableId%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22sliderMin%22%2C%20Scratch.Cast.toNumber(args.MIN)%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22sliderMax%22%2C%20Scratch.Cast.toNumber(args.MAX)%5D%0A%20%20%20%20%20%20%5D))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20sliderMinMaxOfVarible(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20info%20%3D%20runtime.getMonitorState().get(variableId)%3B%0A%20%20%20%20%20%20if%20(info%20%3D%3D%3D%20undefined)%20return%200%3B%0A%20%20%20%20%20%20return%20info.get(args.MINMAX%20%3D%3D%3D%20%22min%22%20%3F%20%22sliderMin%22%20%3A%20%22sliderMax%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20setVariableToType(args%2C%20util)%20%7B%20await%20this.setMonitor(args.VARIABLE%2C%20util%2C%20args.VARIABLE%2C%20args.TYPE)%20%7D%0A%0A%20%20%20%20%2F%2F%20Set%20variable%20monitor%2C%20we%20use%20the%20same%20class%20names%20to%20avoid%20losing%20css%0A%20%20%20%20async%20setMonitor(nameID%2C%20util%2C%20name%2C%20type)%20%7B%0A%20%20%20%20%20%20let%20variableId%20%3D%20this.findVariable(nameID%2C%20util)%3B%0A%20%20%20%20%20%20const%20oldStyle%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(type.includes(%22readout%22)%20%7C%7C%20type%20%3D%3D%3D%20%22slider%22)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!(this.getMonitor(nameID%2C%20util).includes(%22readout%22)%20%7C%7C%20this.getMonitor(nameID%2C%20util)%20%3D%3D%3D%20%22slider%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.resetFormat(variableId)%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%20if%20(!type.includes(%22readout%22)%20%26%26%20type%20!%3D%3D%20%22slider%22)%20%7B%0A%20%20%20%20%20%20%20%20var%20state2%20%3D%20vm.runtime.getMonitorState().get(variableId)%3B%0A%20%20%20%20%20%20%20%20vm.runtime.requestUpdateMonitor(state2.set(%22mode%22%2C%20%22default%22))%3B%0A%20%20%20%20%20%20%20%20let%20i%3B%0A%20%20%20%20%20%20%20%20await%20new%20Promise(resolve%20%3D%3E%20%7B%20const%20wait%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(i)%20resolve()%3B%0A%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20%3D%20runtime.getMonitorState().get(variableId).get(%22visible%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20setTimeout(wait%2C%205)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%7D%3B%0A%20%20%20%20%20%20%20%20%20%20wait()%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%3B%0A%20%20%20%20%20%20let%20typeElement%2C%20isHex%2C%20buttonClickFunc%2C%20container%3B%0A%0A%20%20%20%20%20%20const%20hexColorRegex%20%3D%20%2F%5E%23(%5B0-9A-F%5D%7B3%7D)%7B1%2C2%7D%24%2Fi%3B%0A%20%20%20%20%20%20const%20Vvalue%20%3D%20xmlEscape(util.target.lookupOrCreateVariable(nameID%2C%20nameID).value)%3B%0A%20%20%20%20%20%20const%20isChecked%20%3D%20Vvalue%20%3D%3D%3D%20%22true%22%20%7C%7C%20Vvalue%20%3D%3D%3D%201%20%3F%20true%20%3A%20false%3B%0A%20%20%20%20%20%20nameID%20%3D%20name.replace(%2F%5B%3C%3E%5D%2Fg%2C%20%22%22)%3B%0A%20%20%20%20%20%20this.removeAllMonitorsUpdateListeners()%3B%0A%20%20%20%20%20%20if%20(type.includes(%22readout%22)%20%7C%7C%20type%20%3D%3D%3D%20%22slider%22)%20%7B%0A%20%20%20%20%20%20%20%20var%20state%20%3D%20vm.runtime.getMonitorState().get(variableId)%3B%0A%20%20%20%20%20%20%20%20vm.runtime.requestUpdateMonitor(state.set(%22mode%22%2C%20%22large%22))%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20let%20oldMonitor%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor%22%5D%3Anot(.monitor_default-monitor_SPnew1)%60)%3B%0A%20%20%20%20%20%20%20%20if%20(!oldMonitor)%20oldMonitor%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22sc-monitor-inner%22%5D%20%5Bclass%5E%3D%22sc-monitor-row%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20oldMonitor.style.display%20%3D%20%22none%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20switch%20(type)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22large%20readout%22%3A%0A%20%20%20%20%20%20%20%20%20%20state%20%3D%20state.set(%22mode%22%2C%20%22large%22)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.runtime.requestUpdateMonitor(state)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22slider%22%3A%0A%20%20%20%20%20%20%20%20%20%20state%20%3D%20state.set(%22mode%22%2C%20%22slider%22)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.runtime.requestUpdateMonitor(state)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22text%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_label_ci1ok%22%3E%24%7BnameID%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22text%22%20id%3D%22text_%24%7BvariableId%7D%22%20class%3D%22monitor_slider_1CHwk%20no-drag%22%20value%3D%22%24%7BVvalue%7D%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22text_%24%7BvariableId%7D%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20removeAllEventListeners(typeElement)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20this.addMonitorsUpdateListener(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20typeElement.value%20%3D%20xmlEscape(variable.value)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22change%22%2C%20function%20(event)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(event.target%20%26%26%20event.target.id.startsWith(%60text_%24%7BvariableId%7D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20variable.value%20%3D%20typeElement.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22checkbox%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22checkbox%22%20id%3D%22checkbox_%24%7BvariableId%7D%22%20class%3D%22monitor_slider_1CHwk%20no-drag%22%20%24%7BisChecked%20%3F%20%22checked%22%20%3A%20%22%22%7D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_label_ci1ok%22%3E%24%7BnameID%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22checkbox_%24%7BvariableId%7D%22%60)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20removeAllEventListeners(typeElement)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20this.addMonitorsUpdateListener(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20typeElement.checked%20%3D%20variable.value%20%3D%3D%3D%20%22false%22%20%3F%200%20%3A%20variable.value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22change%22%2C%20function%20(event)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(event.target%20%26%26%20event.target.id.startsWith(%60checkbox_%24%7BvariableId%7D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20variable.value%20%3D%20typeElement.checked%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22color%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(hexColorRegex.test(Vvalue))%20isHex%20%3D%20Vvalue%3B%0A%20%20%20%20%20%20%20%20%20%20else%20isHex%20%3D%20%22%23ff0000%22%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_label_ci1ok%22%3E%24%7BnameID%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22color%22%20id%3D%22color_%24%7BvariableId%7D%22%20class%3D%22monitor_slider_1CHwk%20no-drag%22%20value%3D%22%24%7BisHex%7D%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22color_%24%7BvariableId%7D%22%60)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20removeAllEventListeners(typeElement)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20this.addMonitorsUpdateListener(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20typeElement.value%20%3D%20xmlEscape(variable.value)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22change%22%2C%20function%20(event)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(event.target%20%26%26%20event.target.id.startsWith(%60color_%24%7BvariableId%7D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20variable.value%20%3D%20typeElement.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22button%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22button%22%20id%3D%22button_%24%7BvariableId%7D%22%20value%3D%22%24%7BnameID%7D%22%20class%3D%22monitor_slider_1CHwk%20no-drag%20monitor-button%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22button_%24%7BvariableId%7D%22%5D%60)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20buttonClickFunc%20%3D%20(down)%20%3D%3E%20()%20%3D%3E%20this.buttonClick(variableId%2C%20down)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22mousedown%22%2C%20buttonClickFunc(true))%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22mouseup%22%2C%20buttonClickFunc(false))%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22mouseleave%22%2C%20buttonClickFunc(false))%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22file%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_label_ci1ok%22%3E%24%7BnameID%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22file%22%20id%3D%22file_%24%7BvariableId%7D%22%20class%3D%22monitor_slider_1CHwk%20no-drag%22%20value%3D%220%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22file_%24%7BvariableId%7D%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20removeAllEventListeners(typeElement)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement.addEventListener(%22change%22%2C%20function%20(event)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(event.target%20%26%26%20event.target.id%20%3D%3D%3D%20%60file_%24%7BvariableId%7D%60)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20file%20%3D%20event.target.files%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(file)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20reader%20%3D%20new%20FileReader()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reader.readAsDataURL(file)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reader.onload%20%3D%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20variable.value%20%3D%20reader.result%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reader.onerror%20%3D%20function%20(error)%20%7B%20console.log(%22Error%3A%20%22%2C%20error)%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22image%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_label_ci1ok%22%3E%24%7BnameID%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%20%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cimg%20src%3D%22%24%7BVvalue%7D%22%20id%3D%22image_%24%7BvariableId%7D%22%20class%3D%22monitor_slider_1CHwk%20no-drag%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22image_%24%7BvariableId%7D%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20this.addMonitorsUpdateListener(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20typeElement.src%20%3D%20xmlEscape(variable.value)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22audio%22%3A%0A%20%20%20%20%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_default-monitor_SPnew1%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20container%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.className%20%3D%20%22monitor_default-monitor_SPnew1%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20container.setAttribute(%22style%22%2C%20%22padding%3A%205px%205px%205px%205px%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20container.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_label_ci1ok%22%3E%24%7BnameID%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22monitor_row_2y_kM%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Caudio%20id%3D%22audio_%24%7BvariableId%7D%22%20class%3D%22monitor_audio%22%20src%3D%22%24%7BVvalue%7D%22%20controls%3E%3C%2Faudio%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20%20%20%20%20variableMonitor.appendChild(container)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20typeElement%20%3D%20container.querySelector(%60%5Bid%3D%22audio_%24%7BvariableId%7D%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20%20%20this.addMonitorsUpdateListener(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20util.target.lookupOrCreateVariable(nameID%2C%20nameID)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20typeElement.src%20%3D%20variable.value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20default%3A%20%2F%2F%20Handle%20unknown%20monitor%20or%20default%20monitor%0A%20%20%20%20%20%20%20%20%20%20state%20%3D%20state.set(%22mode%22%2C%20%22default%22)%3B%0A%20%20%20%20%20%20%20%20%20%20vm.runtime.requestUpdateMonitor(state)%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this.reAddDeleted(oldStyle%2C%20variableId%2C%20nameID%2C%20util)%3B%0A%20%20%20%20%7D%0A%20%20%20%20addMonitorsUpdateListener(listener)%20%7B%0A%20%20%20%20%20%20runtime.on(%22MONITORS_UPDATE%22%2C%20listener)%3B%0A%20%20%20%20%20%20this.monitorsUpdateListeners.push(listener)%3B%0A%20%20%20%20%7D%0A%20%20%20%20removeAllMonitorsUpdateListeners()%20%7B%0A%20%20%20%20%20%20for%20(const%20listener%20of%20this.monitorsUpdateListeners)%20%7B%0A%20%20%20%20%20%20%20%20runtime.removeListener(%22MONITORS_UPDATE%22%2C%20listener)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20this.monitorsUpdateListeners.length%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%20%20buttonClick(ID%2C%20down)%20%7B%0A%20%20%20%20%20%20if%20(down)%20this.varButtonStatus%5BID%5D%20%3D%20%7B%20varName%20%3A%20ID%2C%20isDown%20%3A%20down%2C%20timeClick%20%3A%20Date.now()%20%7D%3B%0A%20%20%20%20%20%20else%20delete%20this.varButtonStatus%5BID%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20isButtonPressed(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20if%20(this.varButtonStatus%5BvariableId%5D%20!%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22held%22)%20return%20true%3B%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20date%20%3D%20this.varButtonStatus%5BvariableId%5D.timeClick%3B%0A%20%20%20%20%20%20%20%20%20%20let%20now%20%3D%20Date.now()%3B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Ingore%20last%203%20digits%20of%20the%20times%20as%20hats%20arent%20instant%0A%20%20%20%20%20%20%20%20%20%20date%20%3D%20Math.floor(date%20%2F%201000)%3B%0A%20%20%20%20%20%20%20%20%20%20now%20%3D%20Math.floor(now%20%2F%201000)%3B%0A%20%20%20%20%20%20%20%20%20%20return%20Scratch.Cast.toBoolean(date%20%3D%3D%3D%20now)%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%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20whenButtonPressed(args%2C%20util)%20%7B%20return%20this.isButtonPressed(args%2C%20util)%20%7D%0A%0A%20%20%20%20getVariableType(args%2C%20util)%20%7B%20return%20this.getMonitor(args.VARIABLE%2C%20util)%20%7D%0A%0A%20%20%20%20getMonitor(variable%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(variable%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%20%22normal%20readout%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22input%5Btype%3D%5C%22range%5C%22%5D%22))%20return%20%22slider%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22input%5Btype%3D%5C%22text%5C%22%5D%22))%20return%20%22text%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22input%5Btype%3D%5C%22checkbox%5C%22%5D%22))%20return%20%22checkbox%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22input%5Btype%3D%5C%22color%5C%22%5D%22))%20return%20%22color%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22input%5Btype%3D%5C%22button%5C%22%5D%22))%20return%20%22button%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22input%5Btype%3D%5C%22file%5C%22%5D%22))%20return%20%22file%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22img%22))%20return%20%22image%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%22audio%22))%20return%20%22audio%22%3B%0A%20%20%20%20%20%20if%20(variableMonitor.querySelector(%60%5Bclass%5E%3D%22monitor_large-value_%22%5D%60))%20return%20%22large%20readout%22%3B%0A%20%20%20%20%20%20return%20%22normal%20readout%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20setDisplay(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20type%20%3D%20this.getMonitor(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20let%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20if%20(type.includes(%22readout%22)%20%7C%7C%20type%20%3D%3D%3D%20%22slider%22)%20%7B%0A%20%20%20%20%20%20%20%20const%20variableMonitorLabel%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%20%5Bclass%5E%3D%22monitor_label%22%5D%60)%3B%0A%20%20%20%20%20%20%20%20if%20(variableMonitorLabel)%20variableMonitorLabel.textContent%20%3D%20args.NAME%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20await%20this.setMonitor(args.VARIABLE%2C%20util%2C%20args.NAME%2C%20type)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setFont(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%3B%0A%20%20%20%20%20%20variableMonitor.style.fontFamily%20%3D%20args.FONT%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetEffect(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%3B%0A%20%20%20%20%20%20let%20currentTransform%20%3D%20variableMonitor.style.transform%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20this.resetEffects(variableId%2C%20currentTransform)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setEffect(args%2C%20util)%20%7B%20this.varEffect(args.VARIABLE%2C%20args.EFFECT%2C%20args.AMOUNT%2C%20util)%20%7D%0A%0A%20%20%20%20varEffect(VARIABLE%2C%20EFFECT%2C%20AMOUNT%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%3B%0A%20%20%20%20%20%20let%20currentTransform%20%3D%20variableMonitor.style.transform%3B%0A%20%20%20%20%20%20let%20currentFilterEffect%20%3D%20variableMonitor.style.filter%20%7C%7C%20%22%22%3B%0A%20%20%20%20%20%20if%20(EFFECT%20%3D%3D%3D%20%22saturation%22)%20EFFECT%20%3D%20%22saturate%22%3B%0A%20%20%20%20%20%20else%20if%20(EFFECT%20%3D%3D%3D%20%22hue%22)%20EFFECT%20%3D%20%22hue-rotate%22%3B%0A%20%20%20%20%20%20else%20if%20(EFFECT%20%3D%3D%3D%20%22direction%22)%20%7B%0A%20%20%20%20%20%20%20%20EFFECT%20%3D%20%22rotate%22%3B%0A%20%20%20%20%20%20%20%20AMOUNT%20%3D%20AMOUNT%20-%2090%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(EFFECT%20%3D%3D%3D%20%22scale%22%20%7C%7C%20EFFECT%20%3D%3D%3D%20%22scale%20x%22%20%7C%7C%20EFFECT%20%3D%3D%3D%20%22scale%20y%22)%20%7B%0A%20%20%20%20%20%20%20%20AMOUNT%20%3D%20AMOUNT%20%2F%20100%3B%0A%20%20%20%20%20%20%20%20EFFECT%20%3D%20EFFECT.replace(%22x%22%2C%20%22X%22).replace(%22y%22%2C%20%22Y%22).replaceAll(%22%20%22%2C%20%22%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20if%20(EFFECT%20%3D%3D%3D%20%22brightness%22)%20AMOUNT%20%3D%20AMOUNT%20%2B%20100%3B%0A%20%20%20%20%20%20else%20if%20(EFFECT%20%3D%3D%3D%20%22skew%20x%22)%20EFFECT%20%3D%20%22skewX%22%3B%0A%20%20%20%20%20%20else%20if%20(EFFECT%20%3D%3D%3D%20%22skew%20y%22)%20EFFECT%20%3D%20%22skewY%22%3B%0A%0A%20%20%20%20%20%20const%20regex%20%3D%20new%20RegExp(%60%24%7BEFFECT%7D%5C%5C(%5B%5E)%5D%2B%5C%5C)%60%2C%20%22g%22)%3B%0A%20%20%20%20%20%20currentTransform%20%3D%20currentTransform.replace(regex%2C%20%22%22).trim()%3B%0A%20%20%20%20%20%20currentFilterEffect%20%3D%20currentFilterEffect.replace(regex%2C%20%22%22).trim()%3B%0A%20%20%20%20%20%20if%20(EFFECT.includes(%22scale%22)%20%7C%7C%20EFFECT%20%3D%3D%3D%20%22rotate%22%20%7C%7C%20EFFECT.includes(%22skew%22))%20%7B%0A%20%20%20%20%20%20%20%20currentTransform%20%2B%3D%20%60%20%24%7BEFFECT%7D(%24%7BAMOUNT%7D%24%7BEFFECT%20%3D%3D%3D%20%22rotate%22%20%7C%7C%20EFFECT.includes(%22skew%22)%20%3F%20%22deg%22%20%3A%20%22%22%7D)%60%3B%0A%20%20%20%20%20%20%20%20variableMonitor.style.transform%20%3D%20currentTransform.trim()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20currentFilterEffect%20%2B%3D%20%60%20%24%7BEFFECT%7D(%24%7BAMOUNT%7D%24%7BEFFECT%20%3D%3D%3D%20%22blur%22%20%3F%20%22px%22%20%3A%20EFFECT%20%3D%3D%3D%20%22hue-rotate%22%20%3F%20%22deg%22%20%3A%20%22%25%22%7D)%60%3B%0A%20%20%20%20%20%20%20%20variableMonitor.style.filter%20%3D%20currentFilterEffect.trim()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20currentEffect(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20variableId%20%3D%20this.findVariable(args.VARIABLE%2C%20util)%3B%0A%20%20%20%20%20%20const%20variableMonitor%20%3D%20document.querySelector(%60%5Bdata-id%3D%22%24%7BvariableId%7D%22%5D%5Bclass*%3D%22monitor%22%5D%60)%3B%0A%20%20%20%20%20%20if%20(!variableMonitor)%20return%20%22%22%3B%0A%20%20%20%20%20%20const%20currentTransform%20%3D%20variableMonitor.style.transform%3B%0A%20%20%20%20%20%20const%20currentFilterEffect%20%3D%20variableMonitor.style.filter%20%7C%7C%20%22%22%3B%0A%20%20%20%20%0A%20%20%20%20%20%20const%20setEffect%20%3D%20%7B%0A%20%20%20%20%20%20%20%20saturation%3A%20%22saturate%22%2C%20hue%3A%20%22hue-rotate%22%2C%0A%20%20%20%20%20%20%20%20direction%3A%20%22rotate%22%2C%20scale%3A%20%22scale%22%2C%20%22scale%20x%22%3A%20%22scaleX%22%2C%20%22scale%20y%22%3A%20%22scaleY%22%2C%0A%20%20%20%20%20%20%20%20brightness%3A%20%22brightness%22%2C%20opacity%3A%20%22opacity%22%2C%0A%20%20%20%20%20%20%20%20%22skew%20x%22%3A%20%22skewX%22%2C%20%22skew%20y%22%3A%20%22skewY%22%2C%0A%20%20%20%20%20%20%7D%5Bargs.EFFECT%5D%20%7C%7C%20args.EFFECT%3B%0A%20%20%20%20%20%20const%20defaultV%20%3D%20%7B%0A%20%20%20%20%20%20%20%20saturation%3A%20100%2C%20hue%3A%200%2C%0A%20%20%20%20%20%20%20%20direction%3A%2090%2C%20scale%3A%20100%2C%20%22scale%20x%22%3A%20100%2C%20%22scale%20y%22%3A%20100%2C%0A%20%20%20%20%20%20%20%20brightness%3A%200%2C%20opacity%3A%20100%2C%0A%20%20%20%20%20%20%7D%5Bargs.EFFECT%5D%20%7C%7C%200%3B%0A%20%20%20%20%0A%20%20%20%20%20%20const%20regex%20%3D%20new%20RegExp(%60%24%7BsetEffect%7D%5C%5C((%5B%5E)%5D%2B)%5C%5C)%60)%3B%0A%20%20%20%20%20%20const%20transformMatch%20%3D%20currentTransform.match(regex)%3B%0A%20%20%20%20%20%20const%20filterMatch%20%3D%20currentFilterEffect.match(regex)%3B%0A%20%20%20%20%20%20if%20(filterMatch%20%7C%7C%20transformMatch)%20%7B%0A%20%20%20%20%20%20%20%20const%20valueWithUnits%20%3D%20(filterMatch%20%7C%7C%20transformMatch)%5B1%5D%3B%0A%20%20%20%20%20%20%20%20const%20numericValue%20%3D%20parseFloat(valueWithUnits.replace(%2F%5B%5E0-9.-%5D%2Fg%2C%20%22%22))%3B%0A%20%20%20%20%20%20%20%20if%20(setEffect%20%3D%3D%3D%20%22brightness%22)%20return%20numericValue%20-%20100%3B%0A%20%20%20%20%20%20%20%20else%20if%20(setEffect%20%3D%3D%3D%20%22rotate%22)%20return%20numericValue%20%2B%2090%3B%0A%20%20%20%20%20%20%20%20else%20if%20(setEffect.includes(%22scale%22))%20return%20numericValue%20*%20100%3B%0A%20%20%20%20%20%20%20%20else%20return%20numericValue%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20return%20defaultV%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20MonitorsPlus())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B"]) {
vm.extensionManager.loadExtensionURL(extension);
}
vm.runtime.isProjectPermissionManagerDisabled = true;
} catch (e) {
handleError(e);
}
</script>
<script>
const getProjectData = (function() {
const storage = scaffolding.storage;
storage.onprogress = (total, loaded) => {
setProgress(interpolate(0.2, 0.98, loaded / total));
};
storage.addWebStore(
[
storage.AssetType.ImageVector,
storage.AssetType.ImageBitmap,
storage.AssetType.Sound,
storage.AssetType.Font
].filter(i => i),
(asset) => new URL('./assets/' + asset.assetId + '.' + asset.dataFormat, location).href
);
return () => new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onload = () => {
resolve(xhr.response);
};
xhr.onerror = () => {
if (location.protocol === 'file:') {
reject(new Error('Zip environment must be used from a website, not from a file URL.'));
} else {
reject(new Error('Request to load project data failed.'));
}
};
xhr.onprogress = (e) => {
if (e.lengthComputable) {
setProgress(interpolate(0.1, 0.2, e.loaded / e.total));
}
};
xhr.responseType = 'arraybuffer';
xhr.open('GET', "./assets/project.json");
xhr.send();
});
})();
</script>
<script>
const run = async () => {
const projectData = await getProjectData();
await scaffolding.loadProject(projectData);
setProgress(1);
loadingScreen.hidden = true;
if (true) {
scaffolding.start();
} else {
launchScreen.hidden = false;
launchScreen.addEventListener('click', () => {
launchScreen.hidden = true;
scaffolding.start();
});
launchScreen.focus();
}
};
run().catch(handleError);
</script>
</body>
</html>