-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
328 lines (304 loc) · 521 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
328
<!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>PenguinAudio NEW</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">
</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 class="progress-bar-outer"><div class="progress-bar-inner" id="loading-inner"></div></div>
</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 = 480;
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-@PenguinAudio NEW.pmp"));
} catch (error) {
console.error(error);
}
vm.setTurboMode(false);
if (vm.setInterpolation) vm.setInterpolation(false);
if (vm.setFramerate) vm.setFramerate(30);
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,%2F%2F%20DTMF%20Tone%20frequencies%20for%20each%20number%0Aconst%20dtmfFrequencies%20%3D%20%7B%0A%20%20%20%20'1'%3A%20%5B697%2C%201209%5D%2C%0A%20%20%20%20'2'%3A%20%5B697%2C%201336%5D%2C%0A%20%20%20%20'3'%3A%20%5B697%2C%201477%5D%2C%0A%20%20%20%20'4'%3A%20%5B770%2C%201209%5D%2C%0A%20%20%20%20'5'%3A%20%5B770%2C%201336%5D%2C%0A%20%20%20%20'6'%3A%20%5B770%2C%201477%5D%2C%0A%20%20%20%20'7'%3A%20%5B852%2C%201209%5D%2C%0A%20%20%20%20'8'%3A%20%5B852%2C%201336%5D%2C%0A%20%20%20%20'9'%3A%20%5B852%2C%201477%5D%2C%0A%20%20%20%20'*'%3A%20%5B941%2C%201209%5D%2C%0A%20%20%20%20'0'%3A%20%5B941%2C%201336%5D%2C%0A%20%20%20%20'%23'%3A%20%5B941%2C%201477%5D%0A%7D%3B%0A%0Alet%20audioContext%3B%0Alet%20currentPlayingDigit%20%3D%20null%3B%20%2F%2F%20Track%20the%20currently%20playing%20digit%0Alet%20oscillators%20%3D%20%7B%7D%3B%0A%0A%2F%2F%20Helper%20function%20to%20start%20a%20DTMF%20tone%0Afunction%20playDTMFTone(digit)%20%7B%0A%20%20%20%20if%20(!dtmfFrequencies%5Bdigit%5D)%20return%3B%0A%0A%20%20%20%20%2F%2F%20If%20a%20tone%20is%20already%20playing%2C%20stop%20it%20before%20playing%20a%20new%20one%0A%20%20%20%20if%20(currentPlayingDigit%20!%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20stopDTMFTone(currentPlayingDigit)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20%5BlowFreq%2C%20highFreq%5D%20%3D%20dtmfFrequencies%5Bdigit%5D%3B%0A%0A%20%20%20%20%2F%2F%20Create%20audio%20context%20if%20it%20doesn't%20exist%0A%20%20%20%20if%20(!audioContext)%20%7B%0A%20%20%20%20%20%20%20%20audioContext%20%3D%20new%20(window.AudioContext%20%7C%7C%20window.webkitAudioContext)()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Create%20two%20oscillators%20for%20the%20two%20frequencies%0A%20%20%20%20const%20lowOscillator%20%3D%20audioContext.createOscillator()%3B%0A%20%20%20%20const%20highOscillator%20%3D%20audioContext.createOscillator()%3B%0A%0A%20%20%20%20%2F%2F%20Set%20the%20frequency%20values%0A%20%20%20%20lowOscillator.frequency.setValueAtTime(lowFreq%2C%20audioContext.currentTime)%3B%0A%20%20%20%20highOscillator.frequency.setValueAtTime(highFreq%2C%20audioContext.currentTime)%3B%0A%0A%20%20%20%20%2F%2F%20Create%20gain%20node%20to%20control%20volume%0A%20%20%20%20const%20gainNode%20%3D%20audioContext.createGain()%3B%0A%20%20%20%20gainNode.gain.setValueAtTime(0.1%2C%20audioContext.currentTime)%3B%0A%0A%20%20%20%20%2F%2F%20Connect%20oscillators%20to%20gain%20node%2C%20then%20to%20audio%20output%0A%20%20%20%20lowOscillator.connect(gainNode)%3B%0A%20%20%20%20highOscillator.connect(gainNode)%3B%0A%20%20%20%20gainNode.connect(audioContext.destination)%3B%0A%0A%20%20%20%20%2F%2F%20Start%20oscillators%0A%20%20%20%20lowOscillator.start()%3B%0A%20%20%20%20highOscillator.start()%3B%0A%0A%20%20%20%20%2F%2F%20Store%20oscillators%20so%20we%20can%20stop%20them%20later%0A%20%20%20%20oscillators%5Bdigit%5D%20%3D%20%7B%20lowOscillator%2C%20highOscillator%2C%20gainNode%20%7D%3B%0A%0A%20%20%20%20%2F%2F%20Update%20the%20currently%20playing%20digit%0A%20%20%20%20currentPlayingDigit%20%3D%20digit%3B%0A%7D%0A%0A%2F%2F%20Helper%20function%20to%20stop%20a%20DTMF%20tone%0Afunction%20stopDTMFTone(digit)%20%7B%0A%20%20%20%20if%20(oscillators%5Bdigit%5D)%20%7B%0A%20%20%20%20%20%20%20%20const%20%7B%20lowOscillator%2C%20highOscillator%2C%20gainNode%20%7D%20%3D%20oscillators%5Bdigit%5D%3B%0A%20%20%20%20%20%20%20%20lowOscillator.stop()%3B%0A%20%20%20%20%20%20%20%20highOscillator.stop()%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Disconnect%20everything%0A%20%20%20%20%20%20%20%20lowOscillator.disconnect()%3B%0A%20%20%20%20%20%20%20%20highOscillator.disconnect()%3B%0A%20%20%20%20%20%20%20%20gainNode.disconnect()%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Clean%20up%0A%20%20%20%20%20%20%20%20delete%20oscillators%5Bdigit%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Reset%20the%20currently%20playing%20digit%0A%20%20%20%20if%20(digit%20%3D%3D%3D%20currentPlayingDigit)%20%7B%0A%20%20%20%20%20%20%20%20currentPlayingDigit%20%3D%20null%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2F%20Helper%20function%20to%20stop%20all%20tones%0Afunction%20stopAllTones()%20%7B%0A%20%20%20%20if%20(currentPlayingDigit%20!%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20stopDTMFTone(currentPlayingDigit)%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2F%20Define%20the%20blocks%20for%20TurboWarp%0Aclass%20DTMFExtension%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20id%3A%20'dtmfExtension'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20'DTMF%20Tones'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20'playTone'%2C%0A%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20text%3A%20'play%20DTMF%20tone%20%5BDIGIT%5D'%2C%0A%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20%20%20DIGIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'1'%0A%20%20%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20'stopTone'%2C%0A%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20text%3A%20'stop%20DTMF%20tone%20%5BDIGIT%5D'%2C%0A%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20%20%20DIGIT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'1'%0A%20%20%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20'stopAllTones'%2C%0A%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20text%3A%20'stop%20all%20DTMF%20tones'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20'currentDigit'%2C%0A%20%20%20%20%20%20%20%20%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%20%20%20%20%20%20%20%20%20text%3A%20'current%20digit'%0A%20%20%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%5D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Block%20to%20play%20a%20DTMF%20tone%0A%20%20%20%20playTone(%7B%20DIGIT%20%7D)%20%7B%0A%20%20%20%20%20%20%20%20playDTMFTone(DIGIT)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Block%20to%20stop%20a%20DTMF%20tone%0A%20%20%20%20stopTone(%7B%20DIGIT%20%7D)%20%7B%0A%20%20%20%20%20%20%20%20stopDTMFTone(DIGIT)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Block%20to%20stop%20all%20DTMF%20tones%0A%20%20%20%20stopAllTones()%20%7B%0A%20%20%20%20%20%20%20%20stopAllTones()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Reporter%20block%20to%20get%20the%20current%20digit%20(you%20can%20store%20a%20last%20played%20digit%20if%20needed)%0A%20%20%20%20currentDigit()%20%7B%0A%20%20%20%20%20%20%20%20return%20currentPlayingDigit%20%7C%7C%20%22none%22%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2F%20Register%20the%20extension%0AScratch.extensions.register(new%20DTMFExtension())%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Fetch%0A%2F%2F%20ID%3A%20fetch%0A%2F%2F%20Description%3A%20Make%20requests%20to%20the%20broader%20internet.%0A%2F%2F%20License%3A%20MIT%20AND%20MPL-2.0%0A%0A%2F*%20generated%20l10n%20code%20*%2FScratch.translate.setup(%7B%22de%22%3A%7B%22_Fetch%22%3A%22Internetquests%22%7D%2C%22fi%22%3A%7B%22_Fetch%22%3A%22Datan%20haku%22%7D%2C%22ja%22%3A%7B%22_Fetch%22%3A%22%E3%83%95%E3%82%A7%E3%83%83%E3%83%81%22%7D%2C%22nb%22%3A%7B%22_Fetch%22%3A%22Hent%22%7D%2C%22ru%22%3A%7B%22_Fetch%22%3A%22%D0%9F%D0%BE%D0%B8%D0%BC%D0%BA%D0%B0%22%7D%2C%22zh-cn%22%3A%7B%22_Fetch%22%3A%22%E8%AF%B7%E6%B1%82API%22%7D%7D)%3B%2F*%20end%20generated%20l10n%20code%20*%2F(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20class%20Fetch%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22fetch%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20Scratch.translate(%22Fetch%22)%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22get%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%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%2Fextensions.turbowarp.org%2Fhello.txt%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20get(args)%20%7B%0A%20%20%20%20%20%20return%20Scratch.fetch(args.URL)%0A%20%20%20%20%20%20%20%20.then((r)%20%3D%3E%20r.text())%0A%20%20%20%20%20%20%20%20.catch(()%20%3D%3E%20%22%22)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20Fetch())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20HTTP%0A%2F%2F%20ID%3A%20gsaHTTPRequests%0A%2F%2F%20Description%3A%20Comprehensive%20extension%20for%20interacting%20with%20external%20websites.%0A%2F%2F%20By%3A%20RedMan13%20%3Chttps%3A%2F%2Fscratch.mit.edu%2Fusers%2FRedMan13%2F%3E%0A%2F%2F%20License%3A%20MIT%0A%0A%2F*%20generated%20l10n%20code%20*%2FScratch.translate.setup(%7B%22fi%22%3A%7B%22_Hide%20Extra%22%3A%22Piilota%20lis%C3%A4lohkot%22%2C%22_Request%22%3A%22Pyynt%C3%B6%22%2C%22_Response%22%3A%22Vastaus%22%2C%22_Show%20Extra%22%3A%22N%C3%A4yt%C3%A4%20lis%C3%A4lohkot%22%2C%22_%5Bname%5D%20from%20header%22%3A%22%5Bname%5D%20otsakkeesta%22%2C%22_%5Bname%5D%20in%20request%20form%22%3A%22pyynt%C3%B6lomakkeen%20%5Bname%5D%22%2C%22_%5Bpath%5D%20in%20request%20options%22%3A%22pyynt%C3%B6asetusten%20%5Bpath%5D%22%2C%22_clear%20current%20data%22%3A%22tyhjenn%C3%A4%20nykyiset%20tiedot%22%2C%22_delete%20%5Bname%5D%20from%20request%20form%22%3A%22poista%20%5Bname%5D%20pyynt%C3%B6lomakkeesta%22%2C%22_error%22%3A%22virhe%22%2C%22_headers%20as%20json%22%3A%22otsakkeet%20JSON-muodossa%22%2C%22_in%20header%20set%20%5Bname%5D%20to%20%5Bvalue%5D%22%3A%22aseta%20otsakkeen%20%5Bname%5D%20arvoon%20%5Bvalue%5D%22%2C%22_request%20failed%3F%22%3A%22ep%C3%A4onnistuiko%20pyynt%C3%B6%3F%22%2C%22_request%20succeeded%3F%22%3A%22onnistuiko%20pyynt%C3%B6%3F%22%2C%22_response%22%3A%22vastaus%22%2C%22_send%20request%20to%20%5Burl%5D%22%3A%22l%C3%A4het%C3%A4%20pyynt%C3%B6%20osoitteeseen%20%5Burl%5D%22%2C%22_set%20%5Bname%5D%20to%20%5Bvalue%5D%20in%20request%20form%22%3A%22aseta%20pyynt%C3%B6lomakkeen%20%5Bname%5D%20arvoon%20%5Bvalue%5D%22%2C%22_set%20%5Bpath%5D%20to%20%5Bvalue%5D%20in%20request%20options%22%3A%22aseta%20pyynt%C3%B6asetusten%20%5Bpath%5D%20arvoon%20%5Bvalue%5D%22%2C%22_set%20%5Bpath%5D%20to%20type%20%5Btype%5D%20in%20request%20options%22%3A%22aseta%20pyynt%C3%B6asetusten%20kohteen%20%5Bpath%5D%20tyypiksi%20%5Btype%5D%22%2C%22_set%20content%20type%20to%20%5Btype%5D%22%3A%22aseta%20sis%C3%A4ll%C3%B6n%20tyypiksi%20%5Btype%5D%22%2C%22_set%20headers%20to%20json%20%5Bjson%5D%22%3A%22aseta%20otsakkeet%20JSON-koodiksi%20%5Bjson%5D%22%2C%22_set%20request%20body%20to%20%5Btext%5D%22%3A%22aseta%20pyynn%C3%B6n%20rungoksi%20%5Btext%5D%22%2C%22_set%20request%20body%20to%20a%20form%22%3A%22aseta%20pyynn%C3%B6n%20runko%20lomakkeeksi%22%2C%22_set%20request%20method%20to%20%5Bmethod%5D%22%3A%22aseta%20pyynt%C3%B6menetelm%C3%A4ksi%20%5Bmethod%5D%22%2C%22_site%20responded%3F%22%3A%22vastasiko%20sivusto%3F%22%2C%22_status%22%3A%22tila%22%2C%22_status%20text%22%3A%22tilateksti%22%2C%22_type%20of%20%5Bpath%5D%20in%20request%20options%22%3A%22pyynt%C3%B6asetusten%20kohteen%20%5Bpath%5D%20tyyppi%22%2C%22_when%20a%20request%20fails%22%3A%22kun%20pyynt%C3%B6%20ep%C3%A4onnistuu%22%2C%22_when%20a%20site%20responds%22%3A%22kun%20sivusto%20vastaa%22%7D%2C%22it%22%3A%7B%22_status%22%3A%22stato%22%7D%2C%22ko%22%3A%7B%22_Request%22%3A%22%EC%9A%94%EC%B2%AD%22%2C%22_Response%22%3A%22%EC%9D%91%EB%8B%B5%22%2C%22_%5Bname%5D%20from%20header%22%3A%22%ED%97%A4%EB%8D%94%20%5Bname%5D%22%2C%22_error%22%3A%22%EC%98%A4%EB%A5%98%22%2C%22_headers%20as%20json%22%3A%22%ED%97%A4%EB%8D%94%EB%A5%BC%20json%EC%9C%BC%EB%A1%9C%22%2C%22_in%20header%20set%20%5Bname%5D%20to%20%5Bvalue%5D%22%3A%22%ED%97%A4%EB%8D%94%EC%9D%98%20%5Bname%5D%EC%9D%84(%EB%A5%BC)%20%5Bvalue%5D(%EC%9C%BC)%EB%A1%9C%20%EC%A0%95%ED%95%98%EA%B8%B0%22%2C%22_request%20failed%3F%22%3A%22%EC%9A%94%EC%B2%AD%EC%9D%B4%20%EC%8B%A4%ED%8C%A8%ED%96%88%EB%8A%94%EA%B0%80%3F%22%2C%22_request%20succeeded%3F%22%3A%22%EC%9A%94%EC%B2%AD%EC%9D%B4%20%EC%84%B1%EA%B3%B5%ED%96%88%EB%8A%94%EA%B0%80%3F%22%2C%22_response%22%3A%22%EC%9D%91%EB%8B%B5%22%2C%22_send%20request%20to%20%5Burl%5D%22%3A%22%5Burl%5D(%EC%9C%BC)%EB%A1%9C%20%EC%9A%94%EC%B2%AD%20%EB%B3%B4%EB%82%B4%EA%B8%B0%20%20%22%2C%22_set%20headers%20to%20json%20%5Bjson%5D%22%3A%22%ED%97%A4%EB%8D%94%EB%A5%BC%20%5Bjson%5D%20json%EC%9C%BC%EB%A1%9C%20%EC%A0%95%ED%95%98%EA%B8%B0%22%2C%22_set%20request%20method%20to%20%5Bmethod%5D%22%3A%22%EC%9A%94%EC%B2%AD%20%EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC%20%5Bmethod%5D(%EC%9C%BC)%EB%A1%9C%20%EC%A0%95%ED%95%98%EA%B8%B0%22%2C%22_site%20responded%3F%22%3A%22%EC%82%AC%EC%9D%B4%ED%8A%B8%EA%B0%80%20%EC%9D%91%EB%8B%B5%ED%96%88%EB%8A%94%EA%B0%80%3F%22%2C%22_status%22%3A%22%EC%83%81%ED%83%9C%22%2C%22_status%20text%22%3A%22%EC%83%81%ED%83%9C%20%EB%A9%94%EC%8B%9C%EC%A7%80%22%2C%22_when%20a%20request%20fails%22%3A%22%EC%9A%94%EC%B2%AD%EC%9D%B4%20%EC%8B%A4%ED%8C%A8%ED%96%88%EC%9D%84%20%EB%95%8C%22%2C%22_when%20a%20site%20responds%22%3A%22%EC%82%AC%EC%9D%B4%ED%8A%B8%EA%B0%80%20%EC%9D%91%EB%8B%B5%ED%96%88%EC%9D%84%20%EB%95%8C%22%7D%2C%22ru%22%3A%7B%22_Hide%20Extra%22%3A%22%D0%A1%D0%BA%D1%80%D1%8B%D1%82%D1%8C%20%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%22%2C%22_Request%22%3A%22%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81%22%2C%22_Response%22%3A%22%D0%9E%D1%82%D0%B2%D0%B5%D1%82%22%2C%22_Show%20Extra%22%3A%22%D0%9F%D0%BE%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C%20%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%22%2C%22_%5Bname%5D%20from%20header%22%3A%22%5Bname%5D%20%D0%B8%D0%B7%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B0%22%2C%22_%5Bname%5D%20in%20request%20form%22%3A%22%5Bname%5D%20%D0%B2%20%D1%84%D0%BE%D1%80%D0%BC%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_%5Bpath%5D%20in%20request%20options%22%3A%22%5Bpath%5D%20%D0%B2%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_clear%20current%20data%22%3A%22%D0%BE%D1%82%D1%87%D0%B8%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%22%2C%22_delete%20%5Bname%5D%20from%20request%20form%22%3A%22%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%5Bname%5D%20%D0%B8%D0%B7%20%D1%84%D0%BE%D1%80%D0%BC%D1%8B%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_error%22%3A%22%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%22%2C%22_headers%20as%20json%22%3A%22%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BA%D0%B0%D0%BA%20json%22%2C%22_in%20header%20set%20%5Bname%5D%20to%20%5Bvalue%5D%22%3A%22%D0%B2%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B5%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%5Bname%5D%20%D0%BD%D0%B0%20%5Bvalue%5D%22%2C%22_request%20failed%3F%22%3A%22%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B0%D0%BB%D0%B8%D0%BB%D1%81%D1%8F%3F%22%2C%22_request%20succeeded%3F%22%3A%22%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D1%83%D1%81%D0%BF%D0%B5%D1%88%D0%B5%D0%BD%3F%22%2C%22_response%22%3A%22%D0%BE%D1%82%D0%B2%D0%B5%D1%82%22%2C%22_send%20request%20to%20%5Burl%5D%22%3A%22%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D0%BD%D0%B0%20%5Burl%5D%22%2C%22_set%20%5Bname%5D%20to%20%5Bvalue%5D%20in%20request%20form%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%5Bname%5D%20%D0%BD%D0%B0%20%5Bvalue%5D%20%D0%B2%20%D1%84%D0%BE%D1%80%D0%BC%D0%B5%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_set%20%5Bpath%5D%20to%20%5Bvalue%5D%20in%20request%20options%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%5Bpath%5D%20%D0%BD%D0%B0%20%5Bvalue%5D%20%D0%B2%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_set%20%5Bpath%5D%20to%20type%20%5Btype%5D%20in%20request%20options%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%5Bpath%5D%20%D0%BD%D0%B0%20%D1%82%D0%B8%D0%BF%20%5Btype%5D%20%D0%B2%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_set%20content%20type%20to%20%5Btype%5D%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D1%82%D0%B8%D0%BF%20%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%D0%B0%20%D0%BD%D0%B0%20%5Btype%5D%22%2C%22_set%20headers%20to%20json%20%5Bjson%5D%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BD%D0%B0%20json%20%5Bjson%5D%22%2C%22_set%20request%20body%20to%20%5Btext%5D%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D1%82%D0%B5%D0%BB%D0%BE%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%20%D0%BD%D0%B0%20%5Btext%5D%22%2C%22_set%20request%20body%20to%20a%20form%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D1%82%D0%B5%D0%BB%D0%BE%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%20%D0%BD%D0%B0%20%D1%84%D0%BE%D1%80%D0%BC%D1%83%22%2C%22_set%20request%20method%20to%20%5Bmethod%5D%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%20%D0%BD%D0%B0%20%5Bmethod%5D%22%2C%22_site%20responded%3F%22%3A%22%D1%81%D0%B0%D0%B9%D1%82%20%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%B8%D0%BB%3F%22%2C%22_status%22%3A%22%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%22%2C%22_status%20text%22%3A%22%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D0%B0%22%2C%22_type%20of%20%5Bpath%5D%20in%20request%20options%22%3A%22%D1%82%D0%B8%D0%BF%20%5Bpath%5D%20%D0%B2%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%22%2C%22_when%20a%20request%20fails%22%3A%22%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D0%B7%D0%B0%D0%B2%D0%B0%D0%BB%D0%B8%D0%BB%D1%81%D1%8F%22%2C%22_when%20a%20site%20responds%22%3A%22%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D0%B0%D0%B9%D1%82%20%D0%BE%D1%82%D0%B2%D0%B5%D1%87%D0%B0%D0%B5%D1%82%22%7D%2C%22zh-cn%22%3A%7B%22_Hide%20Extra%22%3A%22%E9%9A%90%E8%97%8F%E6%9B%B4%E5%A4%9A%22%2C%22_Request%22%3A%22%E8%AF%B7%E6%B1%82%22%2C%22_Response%22%3A%22%E5%93%8D%E5%BA%94%22%2C%22_Show%20Extra%22%3A%22%E6%98%BE%E7%A4%BA%E6%9B%B4%E5%A4%9A%22%2C%22_%5Bname%5D%20from%20header%22%3A%22%E8%AF%B7%E6%B1%82%E5%A4%B4%E7%9A%84%5Bname%5D%22%2C%22_%5Bname%5D%20in%20request%20form%22%3A%22%E8%AF%B7%E6%B1%82%E8%A1%A8%E5%8D%95%E4%B8%AD%E7%9A%84%5Bname%5D%22%2C%22_%5Bpath%5D%20in%20request%20options%22%3A%22%E8%AF%B7%E6%B1%82%E9%80%89%E9%A1%B9%E7%9A%84%5Bpath%5D%22%2C%22_clear%20current%20data%22%3A%22%E6%B8%85%E7%A9%BA%E5%BD%93%E5%89%8D%E6%95%B0%E6%8D%AE%22%2C%22_delete%20%5Bname%5D%20from%20request%20form%22%3A%22%E4%BB%8E%E8%AF%B7%E6%B1%82%E8%A1%A8%E5%8D%95%E5%88%A0%E9%99%A4%5Bname%5D%22%2C%22_error%22%3A%22%E9%94%99%E8%AF%AF%22%2C%22_headers%20as%20json%22%3A%22%E8%AF%B7%E6%B1%82%E5%A4%B4json%22%2C%22_in%20header%20set%20%5Bname%5D%20to%20%5Bvalue%5D%22%3A%22%E5%9C%A8%E8%AF%B7%E6%B1%82%E5%A4%B4%E4%B8%AD%E8%AE%BE%E7%BD%AE%5Bname%5D%E4%B8%BA%5Bvalue%5D%22%2C%22_request%20failed%3F%22%3A%22%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%EF%BC%9F%22%2C%22_request%20succeeded%3F%22%3A%22%E8%AF%B7%E6%B1%82%E6%88%90%E5%8A%9F%EF%BC%9F%22%2C%22_response%22%3A%22%E5%93%8D%E5%BA%94%22%2C%22_send%20request%20to%20%5Burl%5D%22%3A%22%E5%8F%91%E9%80%81%E8%AF%B7%E6%B1%82%E7%BB%99%5Burl%5D%22%2C%22_set%20%5Bname%5D%20to%20%5Bvalue%5D%20in%20request%20form%22%3A%22%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E8%A1%A8%E5%8D%95%E4%B8%AD%E7%9A%84%5Bname%5D%E4%B8%BA%5Bvalue%5D%22%2C%22_set%20%5Bpath%5D%20to%20%5Bvalue%5D%20in%20request%20options%22%3A%22%E5%B0%86%E8%AF%B7%E6%B1%82%E9%80%89%E9%A1%B9%E4%B8%AD%E7%9A%84%5Bpath%5D%E8%AE%BE%E4%B8%BA%5Bvalue%5D%22%2C%22_set%20%5Bpath%5D%20to%20type%20%5Btype%5D%20in%20request%20options%22%3A%22%E5%B0%86%E8%AF%B7%E6%B1%82%E9%80%89%E9%A1%B9%E7%9A%84%5Bpath%5D%E8%AE%BE%E4%B8%BA%E7%B1%BB%E5%9E%8B%5Btype%5D%22%2C%22_set%20content%20type%20to%20%5Btype%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E5%86%85%E5%AE%B9%E7%B1%BB%E5%9E%8B%E4%B8%BA%5Btype%5D%22%2C%22_set%20headers%20to%20json%20%5Bjson%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E5%A4%B4%E4%B8%BAjson%5Bjson%5D%22%2C%22_set%20request%20body%20to%20%5Btext%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E4%BD%93%E4%B8%BA%5Btext%5D%22%2C%22_set%20request%20body%20to%20a%20form%22%3A%22%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E4%BD%93%E4%B8%BA%E8%A1%A8%E5%8D%95%22%2C%22_set%20request%20method%20to%20%5Bmethod%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E6%96%B9%E6%B3%95%E4%B8%BA%5Bmethod%5D%22%2C%22_site%20responded%3F%22%3A%22%E7%BD%91%E7%AB%99%E5%93%8D%E5%BA%94%EF%BC%9F%22%2C%22_status%22%3A%22%E5%B0%81%E7%A6%81%E7%8A%B6%E6%80%81%22%2C%22_status%20text%22%3A%22%E7%8A%B6%E6%80%81%E6%96%87%E6%9C%AC%22%2C%22_type%20of%20%5Bpath%5D%20in%20request%20options%22%3A%22%E8%AF%B7%E6%B1%82%E9%80%89%E9%A1%B9%E4%B8%AD%5Bpath%5D%E7%9A%84%E7%B1%BB%E5%9E%8B%22%2C%22_when%20a%20request%20fails%22%3A%22%E5%BD%93%E6%9C%89%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%22%2C%22_when%20a%20site%20responds%22%3A%22%E5%BD%93%E6%9C%89%E7%BD%91%E7%AB%99%E5%93%8D%E5%BA%94%22%7D%7D)%3B%2F*%20end%20generated%20l10n%20code%20*%2F(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%0A%20%20%20%20throw%20new%20Error(%22can%20not%20load%20out%20side%20unsandboxed%20mode%22)%3B%0A%0A%20%20const%20setType%20%3D%20(value%2C%20type)%20%3D%3E%20%7B%0A%20%20%20%20switch%20(type)%20%7B%0A%20%20%20%20%20%20case%20%22string%22%3A%0A%20%20%20%20%20%20%20%20switch%20(typeof%20value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20%22string%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22boolean%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22number%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22function%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20String(value)%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22object%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20JSON.stringify(value)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%7B%7D%22%3B%0A%20%20%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%20break%3B%0A%20%20%20%20%20%20case%20%22number%22%3A%0A%20%20%20%20%20%20%20%20switch%20(typeof%20value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20%22string%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20String(value)%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22boolean%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Boolean(value)%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22number%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20value%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22function%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22object%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20NaN%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20%22boolean%22%3A%0A%20%20%20%20%20%20%20%20switch%20(typeof%20value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20%22string%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22boolean%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22function%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22number%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Boolean(value)%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22object%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20%22object%22%3A%0A%20%20%20%20%20%20%20%20switch%20(typeof%20value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20%22string%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20parsed%20%3D%20JSON.parse(value)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(typeof%20parsed%20%3D%3D%3D%20%22object%22)%20return%20parsed%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%7D%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%20case%20%22boolean%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22function%22%3A%0A%20%20%20%20%20%20%20%20%20%20case%20%22number%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20case%20%22object%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%20%20const%20parseType%20%3D%20(text)%20%3D%3E%20%7B%0A%20%20%20%20%2F%2F%20this%20isnt%20text%20and%20we%20just%20pass%20it%20down%20as%20what%20ever%20it%20is%0A%20%20%20%20if%20(typeof%20text%20!%3D%3D%20%22string%22)%20return%20text%3B%0A%20%20%20%20if%20(!isNaN(Number(text)))%20%7B%0A%20%20%20%20%20%20return%20Number(text)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20parsed%20%3D%20JSON.parse(text)%3B%0A%20%20%20%20%20%20%20%20if%20(typeof%20parsed%20%3D%3D%3D%20%22object%22)%20return%20parsed%3B%0A%20%20%20%20%20%20%20%20if%20(typeof%20parsed%20%3D%3D%3D%20%22boolean%22)%20return%20parsed%3B%0A%20%20%20%20%20%20%20%20return%20text%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20return%20text%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%20%20const%20getPathArray%20%3D%20(path)%20%3D%3E%20%7B%0A%20%20%20%20const%20names%20%3D%20path.split(%22.%22)%3B%0A%20%20%20%20for%20(let%20index%20%3D%200%3B%20index%20%3C%20names.length%3B%20index%2B%2B)%20%7B%0A%20%20%20%20%20%20let%20name%20%3D%20names%5Bindex%5D%3B%0A%20%20%20%20%20%20name%20%3D%20name.replaceAll(%2F(%3F%3C!%5C%5C)%26dot%2Fg%2C%20%22.%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20names%3B%0A%20%20%7D%3B%0A%20%20const%20getValueAtPath%20%3D%20(object%2C%20path)%20%3D%3E%20%7B%0A%20%20%20%20for%20(const%20name%20of%20path)%20%7B%0A%20%20%20%20%20%20object%20%3D%20object%3F.%5Bname%5D%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20setType(object%2C%20%22string%22)%3B%0A%20%20%7D%3B%0A%20%20const%20setValueAtPath%20%3D%20(object%2C%20path%2C%20value)%20%3D%3E%20%7B%0A%20%20%20%20for%20(const%20name%20of%20path.slice(0%2C%20-1))%20%7B%0A%20%20%20%20%20%20object%20%3D%20object%5Bname%5D%3B%0A%20%20%20%20%7D%0A%20%20%20%20object%5Bpath.at(-1)%5D%20%3D%20value%3B%0A%20%20%7D%3B%0A%0A%20%20const%20%7B%20vm%20%7D%20%3D%20Scratch%3B%0A%20%20const%20%7B%20runtime%20%7D%20%3D%20vm%3B%0A%0A%20%20const%20extensionId%20%3D%20%22gsaHTTPRequests%22%3B%0A%0A%20%20%2F%2F%20the%20funny%20class%20to%20make%20event%20blocks%20look%20better%0A%20%20class%20Events%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20this.events%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20this.blocks%20%3D%20%7B%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20adds%20a%20event%20name%20listner%20for%20a%20block%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20name%20name%20of%20the%20event%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20%5Bblock%5D%20a%20block%20to%20run%20when%20trigered%0A%20%20%20%20%20*%2F%0A%20%20%20%20add(name%2C%20block)%20%7B%0A%20%20%20%20%20%20if%20(block)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!this.blocks%5Bname%5D)%20this.blocks%5Bname%5D%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20this.blocks%5Bname%5D.push(block)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20activate%20an%20event%0A%20%20%20%20%20*%20%40param%20%7Bstring%7D%20name%20name%20of%20the%20event%0A%20%20%20%20%20*%2F%0A%20%20%20%20activate(name)%20%7B%0A%20%20%20%20%20%20this.events%5Bname%5D%20%3D%20true%3B%0A%20%20%20%20%20%20if%20(this.blocks%5Bname%5D)%20%7B%0A%20%20%20%20%20%20%20%20for%20(const%20block%20of%20this.blocks%5Bname%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20runtime.startHats(block)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20const%20createBlockId%20%3D%20(block)%20%3D%3E%20%60%24%7BextensionId%7D_%24%7Bblock%7D%60%3B%0A%0A%20%20%2F*%20-------%20BLOCKS%20--------%20*%2F%0A%20%20const%20%7B%20BlockType%2C%20Cast%2C%20ArgumentType%20%7D%20%3D%20Scratch%3B%0A%0A%20%20class%20WebRequests%20%7B%0A%20%20%20%20static%20get%20defaultRequest()%20%7B%0A%20%20%20%20%20%20const%20defaultRequest%20%3D%20%7B%0A%20%20%20%20%20%20%20%20events%3A%20new%20Events()%2C%0A%20%20%20%20%20%20%20%20get%20mimeType()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this.options.headers%5B%22Content-Type%22%5D%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20set%20mimeType(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.headers%5B%22Content-Type%22%5D%20%3D%3D%3D%20%22multipart%2Fform-data%22%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20value%20!%3D%3D%20%22multipart%2Fform-data%22%0A%20%20%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.body%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this.options.headers%5B%22Content-Type%22%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20set%20method(val)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.options.method%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20remove%20body%20on%20get%20requests%0A%20%20%20%20%20%20%20%20%20%20if%20(val%20%3D%3D%3D%20%22GET%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20delete%20this.options.body%3B%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%20%20get%20method()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this.options.method%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20options%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20headers%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Content-Type%22%3A%20%22text%2Fplain%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20method%3A%20%22GET%22%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20set%20body(val)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.method%20%3D%3D%3D%20%22GET%22)%20return%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20val%20instanceof%20FormData%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20!(this.options.body%20instanceof%20FormData)%0A%20%20%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.body%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.headers%5B%22Content-Type%22%5D%20%3D%20%22multipart%2Fform-data%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20!(val%20instanceof%20FormData)%20%26%26%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.body%20instanceof%20FormData%0A%20%20%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.body%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.options.headers%5B%22Content-Type%22%5D%20%3D%20%22text%2Fplain%22%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this.options.body%20%3D%20val%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20get%20body()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this.options.body%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20end%3A%20false%2C%0A%20%20%20%20%20%20%20%20fail%3A%20false%2C%0A%20%20%20%20%20%20%20%20success%3A%20false%2C%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20defaultRequest.events.add(%22reqSuccess%22%2C%20createBlockId(%22onResponse%22))%3B%0A%20%20%20%20%20%20defaultRequest.events.add(%22reqFail%22%2C%20createBlockId(%22onFail%22))%3B%0A%0A%20%20%20%20%20%20return%20defaultRequest%3B%0A%20%20%20%20%7D%0A%20%20%20%20static%20get%20defaultResponse()%20%7B%0A%20%20%20%20%20%20const%20defaultResponse%20%3D%20%7B%0A%20%20%20%20%20%20%20%20text%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20status%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20statusText%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20headers%3A%20new%20Headers()%2C%0A%20%20%20%20%20%20%20%20error%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20url%3A%20%22%22%2C%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20return%20defaultResponse%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20no%20need%20to%20install%20runtime%20as%20it%20comes%20with%20Scratch%20var%0A%20%20%20%20%20*%2F%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20this.clearAll()%3B%0A%20%20%20%20%20%20this.showingExtra%20%3D%20false%3B%0A%0A%20%20%20%20%20%20Scratch.vm.runtime.on(%22RUNTIME_DISPOSED%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.clearAll()%3B%0A%20%20%20%20%20%20%7D)%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%20extensionId%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22HTTP%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23307eff%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%232c5eb0%22%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22clearAll%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22clear%20current%20data%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.LABEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22Response%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resData%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22response%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22error%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22error%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22status%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22status%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22statusText%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22status%20text%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getHeaderJSON%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22headers%20as%20json%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getHeaderValue%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22%5Bname%5D%20from%20header%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22requestComplete%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22site%20responded%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22requestFail%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22request%20failed%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22requestSuccess%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22request%20succeeded%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22onResponse%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.EVENT%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%20Scratch.translate(%22when%20a%20site%20responds%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22onFail%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.EVENT%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%20Scratch.translate(%22when%20a%20request%20fails%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.LABEL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22Request%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setMimeType%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%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%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22mimeType%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20this.request.mimeType%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20content%20type%20to%20%5Btype%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setRequestmethod%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%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%20method%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22method%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20this.request.method%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20request%20method%20to%20%5Bmethod%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setHeaderData%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Content-Type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20this.request.mimeType%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22in%20header%20set%20%5Bname%5D%20to%20%5Bvalue%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setHeaderJSON%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%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%20json%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%60%7B%22Content-Type%22%3A%20%22%24%7Bthis.request.mimeType%7D%22%7D%60%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20headers%20to%20json%20%5Bjson%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBody%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%3A%20%22Apple!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20request%20body%20to%20%5Btext%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBodyToForm%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20request%20body%20to%20a%20form%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getFormProperty%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22%5Bname%5D%20in%20request%20form%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFormProperty%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22value%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20%5Bname%5D%20to%20%5Bvalue%5D%20in%20request%20form%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteFormProperty%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22delete%20%5Bname%5D%20from%20request%20form%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22sendRequest%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%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%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fhello.txt%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22send%20request%20to%20%5Burl%5D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20func%3A%20%22showExtra%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.BUTTON%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22Show%20Extra%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20this.showingExtra%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%20func%3A%20%22hideExtra%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.BUTTON%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22Hide%20Extra%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20!this.showingExtra%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%22setUnkownProperty%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%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%20path%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22path.to.item%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22data%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20%5Bpath%5D%20to%20%5Bvalue%5D%20in%20request%20options%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20!this.showingExtra%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%22setUnkownPropertyType%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.COMMAND%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%20path%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22path.to.item%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22jsTypes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22set%20%5Bpath%5D%20to%20type%20%5Btype%5D%20in%20request%20options%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20!this.showingExtra%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%22getUnkownProperty%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%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%20path%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22path.to.item%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22%5Bpath%5D%20in%20request%20options%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20!this.showingExtra%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%22getUnkownPropertyType%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20BlockType.REPORTER%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%20path%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22path.to.item%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22type%20of%20%5Bpath%5D%20in%20request%20options%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20!this.showingExtra%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%20jsTypes%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22string%22%2C%20%22number%22%2C%20%22boolean%22%2C%20%22object%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20method%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22GET%22%2C%20%22POST%22%2C%20%22PUT%22%2C%20%22PATCH%22%2C%20%22DELETE%22%2C%20%22HEAD%22%2C%20%22OPTIONS%22%5D%2C%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%7D%2C%0A%20%20%20%20%20%20%20%20%20%20mimeType%3A%20%7B%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%22application%2Fjavascript%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22application%2Fogg%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22application%2Fpdf%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22application%2Fjson%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22application%2Fld%2Bjson%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22application%2Fxml%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22application%2Fzip%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22audio%2Fmpeg%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image%2Fgif%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image%2Fjpeg%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image%2Fpng%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image%2Ftiff%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image%2Fx-icon%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22image%2Fsvg%2Bxml%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%2Fcss%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%2Fcsv%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%2Fhtml%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%2Fplain%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text%2Fxml%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22video%2Fmpeg%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22video%2Fmp4%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22video%2Fx-ms-wmv%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22video%2Fx-msvideo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22video%2Fx-flv%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22video%2Fwebm%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F*%20------%20RESETING%20-------%20*%2F%0A%0A%20%20%20%20clearAll()%20%7B%0A%20%20%20%20%20%20this.request%20%3D%20WebRequests.defaultRequest%3B%0A%20%20%20%20%20%20this.response%20%3D%20WebRequests.defaultResponse%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F*%20-------%20DATA%20READING%20--------%20*%2F%0A%0A%20%20%20%20resData()%20%7B%0A%20%20%20%20%20%20return%20this.response.text%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20error()%20%7B%0A%20%20%20%20%20%20return%20this.response.error%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20status()%20%7B%0A%20%20%20%20%20%20return%20this.response.status%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20requestComplete()%20%7B%0A%20%20%20%20%20%20return%20this.request.end%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20requestFail()%20%7B%0A%20%20%20%20%20%20return%20this.request.fail%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20requestSuccess()%20%7B%0A%20%20%20%20%20%20return%20this.request.success%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20statusText()%20%7B%0A%20%20%20%20%20%20return%20this.response.statusText%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getHeaderValue(args)%20%7B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.name)%3B%0A%20%20%20%20%20%20return%20this.response.get(name)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getHeaderJSON()%20%7B%0A%20%20%20%20%20%20const%20object%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20for%20(const%20entry%20of%20this.response.headers.entries())%20%7B%0A%20%20%20%20%20%20%20%20object%5Bentry%5B0%5D%5D%20%3D%20entry%5B1%5D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20JSON.stringify(object)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F*%20--------%20CONTROL%20---------%20*%2F%0A%0A%20%20%20%20setMimeType(args)%20%7B%0A%20%20%20%20%20%20const%20type%20%3D%20Cast.toString(args.type)%3B%0A%20%20%20%20%20%20this.request.mimeType%20%3D%20type%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setRequestmethod(args)%20%7B%0A%20%20%20%20%20%20const%20method%20%3D%20Cast.toString(args.method)%3B%0A%20%20%20%20%20%20this.request.method%20%3D%20method%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setHeaderData(args)%20%7B%0A%20%20%20%20%20%20const%20key%20%3D%20Cast.toString(args.name)%3B%0A%20%20%20%20%20%20const%20value%20%3D%20Cast.toString(args.value)%3B%0A%20%20%20%20%20%20this.request.options.headers%5Bkey%5D%20%3D%20value%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setHeaderJSON(args)%20%7B%0A%20%20%20%20%20%20const%20json%20%3D%20Cast.toString(args.json)%3B%0A%20%20%20%20%20%20let%20object%3B%0A%20%20%20%20%20%20%2F%2F%20ignore%20invalid%20data%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20object%20%3D%20JSON.parse(json)%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(typeof%20object%20!%3D%3D%20%22object%22)%20return%3B%0A%20%20%20%20%20%20this.request.options.headers%20%3D%20object%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setBody(args)%20%7B%0A%20%20%20%20%20%20const%20body%20%3D%20Cast.toString(args.text)%3B%0A%20%20%20%20%20%20this.request.body%20%3D%20body%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setBodyToForm()%20%7B%0A%20%20%20%20%20%20this.request.body%20%3D%20new%20FormData()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getFormProperty(args)%20%7B%0A%20%20%20%20%20%20if%20(!(this.request.options.body%20instanceof%20FormData))%20return%3B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.name)%3B%0A%20%20%20%20%20%20return%20this.request.body.get(name)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setFormProperty(args)%20%7B%0A%20%20%20%20%20%20if%20(!(this.request.options.body%20instanceof%20FormData))%20return%3B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.name)%3B%0A%20%20%20%20%20%20const%20value%20%3D%20Cast.toString(args.value)%3B%0A%20%20%20%20%20%20this.request.body.set(name%2C%20value)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteFormProperty(args)%20%7B%0A%20%20%20%20%20%20if%20(!(this.request.options.body%20instanceof%20FormData))%20return%3B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.name)%3B%0A%20%20%20%20%20%20this.request.body.delete(name)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20sendRequest(args)%20%7B%0A%20%20%20%20%20%20const%20url%20%3D%20Cast.toString(args.url)%3B%0A%20%20%20%20%20%20const%20options%20%3D%20this.request.options%3B%0A%0A%20%20%20%20%20%20this.clearAll()%3B%0A%0A%20%20%20%20%20%20this.response.url%20%3D%20url%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20const%20res%20%3D%20await%20Scratch.fetch(url%2C%20options)%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20%40ts-ignore%0A%20%20%20%20%20%20%20%20this.response.status%20%3D%20res.status%3B%0A%20%20%20%20%20%20%20%20this.response.headers%20%3D%20res.headers%3B%0A%20%20%20%20%20%20%20%20this.response.statusText%20%3D%20res.statusText%3B%0A%20%20%20%20%20%20%20%20if%20(res.ok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.request.success%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20this.request.events.activate(%22reqSuccess%22)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.request.fail%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20this.request.events.activate(%22reqFail%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20this.request.end%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20if%20(res.headers.get(%22Content-Type%22)%20%3D%3D%3D%20%22multipart%2Fform-data%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20form%20%3D%20await%20res.formData()%3B%0A%20%20%20%20%20%20%20%20%20%20const%20json%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20%5Bkey%2C%20value%5D%20of%20form.entries())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20json%5Bkey%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this.response.text%20%3D%20JSON.stringify(json)%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%20const%20body%20%3D%20await%20res.text()%3B%0A%20%20%20%20%20%20%20%20this.response.text%20%3D%20body%3B%0A%20%20%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20%20%20this.response.error%20%3D%20String(err)%3B%0A%20%20%20%20%20%20%20%20console.warn(%22request%20failed%20with%20error%22%2C%20err)%3B%0A%20%20%20%20%20%20%20%20this.request.fail%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20this.request.end%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20this.request.events.activate(%22reqFail%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F*%20extra%20stuff%20for%20when%20its%20missing%20something%20*%2F%0A%0A%20%20%20%20showExtra()%20%7B%0A%20%20%20%20%20%20this.showingExtra%20%3D%20true%3B%0A%20%20%20%20%20%20vm.extensionManager.refreshBlocks()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20hideExtra()%20%7B%0A%20%20%20%20%20%20this.showingExtra%20%3D%20false%3B%0A%20%20%20%20%20%20vm.extensionManager.refreshBlocks()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setUnkownProperty(args)%20%7B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.path)%3B%0A%20%20%20%20%20%20const%20text%20%3D%20Cast.toString(args.value)%3B%0A%0A%20%20%20%20%20%20const%20path%20%3D%20getPathArray(name)%3B%0A%20%20%20%20%20%20const%20value%20%3D%20parseType(text)%3B%0A%20%20%20%20%20%20setValueAtPath(this.request.options%2C%20path%2C%20value)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setUnkownPropertyType(args)%20%7B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.path)%3B%0A%20%20%20%20%20%20const%20type%20%3D%20Cast.toString(args.type)%3B%0A%20%20%20%20%20%20const%20path%20%3D%20getPathArray(name)%3B%0A%0A%20%20%20%20%20%20const%20oldValue%20%3D%20getValueAtPath(this.request.options%2C%20path)%3B%0A%20%20%20%20%20%20const%20newValue%20%3D%20setType(oldValue%2C%20type)%3B%0A%20%20%20%20%20%20setValueAtPath(this.request.options%2C%20path%2C%20newValue)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getUnkownProperty(args)%20%7B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.path)%3B%0A%20%20%20%20%20%20const%20path%20%3D%20getPathArray(name)%3B%0A%0A%20%20%20%20%20%20return%20getValueAtPath(this.request.options%2C%20path)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getUnkownPropertyType(args)%20%7B%0A%20%20%20%20%20%20const%20name%20%3D%20Cast.toString(args.path)%3B%0A%20%20%20%20%20%20const%20path%20%3D%20getPathArray(name)%3B%0A%20%20%20%20%20%20const%20value%20%3D%20getValueAtPath(this.request.options%2C%20path)%3B%0A%0A%20%20%20%20%20%20return%20typeof%20value%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20const%20instance%20%3D%20new%20WebRequests()%3B%0A%20%20%2F%2F%20%40ts-ignore%0A%20%20Scratch.extensions.register(instance)%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Mouse%20Cursor%0A%2F%2F%20ID%3A%20MouseCursor%0A%2F%2F%20Description%3A%20Use%20custom%20cursors%20or%20hide%20the%20cursor.%20Also%20allows%20replacing%20the%20cursor%20with%20any%20costume%20image.%0A%2F%2F%20License%3A%20MIT%20AND%20MPL-2.0%0A%0A%2F*%20generated%20l10n%20code%20*%2FScratch.translate.setup(%7B%22de%22%3A%7B%22_Mouse%20Cursor%22%3A%22Mauszeiger%22%7D%2C%22fi%22%3A%7B%22_Mouse%20Cursor%22%3A%22Hiiren%20kohdistin%22%2C%22_bottom%20left%22%3A%22vasempaan%20alakulmaan%22%2C%22_bottom%20right%22%3A%22oikeaan%20alakulmaan%22%2C%22_center%22%3A%22keskelle%22%2C%22_cursor%22%3A%22kohdistin%22%2C%22_hide%20cursor%22%3A%22piilota%20kohdistin%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22aseta%20kohdistimeksi%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22aseta%20kohdistimeksi%20nykyisen%20asusteen%20keskikohta%3A%20%5Bposition%5D%20enimm%C3%A4iskoko%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22vasempaan%20yl%C3%A4kulmaan%22%2C%22_top%20right%22%3A%22oikeaan%20yl%C3%A4kulmaan%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(ep%C3%A4luotettava)%22%7D%2C%22it%22%3A%7B%22_Mouse%20Cursor%22%3A%22Puntatore%20Mouse%22%2C%22_bottom%20left%22%3A%22angolo%20sinistra%20in%20basso%22%2C%22_bottom%20right%22%3A%22angolo%20destra%20in%20basso%22%2C%22_center%22%3A%22centro%22%2C%22_cursor%22%3A%22puntatore%22%2C%22_hide%20cursor%22%3A%22nascondi%20puntatore%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22usa%20%5Bcur%5D%20come%20puntatore%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22usa%20il%20costume%20attuale%20con%20centro%3A%20%5Bposition%5D%20dimensione%20massima%3A%20%5Bsize%5D%20come%20puntatore%22%2C%22_top%20left%22%3A%22angolo%20sinistra%20in%20alto%22%2C%22_top%20right%22%3A%22angolo%20destra%20in%20alto%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(inaffidabile)%22%7D%2C%22ja%22%3A%7B%22_Mouse%20Cursor%22%3A%22%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%22%2C%22_bottom%20left%22%3A%22%E5%B7%A6%E4%B8%8B%22%2C%22_bottom%20right%22%3A%22%E5%8F%B3%E4%B8%8B%22%2C%22_center%22%3A%22%E4%B8%AD%E5%A4%AE%22%2C%22_top%20left%22%3A%22%E5%B7%A6%E4%B8%8A%22%2C%22_top%20right%22%3A%22%E5%8F%B3%E4%B8%8A%22%7D%2C%22ko%22%3A%7B%22_Mouse%20Cursor%22%3A%22%EB%A7%88%EC%9A%B0%EC%8A%A4%20%EC%BB%A4%EC%84%9C%22%2C%22_bottom%20left%22%3A%22%EC%99%BC%EC%AA%BD%20%EC%95%84%EB%9E%98%22%2C%22_bottom%20right%22%3A%22%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%95%84%EB%9E%98%22%2C%22_center%22%3A%22%EA%B0%80%EC%9A%B4%EB%8D%B0%22%2C%22_cursor%22%3A%22%EC%BB%A4%EC%84%9C%22%2C%22_hide%20cursor%22%3A%22%EC%BB%A4%EC%84%9C%20%EC%88%A8%EA%B8%B0%EA%B8%B0%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22%EC%BB%A4%EC%84%9C%EB%A5%BC%20%5Bcur%5D(%EC%9C%BC)%EB%A1%9C%20%EC%A0%95%ED%95%98%EA%B8%B0%22%2C%22_top%20left%22%3A%22%EC%99%BC%EC%AA%BD%20%EC%9C%84%22%2C%22_top%20right%22%3A%22%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9C%84%22%7D%2C%22nb%22%3A%7B%22_Mouse%20Cursor%22%3A%22Mus%20Pekkeren%22%2C%22_bottom%20left%22%3A%22nederst%20til%20venstre%22%2C%22_bottom%20right%22%3A%22nederst%20til%20h%C3%B8yre%22%2C%22_center%22%3A%22senter%22%2C%22_cursor%22%3A%22pekeren%22%2C%22_hide%20cursor%22%3A%22skjul%20pekeren%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22sett%20mark%C3%B8ren%20til%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22sett%20mark%C3%B8ren%20til%20midten%20av%20gjeldende%20drakt%3A%20%5Bposition%5D%20maks%20st%C3%B8rrelse%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22%C3%B8verst%20til%20venstre%22%2C%22_top%20right%22%3A%22%C3%B8verst%20til%20h%C3%B8yre%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(up%C3%A5litelig)%22%7D%2C%22nl%22%3A%7B%22_Mouse%20Cursor%22%3A%22Muisaanwijzer%22%2C%22_bottom%20left%22%3A%22linksonder%22%2C%22_bottom%20right%22%3A%22rechtsonder%22%2C%22_center%22%3A%22midden%22%2C%22_hide%20cursor%22%3A%22verberg%20cursor%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22maak%20cursor%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22maak%20cursor%20huidig%20uiterlijk%20met%20middelpunt%3A%20%5Bposition%5D%20en%20max.%20grootte%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22linksboven%22%2C%22_top%20right%22%3A%22rechtsboven%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(onbetrouwbaar)%22%7D%2C%22ru%22%3A%7B%22_Mouse%20Cursor%22%3A%22%D0%9A%D1%83%D1%80%D1%81%D0%BE%D1%80%20%D0%9C%D1%8B%D1%88%D0%B8%22%2C%22_bottom%20left%22%3A%22%D0%BD%D0%B8%D0%B6%D0%BD%D0%B5%D0%BC%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_bottom%20right%22%3A%22%D0%BD%D0%B8%D0%B6%D0%BD%D0%B5%D0%BC%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_center%22%3A%22%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%B5%22%2C%22_cursor%22%3A%22%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%22%2C%22_hide%20cursor%22%3A%22%D1%81%D0%BF%D1%80%D1%8F%D1%82%D0%B0%D1%82%D1%8C%20%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%20%D0%BD%D0%B0%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BA%D1%83%D1%80%D1%81%D0%BE%D1%80%20%D0%BD%D0%B0%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B9%20%D0%BA%D0%BE%D1%81%D1%82%D1%8E%D0%BC%20%D1%81%20%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%BE%D0%BC%20%D0%B2%3A%20%5Bposition%5D%20%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BE%D0%BC%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%BC%20%D0%BB%D0%B5%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_top%20right%22%3A%22%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D0%BC%20%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%BC%20%D1%83%D0%B3%D0%BB%D1%83%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(%D0%BD%D0%B5%D0%BD%D0%B0%D0%B4%D0%B5%D0%B6%D0%BD%D0%BE)%22%7D%2C%22uk%22%3A%7B%22_Mouse%20Cursor%22%3A%22%D0%92%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%20%D0%9C%D0%B8%D1%88%D1%96%22%2C%22_bottom%20left%22%3A%22%D0%B7%D0%BB%D1%96%D0%B2%D0%B0%20%D0%B7%D0%BD%D0%B8%D0%B7%D1%83%22%2C%22_bottom%20right%22%3A%22%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%20%D0%B7%D0%BD%D0%B8%D0%B7%D1%83%22%2C%22_center%22%3A%22%D1%86%D0%B5%D0%BD%D1%82%D1%80%22%2C%22_cursor%22%3A%22%D0%B2%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%22%2C%22_hide%20cursor%22%3A%22%D1%81%D0%BE%D0%B2%D0%B0%D1%82%D0%B8%20%D0%B2%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22%D0%B7%D0%BC%D1%96%D0%BD%D0%B8%D1%82%D0%B8%20%D0%B2%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%20%D0%BD%D0%B0%20%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22%D0%B7%D0%B0%D0%BC%D1%96%D0%BD%D0%B8%D1%82%D0%B8%20%D0%B2%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%20%D0%BD%D0%B0%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%20%D1%86%D0%B5%D0%BD%D1%82%D1%80%3A%20%5Bposition%5D%20%D0%BC%D0%B0%D0%BA%D1%81.%20%D1%80%D0%BE%D0%B7%D0%BC%D1%96%D1%80%3A%20%5Bsize%5D%22%2C%22_top%20left%22%3A%22%D0%B7%D0%BB%D1%96%D0%B2%D0%B0%20%D0%B7%D0%B2%D0%B5%D1%80%D1%85%D1%83%22%2C%22_top%20right%22%3A%22%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%20%D0%B7%D0%B2%D0%B5%D1%80%D1%85%D1%83%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%20(%D0%BD%D0%B5%D0%BD%D0%B0%D0%B4%D1%96%D0%B9%D0%BD%D0%BE)%22%7D%2C%22zh-cn%22%3A%7B%22_Mouse%20Cursor%22%3A%22%E9%BC%A0%E6%A0%87%E5%9B%BE%E6%A0%87%22%2C%22_bottom%20left%22%3A%22%E5%BA%95%E9%83%A8%E5%B7%A6%E4%BE%A7%22%2C%22_bottom%20right%22%3A%22%E5%BA%95%E9%83%A8%E5%8F%B3%E4%BE%A7%22%2C%22_center%22%3A%22%E5%B1%85%E4%B8%AD%22%2C%22_cursor%22%3A%22%E9%BC%A0%E6%A0%87%E6%A0%B7%E5%BC%8F%22%2C%22_hide%20cursor%22%3A%22%E9%9A%90%E8%97%8F%E9%BC%A0%E6%A0%87%22%2C%22_set%20cursor%20to%20%5Bcur%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E9%BC%A0%E6%A0%87%E6%A0%B7%E5%BC%8F%E4%B8%BA%5Bcur%5D%22%2C%22_set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E9%BC%A0%E6%A0%87%E4%B8%AD%E5%BF%83%E4%B8%BA%5Bposition%5D%EF%BC%8C%E6%9C%80%E5%A4%A7%E5%B0%BA%E5%AF%B8%E4%B8%BA%5Bsize%5D%22%2C%22_top%20left%22%3A%22%E9%A1%B6%E9%83%A8%E5%B7%A6%E4%BE%A7%22%2C%22_top%20right%22%3A%22%E9%A1%B6%E9%83%A8%E5%8F%B3%E4%BE%A7%22%2C%22_%7Bsize%7D%20(unreliable)%22%3A%22%7Bsize%7D%EF%BC%88%E5%AE%9E%E9%AA%8C%E6%80%A7%EF%BC%89%22%7D%7D)%3B%2F*%20end%20generated%20l10n%20code%20*%2F(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20%7B%0A%20%20%20%20throw%20new%20Error(%22MouseCursor%20extension%20must%20be%20run%20unsandboxed%22)%3B%0A%20%20%7D%0A%0A%20%20const%20lazilyCreatedCanvas%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%2F**%20%40type%20%7BHTMLCanvasElement%7D%20*%2F%0A%20%20%20%20let%20canvas%20%3D%20null%3B%0A%20%20%20%20%2F**%20%40type%20%7BCanvasRenderingContext2D%7D%20*%2F%0A%20%20%20%20let%20ctx%20%3D%20null%3B%0A%20%20%20%20%2F**%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20width%0A%20%20%20%20%20*%20%40param%20%7Bnumber%7D%20height%0A%20%20%20%20%20*%20%40returns%20%7B%5BHTMLCanvasElement%2C%20CanvasRenderingContext2D%5D%7D%0A%20%20%20%20%20*%2F%0A%20%20%20%20return%20(width%2C%20height)%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20(!canvas)%20%7B%0A%20%20%20%20%20%20%20%20canvas%20%3D%20document.createElement(%22canvas%22)%3B%0A%20%20%20%20%20%20%20%20ctx%20%3D%20canvas.getContext(%222d%22)%3B%0A%20%20%20%20%20%20%20%20if%20(!ctx)%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error(%22Could%20not%20get%202d%20rendering%20context%22)%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%20%2F%2F%20Setting%20canvas%20size%20also%20clears%20it%0A%20%20%20%20%20%20canvas.width%20%3D%20width%3B%0A%20%20%20%20%20%20canvas.height%20%3D%20height%3B%0A%20%20%20%20%20%20return%20%5Bcanvas%2C%20ctx%5D%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%3B%0A%20%20const%20getRawSkinCanvas%20%3D%20lazilyCreatedCanvas()%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7BRenderWebGL.Skin%7D%20skin%0A%20%20%20*%20%40returns%20%7Bstring%7D%20A%20data%3A%20URI%20for%20the%20skin.%0A%20%20%20*%2F%0A%20%20const%20encodeSkinToURL%20%3D%20(skin)%20%3D%3E%20%7B%0A%20%20%20%20const%20svgSkin%20%3D%20%2F**%20%40type%20%7BRenderWebGL.SVGSkin%7D%20*%2F%20(skin)%3B%0A%20%20%20%20if%20(svgSkin._svgImage)%20%7B%0A%20%20%20%20%20%20%2F%2F%20This%20is%20an%20SVG%20skin%0A%20%20%20%20%20%20return%20svgSkin._svgImage.src%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20It's%20probably%20a%20bitmap%20skin.%0A%20%20%20%20%2F%2F%20The%20most%20reliable%20way%20to%20get%20the%20bitmap%20in%20every%20runtime%20is%20through%20the%20silhouette.%0A%20%20%20%20%2F%2F%20This%20is%20very%20slow%20and%20could%20involve%20reading%20the%20texture%20from%20the%20GPU.%0A%20%20%20%20const%20silhouette%20%3D%20skin._silhouette%3B%0A%20%20%20%20%2F%2F%20unlazy()%20only%20exists%20in%20TW%0A%20%20%20%20if%20(silhouette.unlazy)%20%7B%0A%20%20%20%20%20%20silhouette.unlazy()%3B%0A%20%20%20%20%7D%0A%20%20%20%20const%20colorData%20%3D%20silhouette._colorData%3B%0A%20%20%20%20const%20width%20%3D%20silhouette._width%3B%0A%20%20%20%20const%20height%20%3D%20silhouette._height%3B%0A%20%20%20%20const%20imageData%20%3D%20new%20ImageData(%0A%20%20%20%20%20%20colorData%2C%0A%20%20%20%20%20%20silhouette._width%2C%0A%20%20%20%20%20%20silhouette._height%0A%20%20%20%20)%3B%0A%20%20%20%20const%20%5Bcanvas%2C%20ctx%5D%20%3D%20getRawSkinCanvas(width%2C%20height)%3B%0A%20%20%20%20ctx.putImageData(imageData%2C%200%2C%200)%3B%0A%20%20%20%20return%20canvas.toDataURL()%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7BVM.Costume%7D%20costume%0A%20%20%20*%20%40param%20%7Bnumber%7D%20maxWidth%0A%20%20%20*%20%40param%20%7Bnumber%7D%20maxHeight%0A%20%20%20*%20%40returns%20%7B%7Buri%3A%20string%2C%20width%3A%20number%2C%20height%3A%20number%7D%7D%0A%20%20%20*%2F%0A%20%20const%20costumeToCursor%20%3D%20(costume%2C%20maxWidth%2C%20maxHeight)%20%3D%3E%20%7B%0A%20%20%20%20const%20skin%20%3D%20Scratch.vm.renderer._allSkins%5Bcostume.skinId%5D%3B%0A%20%20%20%20const%20imageURI%20%3D%20encodeSkinToURL(skin)%3B%0A%0A%20%20%20%20let%20width%20%3D%20skin.size%5B0%5D%3B%0A%20%20%20%20let%20height%20%3D%20skin.size%5B1%5D%3B%0A%20%20%20%20if%20(width%20%3E%20maxWidth)%20%7B%0A%20%20%20%20%20%20height%20%3D%20height%20*%20(maxWidth%20%2F%20width)%3B%0A%20%20%20%20%20%20width%20%3D%20maxWidth%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(height%20%3E%20maxHeight)%20%7B%0A%20%20%20%20%20%20width%20%3D%20width%20*%20(maxHeight%20%2F%20height)%3B%0A%20%20%20%20%20%20height%20%3D%20maxHeight%3B%0A%20%20%20%20%7D%0A%20%20%20%20width%20%3D%20Math.round(width)%3B%0A%20%20%20%20height%20%3D%20Math.round(height)%3B%0A%0A%20%20%20%20%2F%2F%20We%20wrap%20the%20encoded%20image%20in%20an%20%3Csvg%3E.%20This%20lets%20us%20do%20some%20clever%20things%3A%0A%20%20%20%20%2F%2F%20%20-%20We%20can%20resize%20the%20image%20without%20a%20canvas.%0A%20%20%20%20%2F%2F%20%20-%20We%20can%20give%20the%20browser%20an%20image%20with%20more%20raw%20pixels%20than%20its%20DPI%20independent%20size.%0A%20%20%20%20%2F%2F%20The%20latter%20is%20important%20so%20that%20cursors%20won't%20look%20horrible%20on%20high%20DPI%20displays.%20For%0A%20%20%20%20%2F%2F%20example%2C%20if%20the%20cursor%20will%20display%20at%2032x32%20in%20DPI%20independent%20units%20on%20a%202x%20high%20DPI%0A%20%20%20%20%2F%2F%20display%2C%20we%20actually%20need%20to%20send%20a%2064x64%20image%20for%20it%20to%20look%20good.%20This%20lets%20us%20do%0A%20%20%20%20%2F%2F%20that%20automatically.%0A%20%20%20%20let%20svg%20%3D%20%60%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22%24%7Bwidth%7D%22%20height%3D%22%24%7Bheight%7D%22%3E%60%3B%0A%20%20%20%20svg%20%2B%3D%20%60%3Cimage%20href%3D%22%24%7BimageURI%7D%22%20width%3D%22%24%7Bwidth%7D%22%20height%3D%22%24%7Bheight%7D%22%20%2F%3E%60%3B%0A%20%20%20%20svg%20%2B%3D%20%22%3C%2Fsvg%3E%22%3B%0A%20%20%20%20%2F%2F%20URI%20encoding%20usually%20results%20in%20smaller%20string%20than%20base%2064%20for%20the%20types%20of%20data%20we%20get%20here.%0A%20%20%20%20const%20svgURI%20%3D%20%60data%3Aimage%2Fsvg%2Bxml%3B%2C%24%7BencodeURIComponent(svg)%7D%60%3B%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20uri%3A%20svgURI%2C%0A%20%20%20%20%20%20width%2C%0A%20%20%20%20%20%20height%2C%0A%20%20%20%20%7D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20let%20nativeCursor%20%3D%20%22default%22%3B%0A%20%20%2F**%20%40type%20%7Bnull%7Cstring%7D%20*%2F%0A%20%20let%20customCursorImageName%20%3D%20null%3B%0A%0A%20%20const%20canvas%20%3D%20Scratch.renderer.canvas%3B%0A%20%20%2F**%20%40type%20%7Bstring%7D%20*%2F%0A%20%20let%20currentCanvasCursor%20%3D%20nativeCursor%3B%0A%20%20const%20updateCanvasCursor%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20if%20(canvas.style.cursor%20!%3D%3D%20currentCanvasCursor)%20%7B%0A%20%20%20%20%20%20canvas.style.cursor%20%3D%20currentCanvasCursor%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20scratch-gui%20will%20sometimes%20reset%20the%20cursor%20when%20resizing%20the%20window%20or%20going%20in%2Fout%20of%20fullscreen%0A%20%20new%20MutationObserver(updateCanvasCursor).observe(canvas%2C%20%7B%0A%20%20%20%20attributeFilter%3A%20%5B%22style%22%5D%2C%0A%20%20%20%20attributes%3A%20true%2C%0A%20%20%7D)%3B%0A%0A%20%20%2F**%0A%20%20%20*%20Parse%20strings%20like%20%2260x12%22%20or%20%2277%2C1%22%0A%20%20%20*%20%40param%20%7Bstring%7D%20string%0A%20%20%20*%20%40returns%20%7B%5Bnumber%2C%20number%5D%7D%0A%20%20%20*%2F%0A%20%20const%20parseTuple%20%3D%20(string)%20%3D%3E%20%7B%0A%20%20%20%20const%20%5Ba%2C%20b%5D%20%3D%20(%22%22%20%2B%20string).split(%2F%5B%20%2Cx%5D%2F)%3B%0A%20%20%20%20return%20%5B%2Ba%20%7C%7C%200%2C%20%2Bb%20%7C%7C%200%5D%3B%0A%20%20%7D%3B%0A%0A%20%20%2F**%0A%20%20%20*%20%40param%20%7Bstring%7D%20size%20eg.%20%2248x84%22%0A%20%20%20*%20%40returns%20%7Bstring%7D%0A%20%20%20*%2F%0A%20%20const%20formatUnreliableSize%20%3D%20(size)%20%3D%3E%0A%20%20%20%20Scratch.translate(%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20default%3A%20%22%7Bsize%7D%20(unreliable)%22%2C%0A%20%20%20%20%20%20%20%20description%3A%20%22%5Bsize%5D%20is%20replaced%20with%20a%20size%20in%20pixels%20such%20as%20'48x48'%22%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7B%20size%20%7D%0A%20%20%20%20)%3B%0A%0A%20%20const%20cursors%20%3D%20%5B%0A%20%20%20%20%22default%22%2C%0A%20%20%20%20%22pointer%22%2C%0A%20%20%20%20%22move%22%2C%0A%20%20%20%20%22grab%22%2C%0A%20%20%20%20%22grabbing%22%2C%0A%20%20%20%20%22text%22%2C%0A%20%20%20%20%22vertical-text%22%2C%0A%20%20%20%20%22wait%22%2C%0A%20%20%20%20%22progress%22%2C%0A%20%20%20%20%22help%22%2C%0A%20%20%20%20%22context-menu%22%2C%0A%20%20%20%20%22zoom-in%22%2C%0A%20%20%20%20%22zoom-out%22%2C%0A%20%20%20%20%22crosshair%22%2C%0A%20%20%20%20%22cell%22%2C%0A%20%20%20%20%22not-allowed%22%2C%0A%20%20%20%20%22copy%22%2C%0A%20%20%20%20%22alias%22%2C%0A%20%20%20%20%22no-drop%22%2C%0A%20%20%20%20%22all-scroll%22%2C%0A%20%20%20%20%22col-resize%22%2C%0A%20%20%20%20%22row-resize%22%2C%0A%20%20%20%20%22n-resize%22%2C%0A%20%20%20%20%22e-resize%22%2C%0A%20%20%20%20%22s-resize%22%2C%0A%20%20%20%20%22w-resize%22%2C%0A%20%20%20%20%22ne-resize%22%2C%0A%20%20%20%20%22nw-resize%22%2C%0A%20%20%20%20%22se-resize%22%2C%0A%20%20%20%20%22sw-resize%22%2C%0A%20%20%20%20%22ew-resize%22%2C%0A%20%20%20%20%22ns-resize%22%2C%0A%20%20%20%20%22nesw-resize%22%2C%0A%20%20%20%20%22nwse-resize%22%2C%0A%20%20%5D%3B%0A%0A%20%20class%20MouseCursor%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20Scratch.vm.runtime.on(%22RUNTIME_DISPOSED%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20this.setCur(%7B%0A%20%20%20%20%20%20%20%20%20%20cur%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D)%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%22MouseCursor%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20Scratch.translate(%22Mouse%20Cursor%22)%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCur%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%20Scratch.translate(%22set%20cursor%20to%20%5Bcur%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%20cur%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%22pointer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22cursors%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCursorImage%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%20Scratch.translate(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22set%20cursor%20to%20current%20costume%20center%3A%20%5Bposition%5D%20max%20size%3A%20%5Bsize%5D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%220%2C0%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22imagePositions%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20size%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%2232x32%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22imageSizes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22hideCur%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%20Scratch.translate(%22hide%20cursor%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getCur%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%20Scratch.translate(%22cursor%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20cursors%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%20cursors%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20imagePositions%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%2F%2F%20%5Bx%2C%20y%5D%20where%20x%20is%20%5B0%3Dleft%2C%20100%3Dright%5D%20and%20y%20is%20%5B0%3Dtop%2C%20100%3Dbottom%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22top%20left%22)%2C%20value%3A%20%220%2C0%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22top%20right%22)%2C%20value%3A%20%22100%2C0%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22bottom%20left%22)%2C%20value%3A%20%220%2C100%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22bottom%20right%22)%2C%20value%3A%20%22100%2C100%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20Scratch.translate(%22center%22)%2C%20value%3A%20%2250%2C50%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20imageSizes%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%2F%2F%20Some%20important%20numbers%20to%20keep%20in%20mind%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Browsers%20ignore%20cursor%20images%20%3E128%20in%20any%20dimension%20(https%3A%2F%2Fsearchfox.org%2Fmozilla-central%2Frev%2F43ee5e789b079e94837a21336e9ce2420658fd19%2Fwidget%2Fgtk%2FnsWindow.cpp%233393-3402)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Browsers%20may%20refuse%20to%20display%20a%20cursor%20near%20window%20borders%20for%20images%20%3E32%20in%20any%20dimension%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%224x4%22%2C%20value%3A%20%224x4%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%228x8%22%2C%20value%3A%20%228x4%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%2212x12%22%2C%20value%3A%20%2212x12%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%2216x16%22%2C%20value%3A%20%2216x16%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%2232x32%22%2C%20value%3A%20%2232x32%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20formatUnreliableSize(%2248x48%22)%2C%20value%3A%20%2248x48%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20formatUnreliableSize(%2264x64%22)%2C%20value%3A%20%2264x64%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20formatUnreliableSize(%22128x128%22)%2C%20value%3A%20%22128x128%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setCur(args)%20%7B%0A%20%20%20%20%20%20const%20newCursor%20%3D%20Scratch.Cast.toString(args.cur)%3B%0A%20%20%20%20%20%20%2F%2F%20Prevent%20setting%20cursor%20to%20%22url(...)%2C%20default%22%20from%20causing%20fetch.%0A%20%20%20%20%20%20if%20(cursors.includes(newCursor)%20%7C%7C%20newCursor%20%3D%3D%3D%20%22none%22)%20%7B%0A%20%20%20%20%20%20%20%20nativeCursor%20%3D%20newCursor%3B%0A%20%20%20%20%20%20%20%20customCursorImageName%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20currentCanvasCursor%20%3D%20newCursor%3B%0A%20%20%20%20%20%20%20%20updateCanvasCursor()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setCursorImage(args%2C%20util)%20%7B%0A%20%20%20%20%20%20const%20%5BmaxWidth%2C%20maxHeight%5D%20%3D%20parseTuple(args.size).map((i)%20%3D%3E%0A%20%20%20%20%20%20%20%20Math.max(0%2C%20i)%0A%20%20%20%20%20%20)%3B%0A%0A%20%20%20%20%20%20const%20currentCostume%20%3D%0A%20%20%20%20%20%20%20%20util.target.getCostumes()%5Butil.target.currentCostume%5D%3B%0A%20%20%20%20%20%20const%20costumeName%20%3D%20currentCostume.name%3B%0A%0A%20%20%20%20%20%20let%20encodedCostume%3B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20encodedCostume%20%3D%20costumeToCursor(currentCostume%2C%20maxWidth%2C%20maxHeight)%3B%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20could%20happen%20for%20a%20variety%20of%20reasons.%0A%20%20%20%20%20%20%20%20console.error(e)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(encodedCostume)%20%7B%0A%20%20%20%20%20%20%20%20const%20%5BpercentX%2C%20percentY%5D%20%3D%20parseTuple(args.position).map(%0A%20%20%20%20%20%20%20%20%20%20(i)%20%3D%3E%20Math.max(0%2C%20Math.min(100%2C%20i))%20%2F%20100%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20%20%20%20%20const%20x%20%3D%20percentX%20*%20encodedCostume.width%3B%0A%20%20%20%20%20%20%20%20const%20y%20%3D%20percentY%20*%20encodedCostume.height%3B%0A%0A%20%20%20%20%20%20%20%20currentCanvasCursor%20%3D%20%60url(%22%24%7BencodedCostume.uri%7D%22)%20%24%7Bx%7D%20%24%7By%7D%2C%20%24%7BnativeCursor%7D%60%3B%0A%20%20%20%20%20%20%20%20updateCanvasCursor()%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20for%20some%20reason%20the%20costume%20couldn't%20be%20encoded%2C%20we'll%20leave%20the%20cursor%20unchanged.%0A%20%20%20%20%20%20%20%20%2F%2F%20This%20is%20the%20same%20behavior%20that%20would%20happen%20if%20we%20successfully%20encode%20a%20cursor%20but%20the%20browser%0A%20%20%20%20%20%20%20%20%2F%2F%20is%20unable%20to%20parse%20it%20for%20some%20reason.%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20customCursorImageName%20%3D%20costumeName%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20hideCur()%20%7B%0A%20%20%20%20%20%20this.setCur(%7B%0A%20%20%20%20%20%20%20%20cur%3A%20%22none%22%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getCur()%20%7B%0A%20%20%20%20%20%20if%20(customCursorImageName%20!%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20return%20customCursorImageName%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20nativeCursor%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20MouseCursor())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Sound%20Expanded%0D%0A%2F%2F%20Description%3A%20Adds%20more%20sound-related%20blocks.%0D%0A%2F%2F%20ID%3A%20lmsSoundExpanded%0D%0A%2F%2F%20By%3A%20LilyMakesThings%20%3Chttps%3A%2F%2Fscratch.mit.edu%2Fusers%2FLilyMakesThings%2F%3E%0D%0A%2F%2F%20License%3A%20MIT%20AND%20LGPL-3.0%0D%0A%0D%0A%2F*%20generated%20l10n%20code%20*%2FScratch.translate.setup(%7B%22de%22%3A%7B%22_Sound%20Expanded%22%3A%22Kl%C3%A4nge%20Erweitert%22%7D%2C%22fi%22%3A%7B%22_Sound%20Expanded%22%3A%22Laajennettu%20%C3%A4%C3%A4ni%22%2C%22_%5BATTRIBUTE%5D%20of%20%5BSOUND%5D%22%3A%22%C3%A4%C3%A4nen%20%5BSOUND%5D%20%5BATTRIBUTE%5D%22%2C%22_%5BSOUND%5D%20is%20looping%3F%22%3A%22soitetaanko%20%C3%A4%C3%A4nt%C3%A4%20%5BSOUND%5D%20silmukassa%3F%22%2C%22_change%20project%20volume%20by%20%5BVALUE%5D%22%3A%22lis%C3%A4%C3%A4%20projektin%20%C3%A4%C3%A4nenvoimakkuutta%20arvolla%20%5BVALUE%5D%22%2C%22_channels%22%3A%22kanavat%22%2C%22_effect%20%5BEFFECT%5D%20of%20%5BTARGET%5D%22%3A%22hahmon%20%5BTARGET%5D%20tehoste%20%5BEFFECT%5D%22%2C%22_end%20looping%20%5BSOUND%5D%22%3A%22%C3%A4l%C3%A4%20soita%20%C3%A4%C3%A4nt%C3%A4%20%5BSOUND%5D%20silmukassa%22%2C%22_length%22%3A%22pituus%22%2C%22_pan%22%3A%22panoroi%20vasen%2Foikea%22%2C%22_pause%20all%20sounds%22%3A%22keskeyt%C3%A4%20kaikki%20%C3%A4%C3%A4net%22%2C%22_pitch%22%3A%22s%C3%A4velkorkeus%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%20until%20done%22%3A%22soita%20%C3%A4%C3%A4ni%20%5BSOUND%5D%20%5BSTART%5D%20s%3An%20kohdalta%20loppuun%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%20until%20done%22%3A%22soita%20%C3%A4%C3%A4ni%20%5BSOUND%5D%20%5BSTART%5D%20%E2%80%93%20%5BEND%5D%20s%3An%20alueelta%20loppuun%22%2C%22_project%20volume%22%3A%22projektin%20%C3%A4%C3%A4nenvoimakkuus%22%2C%22_resume%20all%20sounds%22%3A%22jatka%20kaikkia%20%C3%A4%C3%A4ni%C3%A4%22%2C%22_sample%20rate%22%3A%22n%C3%A4ytteenottotaajuus%22%2C%22_set%20project%20volume%20to%20%5BVALUE%5D%25%22%3A%22aseta%20projektin%20%C3%A4%C3%A4nenvoimakkuudeksi%20%5BVALUE%5D%20%25%22%2C%22_sound%20%5BSOUND%5D%20is%20playing%3F%22%3A%22soitetaanko%20%C3%A4%C3%A4nt%C3%A4%20%5BSOUND%5D%3F%22%2C%22_start%20looping%20%5BSOUND%5D%22%3A%22soita%20%5BSOUND%5D%20silmukassa%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20region%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22soita%20%5BSOUND%5D%20silmukassa%20%5BSTART%5D%20%E2%80%93%20%5BEND%5D%20s%3An%20alueelta%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20start%20%5BSTART%5D%20seconds%22%3A%22soita%20%5BSOUND%5D%20silmukassa%20aloittaen%20%5BSTART%5D%20s%3An%20kohdalta%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%22%3A%22soita%20%C3%A4%C3%A4ni%20%5BSOUND%5D%20%5BSTART%5D%20s%3An%20kohdalta%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22soita%20%C3%A4%C3%A4ni%20%5BSOUND%5D%20%5BSTART%5D%20%E2%80%93%20%5BEND%5D%20s%3An%20alueelta%22%2C%22_stop%20sound%20%5BSOUND%5D%22%3A%22pys%C3%A4yt%C3%A4%20%C3%A4%C3%A4ni%20%5BSOUND%5D%22%7D%2C%22it%22%3A%7B%22_Sound%20Expanded%22%3A%22Suoni%20Plus%22%7D%2C%22ja%22%3A%7B%22_channels%22%3A%22%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%22%2C%22_length%22%3A%22%E9%95%B7%E3%81%95%22%2C%22_pitch%22%3A%22%E3%83%94%E3%83%83%E3%83%81%22%2C%22_project%20volume%22%3A%22%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%9F%B3%E9%87%8F%22%2C%22_sample%20rate%22%3A%22%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%AC%E3%83%BC%E3%83%88%22%7D%2C%22ko%22%3A%7B%22_Sound%20Expanded%22%3A%22%EC%86%8C%EB%A6%AC%20%ED%99%95%EC%9E%A5%22%2C%22_%5BATTRIBUTE%5D%20of%20%5BSOUND%5D%22%3A%22%5BSOUND%5D%EC%9D%98%20%5BATTRIBUTE%5D%22%2C%22_%5BSOUND%5D%20is%20looping%3F%22%3A%22%5BSOUND%5D%EC%9D%B4(%EA%B0%80)%20%EB%B0%98%EB%B3%B5%20%EC%9E%AC%EC%83%9D%EC%9D%B8%EA%B0%80%3F%22%2C%22_change%20project%20volume%20by%20%5BVALUE%5D%22%3A%22%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%20%EB%B3%BC%EB%A5%A8%EC%9D%84%20%5BVALUE%5D%EB%A7%8C%ED%81%BC%20%EB%B0%94%EA%BE%B8%EA%B8%B0%20%22%2C%22_channels%22%3A%22%EC%B1%84%EB%84%90%20%EC%88%98%22%2C%22_effect%20%5BEFFECT%5D%20of%20%5BTARGET%5D%22%3A%22%5BTARGET%5D%EC%9D%98%20%5BEFFECT%5D%ED%9A%A8%EA%B3%BC%22%2C%22_end%20looping%20%5BSOUND%5D%22%3A%22%5BSOUND%5D%20%EB%B0%98%EB%B3%B5%20%EB%A9%88%EC%B6%94%EA%B8%B0%22%2C%22_length%22%3A%22%EC%9E%AC%EC%83%9D%20%EA%B8%B8%EC%9D%B4%22%2C%22_pan%22%3A%22%EC%86%8C%EB%A6%AC%20%EC%A2%8C%EC%9A%B0%20%EC%9C%84%EC%B9%98%22%2C%22_pause%20all%20sounds%22%3A%22%EB%AA%A8%EB%93%A0%20%EC%86%8C%EB%A6%AC%20%EC%9D%BC%EC%8B%9C%EC%A0%95%EC%A7%80%20%ED%95%98%EA%B8%B0%22%2C%22_pitch%22%3A%22%EC%9D%8C%20%EB%86%92%EC%9D%B4%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%20until%20done%22%3A%22%EC%86%8C%EB%A6%AC%20%5BSOUND%5D%EC%9D%84(%EB%A5%BC)%20%5BSTART%5D%EC%B4%88%EB%B6%80%ED%84%B0%20%EB%81%9D%EA%B9%8C%EC%A7%80%20%EC%9E%AC%EC%83%9D%ED%95%98%EA%B8%B0%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%20until%20done%22%3A%22%EC%86%8C%EB%A6%AC%20%5BSOUND%5D%EC%9D%84(%EB%A5%BC)%20%5BSTART%5D%EC%B4%88%EB%B6%80%ED%84%B0%20%EB%81%9D%EB%82%98%EA%B8%B0%20%5BEND%5D%EC%B4%88%20%EC%A0%84%EA%B9%8C%EC%A7%80%20%EC%9E%AC%EC%83%9D%ED%95%98%EA%B8%B0%22%2C%22_project%20volume%22%3A%22%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%20%EB%B3%BC%EB%A5%A8%22%2C%22_resume%20all%20sounds%22%3A%22%EB%AA%A8%EB%93%A0%20%EC%86%8C%EB%A6%AC%20%EC%9E%AC%EA%B0%9C%ED%95%98%EA%B8%B0%22%2C%22_sample%20rate%22%3A%22%EC%83%98%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8%22%2C%22_set%20project%20volume%20to%20%5BVALUE%5D%25%22%3A%22%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%20%EC%9D%8C%EB%9F%89%EC%9D%84%20%5BVALUE%5D%25%20%EB%A1%9C%20%EC%A0%95%ED%95%98%EA%B8%B0%22%2C%22_sound%20%5BSOUND%5D%20is%20playing%3F%22%3A%22%EC%86%8C%EB%A6%AC%20%5BSOUND%5D%EC%9D%B4(%EA%B0%80)%20%EC%9E%AC%EC%83%9D%20%EC%A4%91%EC%9D%B8%EA%B0%80%3F%22%2C%22_start%20looping%20%5BSOUND%5D%22%3A%22%5BSOUND%5D%20%EB%B0%98%EB%B3%B5%20%EC%9E%AC%EC%83%9D%ED%95%98%EA%B8%B0%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22%EC%86%8C%EB%A6%AC%20%5BSOUND%5D%EC%9D%84(%EB%A5%BC)%20%5BSTART%5D%EC%B4%88%EB%B6%80%ED%84%B0%20%5BEND%5D%EC%B4%88%EA%B9%8C%EC%A7%80%20%EC%9E%AC%EC%83%9D%ED%95%98%EA%B8%B0%22%2C%22_stop%20sound%20%5BSOUND%5D%22%3A%22%EC%86%8C%EB%A6%AC%20%5BSOUND%5D%20%EB%81%84%EA%B8%B0%22%7D%2C%22nb%22%3A%7B%22_Sound%20Expanded%22%3A%22Lyd%20Utvidet%22%7D%2C%22nl%22%3A%7B%22_Sound%20Expanded%22%3A%22Geluid%2B%22%2C%22_%5BATTRIBUTE%5D%20of%20%5BSOUND%5D%22%3A%22%5BATTRIBUTE%5D%20van%20%5BSOUND%5D%22%2C%22_%5BSOUND%5D%20is%20looping%3F%22%3A%22%5BSOUND%5D%20is%20aan%20het%20herhalen%3F%22%2C%22_change%20project%20volume%20by%20%5BVALUE%5D%22%3A%22verander%20projectvolume%20met%20%5BVALUE%5D%22%2C%22_channels%22%3A%22kanalen%22%2C%22_effect%20%5BEFFECT%5D%20of%20%5BTARGET%5D%22%3A%22effect%20%5BEFFECT%5D%20van%20%5BTARGET%5D%22%2C%22_end%20looping%20%5BSOUND%5D%22%3A%22stop%20met%20herhalen%20van%20%5BSOUND%5D%22%2C%22_length%22%3A%22lengte%22%2C%22_pan%22%3A%22kanaal%20links%2Frechts%22%2C%22_pause%20all%20sounds%22%3A%22pauzeer%20alle%20geluiden%22%2C%22_pitch%22%3A%22toonhoogte%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%20until%20done%22%3A%22start%20geluid%20%5BSOUND%5D%20vanaf%20%5BSTART%5D%20seconden%20en%20wacht%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%20until%20done%22%3A%22start%20geluid%20%5BSOUND%5D%20vanaf%20%5BSTART%5D%20tot%20%5BEND%5D%20seconden%20en%20wacht%22%2C%22_project%20volume%22%3A%22projectvolume%22%2C%22_resume%20all%20sounds%22%3A%22hervat%20alle%20geluiden%22%2C%22_sample%20rate%22%3A%22bemonsteringsfrequentie%20(sample%20rate)%22%2C%22_set%20project%20volume%20to%20%5BVALUE%5D%25%22%3A%22zet%20projectvolume%20op%20%5BVALUE%5D%25%22%2C%22_sound%20%5BSOUND%5D%20is%20playing%3F%22%3A%22%5BSOUND%5D%20is%20aan%20het%20spelen%3F%22%2C%22_start%20looping%20%5BSOUND%5D%22%3A%22herhaal%20%5BSOUND%5D%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20region%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22herhaal%20%5BSOUND%5D%20met%20herhaalregio%20%5BSTART%5D%20tot%20%5BEND%5D%20seconden%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20start%20%5BSTART%5D%20seconds%22%3A%22herhaal%20%5BSOUND%5D%20met%20herhaalbegin%20%5BSTART%5D%20seconden%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%22%3A%22start%20geluid%20%5BSOUND%5D%20vanaf%20%5BSTART%5D%20seconden%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22start%20geluid%20%5BSOUND%5D%20vanaf%20%5BSTART%5D%20tot%20%5BEND%5D%20seconden%22%2C%22_stop%20sound%20%5BSOUND%5D%22%3A%22stop%20geluid%20%5BSOUND%5D%22%7D%2C%22ru%22%3A%7B%22_Sound%20Expanded%22%3A%22%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%97%D0%B2%D1%83%D0%BA%22%2C%22_%5BATTRIBUTE%5D%20of%20%5BSOUND%5D%22%3A%22%5BATTRIBUTE%5D%20%D0%B7%D0%B2%D1%83%D0%BA%D0%B0%20%5BSOUND%5D%22%2C%22_%5BSOUND%5D%20is%20looping%3F%22%3A%22%5BSOUND%5D%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D0%B5%D1%82%D1%81%D1%8F%3F%22%2C%22_change%20project%20volume%20by%20%5BVALUE%5D%22%3A%22%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%20%D0%BD%D0%B0%20%5BVALUE%5D%22%2C%22_channels%22%3A%22%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D1%8B%22%2C%22_dataURI%22%3A%22%D0%A5%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5%20%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%22%2C%22_effect%20%5BEFFECT%5D%20of%20%5BTARGET%5D%22%3A%22%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%20%5BEFFECT%5D%20%D1%86%D0%B5%D0%BB%D0%B8%20%5BTARGET%5D%22%2C%22_end%20looping%20%5BSOUND%5D%22%3A%22%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D1%87%D0%B8%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%B5%D0%BD%D0%B8%D0%B5%20%5BSOUND%5D%22%2C%22_length%22%3A%22%D0%B4%D0%BB%D0%B8%D0%BD%D0%B0%22%2C%22_pan%22%3A%22%D0%9F%D0%B0%D0%BD%22%2C%22_pause%20all%20sounds%22%3A%22%D0%BF%D1%80%D0%B8%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D0%B7%D0%B2%D1%83%D0%BA%D0%B8%22%2C%22_pitch%22%3A%22%D0%92%D1%8B%D1%81%D0%BE%D1%82%D0%B0%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%20until%20done%22%3A%22%D0%B8%D0%B3%D1%80%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%5BSOUND%5D%20%D1%81%20%5BSTART%5D%20%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%20%D0%B8%20%D0%B6%D0%B4%D0%B0%D1%82%D1%8C%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%20until%20done%22%3A%22%D0%B8%D0%B3%D1%80%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%5BSOUND%5D%20%D1%81%20%5BSTART%5D%20%D0%B4%D0%BE%20%5BEND%5D%20%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%20%D0%B8%20%D0%B6%D0%B4%D0%B0%D1%82%D1%8C%22%2C%22_project%20volume%22%3A%22%D0%B7%D0%B2%D1%83%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%22%2C%22_resume%20all%20sounds%22%3A%22%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B8%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D0%B7%D0%B2%D1%83%D0%BA%D0%B8%22%2C%22_sample%20rate%22%3A%22%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%B0%20%D0%B4%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8%22%2C%22_set%20project%20volume%20to%20%5BVALUE%5D%25%22%3A%22%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%20%D0%BD%D0%B0%20%5BVALUE%5D%25%22%2C%22_sound%20%5BSOUND%5D%20is%20playing%3F%22%3A%22%D0%B7%D0%B2%D1%83%D0%BA%20%5BSOUND%5D%20%D0%B8%D0%B3%D1%80%D0%B0%D0%B5%D1%82%3F%22%2C%22_start%20looping%20%5BSOUND%5D%22%3A%22%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%82%D1%8C%20%5BSOUND%5D%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20region%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%82%D1%8C%20%5BSOUND%5D%20%D1%80%D0%B5%D0%B3%D0%B8%D0%BE%D0%BD%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%B5%D0%BD%D0%B8%D1%8F%20%5BSTART%5D%20%D0%BA%20%5BEND%5D%20%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%D0%B0%D0%BC%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20start%20%5BSTART%5D%20seconds%22%3A%22%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%82%D1%8C%20%5BSOUND%5D%20%D0%B8%20%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D1%81%20%5BSTART%5D%20%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%22%3A%22%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%5BSOUND%5D%20%D1%81%20%5BSTART%5D%20%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%5BSOUND%5D%20%D1%81%20%5BSTART%5D%20%D0%B4%D0%BE%20%5BEND%5D%20%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4%22%2C%22_stop%20sound%20%5BSOUND%5D%22%3A%22%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B2%D1%83%D0%BA%20%5BSOUND%5D%22%7D%2C%22tr%22%3A%7B%22_Sound%20Expanded%22%3A%22Geni%C5%9Fletilmi%C5%9F%20Ses%22%7D%2C%22uk%22%3A%7B%22_Sound%20Expanded%22%3A%22%D0%97%D0%B2%D1%83%D0%BA%2B%22%7D%2C%22zh-cn%22%3A%7B%22_Sound%20Expanded%22%3A%22%E5%A3%B0%E9%9F%B3%E7%A7%AF%E6%9C%A8%E6%89%A9%E5%B1%95%22%2C%22_%5BATTRIBUTE%5D%20of%20%5BSOUND%5D%22%3A%22%5BSOUND%5D%E7%9A%84%5BATTRIBUTE%5D%22%2C%22_%5BSOUND%5D%20is%20looping%3F%22%3A%22%5BSOUND%5D%E6%AD%A3%E5%9C%A8%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE%EF%BC%9F%22%2C%22_change%20project%20volume%20by%20%5BVALUE%5D%22%3A%22%E5%B0%86%E4%BD%9C%E5%93%81%E9%9F%B3%E9%87%8F%E5%A2%9E%E5%8A%A0%5BVALUE%5D%22%2C%22_channels%22%3A%22%E5%A3%B0%E9%81%93%E6%95%B0%22%2C%22_dataURI%22%3A%22dataURL%22%2C%22_effect%20%5BEFFECT%5D%20of%20%5BTARGET%5D%22%3A%22%5BTARGET%5D%E7%9A%84%E9%9F%B3%E6%95%88%5BEFFECT%5D%22%2C%22_end%20looping%20%5BSOUND%5D%22%3A%22%E5%81%9C%E6%AD%A2%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE%5BSOUND%5D%22%2C%22_length%22%3A%22%E6%97%B6%E9%95%BF%22%2C%22_pan%22%3A%22%E5%B7%A6%E5%8F%B3%E5%B9%B3%E8%A1%A1%22%2C%22_pause%20all%20sounds%22%3A%22%E6%9A%82%E5%81%9C%E6%89%80%E6%9C%89%E5%A3%B0%E9%9F%B3%22%2C%22_pitch%22%3A%22%E9%9F%B3%E8%B0%83%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%20until%20done%22%3A%22%E4%BB%8E%E7%AC%AC%5BSTART%5D%E7%A7%92%E5%BC%80%E5%A7%8B%E6%92%AD%E6%94%BE%5BSOUND%5D%E7%9B%B4%E5%88%B0%E7%BB%93%E6%9D%9F%22%2C%22_play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%20until%20done%22%3A%22%E6%92%AD%E6%94%BE%5BSOUND%5D%E7%9A%84%E7%AC%AC%5BSTART%5D%E5%88%B0%5BEND%5D%E7%A7%92%E7%9B%B4%E5%88%B0%E7%BB%93%E6%9D%9F%22%2C%22_project%20volume%22%3A%22%E4%BD%9C%E5%93%81%E9%9F%B3%E9%87%8F%22%2C%22_resume%20all%20sounds%22%3A%22%E7%BB%A7%E7%BB%AD%E6%89%80%E6%9C%89%E5%A3%B0%E9%9F%B3%22%2C%22_sample%20rate%22%3A%22%E9%87%87%E6%A0%B7%E7%8E%87%22%2C%22_set%20project%20volume%20to%20%5BVALUE%5D%25%22%3A%22%E5%B0%86%E4%BD%9C%E5%93%81%E9%9F%B3%E9%87%8F%E8%AE%BE%E4%B8%BA%5BVALUE%5D%25%22%2C%22_sound%20%5BSOUND%5D%20is%20playing%3F%22%3A%22%E5%A3%B0%E9%9F%B3%5BSOUND%5D%E6%AD%A3%E5%9C%A8%E6%92%AD%E6%94%BE%EF%BC%9F%22%2C%22_start%20looping%20%5BSOUND%5D%22%3A%22%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE%5BSOUND%5D%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20region%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE%5BSOUND%5D%E7%9A%84%E7%AC%AC%5BSTART%5D%E5%88%B0%5BEND%5D%E7%A7%92%22%2C%22_start%20looping%20%5BSOUND%5D%20loop%20start%20%5BSTART%5D%20seconds%22%3A%22%E4%BB%8E%E7%AC%AC%5BSTART%5D%E7%A7%92%E5%BC%80%E5%A7%8B%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE%5BSOUND%5D%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%22%3A%22%E4%BB%8E%E7%AC%AC%5BSTART%5D%E7%A7%92%E5%BC%80%E5%A7%8B%E6%92%AD%E6%94%BE%5BSOUND%5D%22%2C%22_start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%3A%22%E6%92%AD%E6%94%BE%5BSOUND%5D%E7%9A%84%E7%AC%AC%5BSTART%5D%E5%88%B0%5BEND%5D%E7%A7%92%22%2C%22_stop%20sound%20%5BSOUND%5D%22%3A%22%E5%81%9C%E6%AD%A2%E6%92%AD%E6%94%BE%5BSOUND%5D%22%7D%7D)%3B%2F*%20end%20generated%20l10n%20code%20*%2F(function%20(Scratch)%20%7B%0D%0A%20%20%22use%20strict%22%3B%0D%0A%0D%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0D%0A%20%20const%20runtime%20%3D%20vm.runtime%3B%0D%0A%20%20const%20soundCategory%20%3D%20runtime.ext_scratch3_sound%3B%0D%0A%0D%0A%20%20class%20SoundExpanded%20%7B%0D%0A%20%20%20%20getInfo()%20%7B%0D%0A%20%20%20%20%20%20return%20%7B%0D%0A%20%20%20%20%20%20%20%20id%3A%20%22lmsSoundExpanded%22%2C%0D%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23CF63CF%22%2C%0D%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23C94FC9%22%2C%0D%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23BD42BD%22%2C%0D%0A%20%20%20%20%20%20%20%20name%3A%20Scratch.translate(%22Sound%20Expanded%22)%2C%0D%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22startLooping%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22start%20looping%20%5BSOUND%5D%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22startLoopingBegin%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22start%20looping%20%5BSOUND%5D%20loop%20start%20%5BSTART%5D%20seconds%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%222%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22startLoopingBeginEnd%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22start%20looping%20%5BSOUND%5D%20loop%20region%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%222%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20END%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%224%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22stopLooping%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22end%20looping%20%5BSOUND%5D%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isLooping%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22%5BSOUND%5D%20is%20looping%3F%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22playSoundAtAndWait%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%20until%20done%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%222%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22playSoundAt%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20seconds%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%222%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22playSoundToAndWait%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22play%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%20until%20done%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%222%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20END%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%224%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22playSoundTo%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22start%20sound%20%5BSOUND%5D%20from%20%5BSTART%5D%20to%20%5BEND%5D%20seconds%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%222%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20END%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%224%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22stopSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22stop%20sound%20%5BSOUND%5D%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22pauseSounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22pause%20all%20sounds%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resumeSounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22resume%20all%20sounds%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isSoundPlaying%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22sound%20%5BSOUND%5D%20is%20playing%3F%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22attributeOfSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22%5BATTRIBUTE%5D%20of%20%5BSOUND%5D%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ATTRIBUTE%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22attribute%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getSoundEffect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22effect%20%5BEFFECT%5D%20of%20%5BTARGET%5D%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EFFECT%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22effect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TARGET%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22targets%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setProjectVolume%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22set%20project%20volume%20to%20%5BVALUE%5D%25%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20100%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changeProjectVolume%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22change%20project%20volume%20by%20%5BVALUE%5D%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20-10%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getProjectVolume%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22project%20volume%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20extensions%3A%20%5B%22colours_sounds%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20attribute%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20false%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22length%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22length%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22channels%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22channels%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22sample%20rate%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22sample%20rate%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22dataURI%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22dataURI%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20effect%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20false%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22pitch%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22pitch%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22pan%22)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22pan%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20targets%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%22_getTargets%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20_startLooping(util%2C%20sound%2C%20loopStart%2C%20loopEnd)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(sound%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20target%20%3D%20util.target%3B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20util.target.sprite%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20soundId%20%3D%20sprite.sounds%5Bindex%5D.soundId%3B%0D%0A%20%20%20%20%20%20const%20soundPlayer%20%3D%20sprite.soundBank.soundPlayers%5BsoundId%5D%3B%0D%0A%0D%0A%20%20%20%20%20%20if%20(!soundPlayer.isPlaying)%20%7B%0D%0A%20%20%20%20%20%20%20%20soundCategory._addWaitingSound(target.id%2C%20soundId)%3B%0D%0A%20%20%20%20%20%20%20%20sprite.soundBank.playSound(util.target%2C%20soundId)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20if%20(!soundPlayer.outputNode)%20return%3B%0D%0A%0D%0A%20%20%20%20%20%20soundPlayer.outputNode.loop%20%3D%20true%3B%0D%0A%20%20%20%20%20%20soundPlayer.outputNode.loopStart%20%3D%20loopStart%3B%0D%0A%20%20%20%20%20%20%2F%2F%20If%20loopEnd%20is%20the%20default%20of%200%2C%20then%20loopStart%20is%20ignored%0D%0A%20%20%20%20%20%20soundPlayer.outputNode.loopEnd%20%3D%0D%0A%20%20%20%20%20%20%20%20loopEnd%20%7C%7C%20soundPlayer.outputNode.buffer.duration%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20startLooping(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._startLooping(util%2C%20args.SOUND%2C%200%2C%200)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20startLoopingBegin(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._startLooping(%0D%0A%20%20%20%20%20%20%20%20util%2C%0D%0A%20%20%20%20%20%20%20%20args.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.START)%2C%0D%0A%20%20%20%20%20%20%20%200%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20startLoopingBeginEnd(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._startLooping(%0D%0A%20%20%20%20%20%20%20%20util%2C%0D%0A%20%20%20%20%20%20%20%20args.SOUND%2C%0D%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.START)%2C%0D%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.END)%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20stopLooping(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(args.SOUND%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%20false%3B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20util.target.sprite%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20soundId%20%3D%20sprite.sounds%5Bindex%5D.soundId%3B%0D%0A%20%20%20%20%20%20const%20soundPlayer%20%3D%20sprite.soundBank.soundPlayers%5BsoundId%5D%3B%0D%0A%0D%0A%20%20%20%20%20%20if%20(!soundPlayer.outputNode)%20return%3B%0D%0A%20%20%20%20%20%20soundPlayer.outputNode.loop%20%3D%20false%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20isLooping(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(args.SOUND%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%20false%3B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20util.target.sprite%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20soundId%20%3D%20sprite.sounds%5Bindex%5D.soundId%3B%0D%0A%20%20%20%20%20%20const%20soundPlayer%20%3D%20sprite.soundBank.soundPlayers%5BsoundId%5D%3B%0D%0A%0D%0A%20%20%20%20%20%20if%20(!soundPlayer.outputNode)%20return%20false%3B%0D%0A%20%20%20%20%20%20return%20soundPlayer.outputNode.loop%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20https%3A%2F%2Fgithub.com%2Fscratchfoundation%2Fscratch-vm%2Fblob%2F7c1187cc1fe1c763ef61598875acd4fc9a0c8c2e%2Fsrc%2Fblocks%2Fscratch3_sound.js%23L164%0D%0A%20%20%20%20_playSoundAt(args%2C%20util%2C%20storeWaiting)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(args.SOUND%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3E%3D%200)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20%7B%20target%20%7D%20%3D%20util%3B%0D%0A%20%20%20%20%20%20%20%20const%20%7B%20sprite%20%7D%20%3D%20target%3B%0D%0A%20%20%20%20%20%20%20%20const%20%7B%20soundId%20%7D%20%3D%20sprite.sounds%5Bindex%5D%3B%0D%0A%20%20%20%20%20%20%20%20const%20start%20%3D%20Math.max(Scratch.Cast.toNumber(args.START)%2C%200)%3B%0D%0A%20%20%20%20%20%20%20%20const%20end%20%3D%0D%0A%20%20%20%20%20%20%20%20%20%20args.END%20%3D%3D%20undefined%20%3F%20undefined%20%3A%20Scratch.Cast.toNumber(args.END)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(sprite.soundBank)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(storeWaiting%20%3D%3D%3D%20true)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%20not%20typed%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.ext_scratch3_sound._addWaitingSound(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20target.id%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20soundId%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%20not%20typed%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.ext_scratch3_sound._removeWaitingSound(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20target.id%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20soundId%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20return%20this._playSoundBankSound(%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sprite.soundBank%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20target%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20soundId%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20start%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20end%0D%0A%20%20%20%20%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20https%3A%2F%2Fgithub.com%2Fscratchfoundation%2Fscratch-audio%2Fblob%2F6fb4b142a5f3198483e4c4f992fb623d5e9d1ed5%2Fsrc%2FSoundBank.js%23L89%0D%0A%20%20%20%20_playSoundBankSound(bank%2C%20target%2C%20soundId%2C%20start%2C%20end)%20%7B%0D%0A%20%20%20%20%20%20const%20effects%20%3D%20bank.getSoundEffects(soundId)%3B%0D%0A%20%20%20%20%20%20const%20player%20%3D%20bank.getSoundPlayer(soundId)%3B%0D%0A%0D%0A%20%20%20%20%20%20if%20(bank.playerTargets.get(soundId)%20!%3D%3D%20target)%20%7B%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20make%20sure%20to%20stop%20the%20old%20sound%2C%20effectively%20%22forking%22%20the%20output%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20when%20the%20target%20switches%20before%20we%20adjust%20it's%20effects%0D%0A%20%20%20%20%20%20%20%20player.stop()%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20bank.playerTargets.set(soundId%2C%20target)%3B%0D%0A%20%20%20%20%20%20effects.addSoundPlayer(player)%3B%0D%0A%20%20%20%20%20%20effects.setEffectsFromTarget(target)%3B%0D%0A%20%20%20%20%20%20player.connect(effects)%3B%0D%0A%0D%0A%20%20%20%20%20%20this._playSoundPlayer(player%2C%20start%2C%20end)%3B%0D%0A%0D%0A%20%20%20%20%20%20return%20player.finished()%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20https%3A%2F%2Fgithub.com%2Fscratchfoundation%2Fscratch-audio%2Fblob%2F6fb4b142a5f3198483e4c4f992fb623d5e9d1ed5%2Fsrc%2FSoundPlayer.js%23L253%0D%0A%20%20%20%20_playSoundPlayer(player%2C%20start%2C%20end)%20%7B%0D%0A%20%20%20%20%20%20if%20(player.isStarting)%20%7B%0D%0A%20%20%20%20%20%20%20%20player.emit(%22stop%22)%3B%0D%0A%20%20%20%20%20%20%20%20player.emit(%22play%22)%3B%0D%0A%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20if%20(player.isPlaying)%20%7B%0D%0A%20%20%20%20%20%20%20%20player.stop()%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20if%20(player.initialized)%20%7B%0D%0A%20%20%20%20%20%20%20%20player._createSource()%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20player.initialize()%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20if%20(end%20%3D%3D%3D%20undefined)%20%7B%0D%0A%20%20%20%20%20%20%20%20player.outputNode.start(0%2C%20start)%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20player.outputNode.start(0%2C%20start%2C%20Math.max(end%20-%20start%2C%200))%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20player.isPlaying%20%3D%20true%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20%7B%20currentTime%2C%20DECAY_DURATION%20%7D%20%3D%20player.audioEngine%3B%0D%0A%20%20%20%20%20%20player.startingUntil%20%3D%20currentTime%20%2B%20DECAY_DURATION%3B%0D%0A%0D%0A%20%20%20%20%20%20player.emit(%22play%22)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20playSoundAt(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._playSoundAt(args%2C%20util)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20playSoundAtAndWait(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20return%20this._playSoundAt(args%2C%20util%2C%20true)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20playSoundTo(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._playSoundAt(args%2C%20util)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20playSoundToAndWait(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20return%20this._playSoundAt(args%2C%20util%2C%20true)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20stopSound(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(args.SOUND%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%200%3B%0D%0A%20%20%20%20%20%20const%20target%20%3D%20util.target%3B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20target.sprite%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20soundId%20%3D%20sprite.sounds%5Bindex%5D.soundId%3B%0D%0A%20%20%20%20%20%20const%20soundBank%20%3D%20sprite.soundBank%3B%0D%0A%20%20%20%20%20%20soundBank.stop(target%2C%20soundId)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20pauseSounds(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._toggleSoundState(args%2C%20util%2C%20true)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20resumeSounds(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20this._toggleSoundState(args%2C%20util%2C%20false)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20_toggleSoundState(args%2C%20util%2C%20state)%20%7B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20util.target.sprite%3B%0D%0A%20%20%20%20%20%20const%20audioContext%20%3D%20sprite.soundBank.audioEngine.audioContext%3B%0D%0A%0D%0A%20%20%20%20%20%20if%20(state)%20%7B%0D%0A%20%20%20%20%20%20%20%20audioContext.suspend()%3B%0D%0A%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20audioContext.resume()%3B%0D%0A%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20isSoundPlaying(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(args.SOUND%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%20false%3B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20util.target.sprite%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20soundId%20%3D%20sprite.sounds%5Bindex%5D.soundId%3B%0D%0A%20%20%20%20%20%20const%20soundPlayers%20%3D%20sprite.soundBank.soundPlayers%3B%0D%0A%20%20%20%20%20%20return%20soundPlayers%5BsoundId%5D.isPlaying%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20attributeOfSound(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndex(args.SOUND%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%200%3B%0D%0A%20%20%20%20%20%20const%20sprite%20%3D%20util.target.sprite%3B%0D%0A%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20sprite.sounds%5Bindex%5D%3B%0D%0A%20%20%20%20%20%20const%20soundId%20%3D%20sound.soundId%3B%0D%0A%20%20%20%20%20%20const%20soundPlayer%20%3D%20sprite.soundBank.soundPlayers%5BsoundId%5D%3B%0D%0A%20%20%20%20%20%20const%20soundBuffer%20%3D%20soundPlayer.buffer%3B%0D%0A%0D%0A%20%20%20%20%20%20switch%20(args.ATTRIBUTE)%20%7B%0D%0A%20%20%20%20%20%20%20%20case%20%22length%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20return%20Math.round(soundBuffer.duration%20*%20100)%20%2F%20100%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22channels%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20return%20soundBuffer.numberOfChannels%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22sample%20rate%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20return%20soundBuffer.sampleRate%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22dataURI%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20return%20sound.asset.encodeDataURI()%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getSoundEffect(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20let%20target%20%3D%20Scratch.vm.runtime.getSpriteTargetByName(args.TARGET)%3B%0D%0A%20%20%20%20%20%20if%20(args.TARGET%20%3D%3D%3D%20%22_myself_%22)%20target%20%3D%20util.target%3B%0D%0A%20%20%20%20%20%20if%20(args.TARGET%20%3D%3D%3D%20%22_stage_%22)%20target%20%3D%20runtime.getTargetForStage()%3B%0D%0A%20%20%20%20%20%20const%20effects%20%3D%20target.soundEffects%3B%0D%0A%20%20%20%20%20%20if%20(!effects)%20return%200%3B%0D%0A%20%20%20%20%20%20return%20effects%5Bargs.EFFECT%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setProjectVolume(args)%20%7B%0D%0A%20%20%20%20%20%20const%20value%20%3D%20Scratch.Cast.toNumber(args.VALUE)%20%2F%20100%3B%0D%0A%20%20%20%20%20%20const%20newVolume%20%3D%20Scratch.Cast.toNumber(Math.max(Math.min(value%2C%201)%2C%200))%3B%0D%0A%20%20%20%20%20%20runtime.audioEngine.inputNode.gain.value%20%3D%20newVolume%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20changeProjectVolume(args)%20%7B%0D%0A%20%20%20%20%20%20const%20value%20%3D%20Scratch.Cast.toNumber(args.VALUE)%20%2F%20100%3B%0D%0A%20%20%20%20%20%20const%20volume%20%3D%20runtime.audioEngine.inputNode.gain.value%3B%0D%0A%20%20%20%20%20%20const%20newVolume%20%3D%20Scratch.Cast.toNumber(%0D%0A%20%20%20%20%20%20%20%20Math.max(Math.min(volume%20%2B%20value%2C%201)%2C%200)%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%20%20runtime.audioEngine.inputNode.gain.value%20%3D%20newVolume%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getProjectVolume()%20%7B%0D%0A%20%20%20%20%20%20const%20volume%20%3D%20runtime.audioEngine.inputNode.gain.value%3B%0D%0A%20%20%20%20%20%20return%20Math.round(volume%20*%2010000)%20%2F%20100%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F*%20Utility%20Functions%20*%2F%0D%0A%0D%0A%20%20%20%20_getSoundIndex(soundName%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20len%20%3D%20util.target.sprite.sounds.length%3B%0D%0A%20%20%20%20%20%20if%20(len%20%3D%3D%3D%200)%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20-1%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this._getSoundIndexByName(soundName%2C%20util)%3B%0D%0A%20%20%20%20%20%20if%20(index%20!%3D%3D%20-1)%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20index%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20oneIndexedIndex%20%3D%20parseInt(soundName%2C%2010)%3B%0D%0A%20%20%20%20%20%20if%20(!isNaN(oneIndexedIndex))%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20this._wrapClamp(oneIndexedIndex%20-%201%2C%200%2C%20len%20-%201)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20-1%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20_getSoundIndexByName(soundName%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20sounds%20%3D%20util.target.sprite.sounds%3B%0D%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20sounds.length%3B%20i%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(sounds%5Bi%5D.name%20%3D%3D%3D%20soundName)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20return%20i%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20-1%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20_wrapClamp(n%2C%20min%2C%20max)%20%7B%0D%0A%20%20%20%20%20%20const%20range%20%3D%20max%20-%20min%20%2B%201%3B%0D%0A%20%20%20%20%20%20return%20n%20-%20Math.floor((n%20-%20min)%20%2F%20range)%20*%20range%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20_getTargets()%20%7B%0D%0A%20%20%20%20%20%20let%20spriteNames%20%3D%20%5B%0D%0A%20%20%20%20%20%20%20%20%7B%20text%3A%20%22myself%22%2C%20value%3A%20%22_myself_%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%7B%20text%3A%20%22Stage%22%2C%20value%3A%20%22_stage_%22%20%7D%2C%0D%0A%20%20%20%20%20%20%5D%3B%0D%0A%20%20%20%20%20%20const%20targets%20%3D%20Scratch.vm.runtime.targets%0D%0A%20%20%20%20%20%20%20%20.filter((target)%20%3D%3E%20target.isOriginal%20%26%26%20!target.isStage)%0D%0A%20%20%20%20%20%20%20%20.map((target)%20%3D%3E%20target.getName())%3B%0D%0A%20%20%20%20%20%20spriteNames%20%3D%20spriteNames.concat(targets)%3B%0D%0A%20%20%20%20%20%20return%20spriteNames%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%0D%0A%0D%0A%20%20Scratch.extensions.register(new%20SoundExpanded())%3B%0D%0A%7D)(Scratch)%3B%0D%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Tune%20Shark%20V3%0D%0A%2F%2F%20ID%3A%20SPtuneShark3%0D%0A%2F%2F%20Description%3A%20Advanced%20Audio%20Engine%2C%20giving%20Complex%20Sound%20Control%0D%0A%2F%2F%20By%3A%20SharkPool%0D%0A%2F%2F%20License%3A%20MIT%20AND%20LGPL-3.0%0D%0A%0D%0A%2F%2F%20Version%20V.3.3.03%0D%0A%2F%2F%20Thanks%20to%20HOME%20for%20the%20song%20%22Resonance%22%20being%20used%20as%20the%20default%20audio%20link%0D%0A%0D%0A(function%20(Scratch)%20%7B%0D%0A%20%20%22use%20strict%22%3B%0D%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22Tune%20Shark%20V3%20must%20be%20run%20unsandboxed%22)%3B%0D%0A%0D%0A%20%20const%20menuIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDIuMTg1IiBoZWlnaHQ9IjEwMi4xODUiIHZpZXdCb3g9IjAgMCAxMDIuMTg1IDEwMi4xODUiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCI%2BPHBhdGggZD0iTTAgNTEuMDkzQzAgMjIuODc1IDIyLjg3NSAwIDUxLjA5MyAwczUxLjA5MyAyMi44NzUgNTEuMDkzIDUxLjA5My0yMi44NzUgNTEuMDkzLTUxLjA5MyA1MS4wOTNTMCA3OS4zMTEgMCA1MS4wOTMiIGZpbGw9IiM0MDQwNDAiLz48cGF0aCBkPSJNNC44NiA1MS4wOTNjMC0yNS41MzQgMjAuNy00Ni4yMzMgNDYuMjMzLTQ2LjIzMyAyNS41MzQgMCA0Ni4yMzMgMjAuNyA0Ni4yMzMgNDYuMjMzIDAgMjUuNTM0LTIwLjcgNDYuMjMzLTQ2LjIzMyA0Ni4yMzMtMjUuNTM0IDAtNDYuMjMzLTIwLjctNDYuMjMzLTQ2LjIzMyIgZmlsbD0iIzY2NiIvPjxwYXRoIGQ9Ik03Mi44MzcgODYuNjQzdi0uMDAzYy0xLjI1NCAyLjUzNi00LjY2OCAzLjkzNS04LjI2NCAzLjE5Ny00LjExOC0uODQ0LTYuOTE1LTQuMTctNi4yNDYtNy40MjguNjY4LTMuMjYgNC41NDgtNS4yMTYgOC42NjYtNC4zNzEgMS44NzUuMzg0IDMuNDc0IDEuMjg0IDQuNiAyLjQ1N2w2LjY4My0xNC4xNzhjLTEwLjU2Ni00LjEzNS0xOS43Ni01LjA5Ni0xOS43Ni01LjA5NmwtOC45ODcgMTkuMDYxYy0uOTY2IDIuOTI3LTQuNjM2IDQuNjIyLTguNTIgMy44MjYtNC4xMTctLjg0NC02LjkxNC00LjE3LTYuMjQ2LTcuNDMuNjY5LTMuMjU4IDQuNTQ4LTUuMjE0IDguNjY3LTQuMzcgMS45MS4zOTEgMy41MzYgMS4zMTcgNC42NjQgMi41MjJsMTIuMDM1LTI1LjUwN3MxMy41MzIuMjM2IDI2Ljk0NyA3LjExNHoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJtMjguMzA5IDMwLjgzMSA0LjA0MyAyMy42ODQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIi8%2BPHBhdGggZD0iTTM0LjAzMyA1NS4yMTljMS4zOCAyLjYwNi0uNzcyIDYuMDQtNC44MDggNy42Ny00LjAzNyAxLjYzLTguNDI5LjgzNy05LjgxLTEuNzctMS4zOC0yLjYwNi43NzItNi4wNCA0LjgwOS03LjY3IDQuMDM2LTEuNjI5IDguNDI4LS44MzcgOS44MDkgMS43N20tNy45NS0yNy4wNjhzOS43MDUtMS43MDQgMTIuMzYzIDIuNzdjMi4zNzUgNCAuMDcxIDguNjk1LjIxMiAxMC4xMjguMTQgMS40MzMgMi4xNzUgMS4xMDkgMi4xNzUgMS4xMDlsLS4wMTQgMS42NzRzLTIuODY0LjY2OS0zLjQxMi0xLjMyYy0uNTQ3LTEuOTg4LS41Ni01Ljk3OC0yLjgyMy04LjIyNy0yLjI2NS0yLjI1LTcuNTM3LS43NTktNy41MzctLjc1OSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik02MC40MzYgMzUuMzcxYy0uMzMzIDIuMTE4LTIuMzUzIDMuMzA5LTQuMTg5IDQuMDAyLTEuNjUuNzI2LTMuNTUgMS4wMDgtNS4yNzYuMzctMS42MzEtLjM4MS0zLjE4OC0xLjgwNy0yLjk5NC0zLjU5OC4xNTQtMi4wODUgMS44OTYtMy44MjIgMy44NDItNC40MDUgMS45NC0uNzk5IDQuMjUzLS43MyA2LjEwNS4yNi45MTMuNDIxIDIuMTg5LTE0LjE0MiAzLjAzNS0yMC41ODMuMS0uNjQyIDIuNTg0LS40NyAyLjUxMy4xNTEgMCAwLTEuODU0IDE1LjUyMi0zLjAzNiAyMy44MDMiIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4%3D%22%3B%0D%0A%20%20const%20blockIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3OC45NzQiIGhlaWdodD0iNzguOTc0IiB2aWV3Qm94PSIwIDAgNzguOTc0IDc4Ljk3NCI%2BPGcgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIj48cGF0aCBkPSJNMCA3OC45NzRWMGg3OC45NzR2NzguOTc0eiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Im02MS4yMDIgNTMuODM2LS4wMDItLjAwM2MtLjA2OCAzLjcxLTMuMzM3IDcuMjgtOC4wMTYgOC40MTYtNS4zNTkgMS4zMDItMTAuNTM4LTEuMDgtMTEuNTY4LTUuMzJzMi40OC04LjczMyA3LjgzOS0xMC4wMzVjMi40NC0uNTkzIDQuODQtLjQyIDYuODMxLjM0MnYtMjAuNTZjLTE0Ljg1IDEuMDAzLTI2LjI5OCA1LjAwNi0yNi4yOTggNS4wMDZ2MjcuNjQ0Yy40OSA0LjAxNC0yLjkxNiA4LjA3OC03Ljk3IDkuMzA2LTUuMzU4IDEuMzAxLTEwLjUzNy0xLjA4MS0xMS41NjctNS4zMjFzMi40OC04LjczMyA3LjgzOC0xMC4wMzVjMi40ODYtLjYwNCA0LjkzMy0uNDE0IDYuOTQ2LjM4NGwuMDEyLTM2Ljk5OHMxNi4xOS03LjI5IDM1Ljk1NS02LjYzM3oiIGZpbGw9IiNmZmYiLz48L2c%2BPC9zdmc%2B%22%3B%0D%0A%0D%0A%20%20const%20settingsIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3OC45NzQiIGhlaWdodD0iNzguOTc0IiB2aWV3Qm94PSIwIDAgNzguOTc0IDc4Ljk3NCI%2BPGcgc3Ryb2tlLXdpZHRoPSIwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiID48cGF0aCBkPSJtNjQuNTMzIDQyLjYxIDIuMDQyLjg1NWE1LjAyIDUuMDIgMCAwIDEgMi42OSA2LjU3bC0xLjM3IDMuMjc0YTUuMDIgNS4wMiAwIDAgMS02LjU3IDIuNjlsLTIuMDQyLS44NTVhMjUgMjUgMCAwIDEtNC4yOTUgNC4yNmwuODQgMi4wNWE1LjAyIDUuMDIgMCAwIDEtMi43NDIgNi41NDhsLTMuMjg1IDEuMzQ1YTUuMDIgNS4wMiAwIDAgMS02LjU0OC0yLjc0MmwtLjg0LTIuMDVhMjUgMjUgMCAwIDEtNi4wNDktLjAyMmwtLjg1NSAyLjA0MmE1LjAyIDUuMDIgMCAwIDEtNi41NyAyLjY5bC0zLjI3NC0xLjM3YTUuMDIgNS4wMiAwIDAgMS0yLjY5LTYuNTdsLjg1NS0yLjA0MmEyNSAyNSAwIDAgMS00LjI2LTQuMjk1bC0yLjA1Ljg0YTUuMDIgNS4wMiAwIDAgMS02LjU0OC0yLjc0MmwtMS4zNDUtMy4yODVhNS4wMiA1LjAyIDAgMCAxIDIuNzQyLTYuNTQ4bDIuMDUtLjg0YTI1IDI1IDAgMCAxIC4wMjItNi4wNDlsLTIuMDQyLS44NTVhNS4wMiA1LjAyIDAgMCAxLTIuNjktNi41N2wxLjM3LTMuMjc0YTUuMDIgNS4wMiAwIDAgMSA2LjU3LTIuNjlsMi4wNDIuODU1YTI1IDI1IDAgMCAxIDQuMjk1LTQuMjZsLS44NC0yLjA1YTUuMDIgNS4wMiAwIDAgMSAyLjc0Mi02LjU0OGwzLjI4NS0xLjM0NWE1LjAyIDUuMDIgMCAwIDEgNi41NDggMi43NDJsLjg0IDIuMDVhMjUgMjUgMCAwIDEgNi4wNDkuMDIybC44NTUtMi4wNDJhNS4wMiA1LjAyIDAgMCAxIDYuNTctMi42OWwzLjI3NCAxLjM3YTUuMDIgNS4wMiAwIDAgMSAyLjY5IDYuNTdsLS44NTUgMi4wNDJhMjUgMjUgMCAwIDEgNC4yNiA0LjI5NWwyLjA1LS44NGE1LjAyIDUuMDIgMCAwIDEgNi41NDggMi43NDJsMS4zNDUgMy4yODVhNS4wMiA1LjAyIDAgMCAxLTIuNzQyIDYuNTQ4bC0yLjA1Ljg0YTI1IDI1IDAgMCAxLS4wMjIgNi4wNDltLTM3LjQ5OC04LjMzOGMtMi44OCA2Ljg3Ny4zNiAxNC43ODcgNy4yMzcgMTcuNjY3czE0Ljc4Ny0uMzYgMTcuNjY3LTcuMjM3LS4zNi0xNC43ODctNy4yMzctMTcuNjY3LTE0Ljc4Ny4zNi0xNy42NjcgNy4yMzciIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNMCA3OC45NzRWMGg3OC45NzR2NzguOTc0eiIgZmlsbD0ibm9uZSIvPjwvZz48L3N2Zz4%3D%22%3B%0D%0A%20%20const%20nobIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3OC45NzQiIGhlaWdodD0iNzguOTc0IiB2aWV3Qm94PSIwIDAgNzguOTc0IDc4Ljk3NCI%2BPGcgc3Ryb2tlLXdpZHRoPSIwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiPjxwYXRoIGQ9Ik0wIDc4Ljk3NFYwaDc4Ljk3NHY3OC45NzR6IiBmaWxsPSJub25lIi8%2BPHBhdGggZD0iTTM3Ljk2MSAxMC44NDdhMi4xMDUgMi4xMDUgMCAwIDEtMi4xMDQtMi4xMDRWNS42OTJjMC0xLjE2My45NDItMi4xMDUgMi4xMDQtMi4xMDVoMy4wNTJjMS4xNjIgMCAyLjEwNC45NDIgMi4xMDQgMi4xMDV2My4wNTFhMi4xMDUgMi4xMDUgMCAwIDEtMi4xMDQgMi4xMDV6bTAgNjQuNTRhMi4xMDUgMi4xMDUgMCAwIDEtMi4xMDQtMi4xMDV2LTMuMDUxYzAtMS4xNjIuOTQyLTIuMTA1IDIuMTA0LTIuMTA1aDMuMDUyYzEuMTYyIDAgMi4xMDQuOTQzIDIuMTA0IDIuMTA1djMuMDUxYTIuMTA1IDIuMTA1IDAgMCAxLTIuMTA0IDIuMTA1em0yMC42OTgtNTcuMjNhMi4xMDUgMi4xMDUgMCAwIDEgMC0yLjk3NmwyLjE1OC0yLjE1OGEyLjEwNSAyLjEwNSAwIDAgMSAyLjk3NiAwbDIuMTU4IDIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxIDAgMi45NzZsLTIuMTU4IDIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxLTIuOTc2IDB6TTEzLjAyMyA2My43OTNhMi4xMDUgMi4xMDUgMCAwIDEgMC0yLjk3NmwyLjE1OC0yLjE1OGEyLjEwNSAyLjEwNSAwIDAgMSAyLjk3NiAwbDIuMTU4IDIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxIDAgMi45NzZsLTIuMTU4IDIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxLTIuOTc2IDB6bTU1LjEwNC0yNS44MzJjMC0xLjE2Mi45NDItMi4xMDQgMi4xMDQtMi4xMDRoMy4wNTFjMS4xNjMgMCAyLjEwNS45NDIgMi4xMDUgMi4xMDR2My4wNTJhMi4xMDUgMi4xMDUgMCAwIDEtMi4xMDUgMi4xMDRoLTMuMDUxYTIuMTA1IDIuMTA1IDAgMCAxLTIuMTA1LTIuMTA0em0tNjQuNTQgMGMwLTEuMTYyLjk0Mi0yLjEwNCAyLjEwNS0yLjEwNGgzLjA1MWMxLjE2MiAwIDIuMTA1Ljk0MiAyLjEwNSAyLjEwNHYzLjA1MmEyLjEwNSAyLjEwNSAwIDAgMS0yLjEwNSAyLjEwNEg1LjY5MmEyLjEwNSAyLjEwNSAwIDAgMS0yLjEwNS0yLjEwNHptNTcuMjMgMjAuNjk4YTIuMTA1IDIuMTA1IDAgMCAxIDIuOTc2IDBsMi4xNTggMi4xNThhMi4xMDUgMi4xMDUgMCAwIDEgMCAyLjk3NmwtMi4xNTggMi4xNThhMi4xMDUgMi4xMDUgMCAwIDEtMi45NzYgMGwtMi4xNTgtMi4xNThhMi4xMDUgMi4xMDUgMCAwIDEgMC0yLjk3NnpNMTUuMTgxIDEzLjAyM2EyLjEwNSAyLjEwNSAwIDAgMSAyLjk3NiAwbDIuMTU4IDIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxIDAgMi45NzZsLTIuMTU4IDIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxLTIuOTc2IDBsLTIuMTU4LTIuMTU4YTIuMTA1IDIuMTA1IDAgMCAxIDAtMi45NzZ6bTguNDE2IDEwLjQzYzcuNTQ2LTcuNTQ3IDE5LjA2NS04LjcwMiAyNy44MjctMy40NjUtLjEyNS4wOS0xMy4yNjQgMTcuODcyLTEyLjEzMyAxOS4wMDNsMS4wMzcgMS4wMzdjMS4xMyAxLjEzIDE4LjkxMy0xMi4wMDggMTkuMDAzLTEyLjEzMyA1LjIzNyA4Ljc2MiA0LjA4MiAyMC4yOC0zLjQ2NSAyNy44MjgtOC45MTEgOC45MS0yMy4zNTkgOC45MS0zMi4yNyAwLTguOTEtOC45MTEtOC45MS0yMy4zNTkgMC0zMi4yNyIgZmlsbD0iI2ZmZiIvPjwvZz48L3N2Zz4%3D%22%3B%0D%0A%20%20const%20stopSign%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNCAxNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI%2BPHBhdGggc3R5bGU9ImZpbGw6I2VjNTk1OTtzdHJva2U6I2I4NDg0ODtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik00LjMuNWg1LjRsMy44IDMuOHY1LjRsLTMuOCAzLjhINC4zTC41IDkuN1Y0LjN6Ii8%2BPC9zdmc%2B%22%3B%0D%0A%20%20const%20startFlag%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNi42MyAxNy41Ij48cGF0aCBkPSJNLjc1IDJhNi40NCA2LjQ0IDAgMCAxIDcuNjkgMGgwYTYuNDQgNi40NCAwIDAgMCA3LjY5IDB2MTAuNGE2LjQ0IDYuNDQgMCAwIDEtNy42OSAwaDBhNi40NCA2LjQ0IDAgMCAwLTcuNjkgMCIgc3R5bGU9ImZpbGw6IzRjYmY1NjtzdHJva2U6IzQ1OTkzZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBzdHlsZT0iZmlsbDojNGNiZjU2O3N0cm9rZTojNDU5OTNkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MS41cHgiIGQ9Ik0uNzUgMTYuNzV2LTE2Ii8%2BPC9zdmc%2B%22%3B%0D%0A%0D%0A%20%20%2F%2F%20Modified%20Pizzicato%20Library%20(Web%20Audio%20API%2C%20but%20with%20Premade%20Effects%20and%20Stuff)%0D%0A%20%20%2F%2F%20uses%20MIT%20License%0D%0A%20%20const%20scriptElement%20%3D%20document.createElement(%22script%22)%3B%0D%0A%20%20scriptElement.textContent%20%3D%20%0D%0A%60!function(e)%7B%22use%20strict%22%3Bvar%20t%3D%7B%7D%2Ci%3Dt%2Cn%3D%22object%22%3D%3Dtypeof%20module%26%26module.exports%2Co%3D%22function%22%3D%3Dtypeof%20define%26%26define.amd%3Bn%3Fmodule.exports%3Dt%3Ao%3Fdefine(%5B%5D%2Ct)%3Ae.Pizzicato%3De.Pz%3Dt%3Bvar%20s%3De.AudioContext%7C%7Ce.webkitAudioContext%3Bif(!s)%7Bconsole.error(%22No%20AudioContext%20found%20in%20this%20environment.%20Please%20ensure%20your%20window%20or%20global%20object%20contains%20a%20working%20AudioContext%20constructor%20function.%22)%3Breturn%7Dt.context%3Dnew%20s%3Bvar%20a%3Dt.context.createGain()%3Ba.connect(t.context.destination)%2Ct.Util%3D%7BisString%3Afunction(e)%7Breturn%22%5Bobject%20String%5D%22%3D%3D%3DtoString.call(e)%7D%2CisObject%3Afunction(e)%7Breturn%22%5Bobject%20Object%5D%22%3D%3D%3DtoString.call(e)%7D%2CisFunction%3Afunction(e)%7Breturn%22%5Bobject%20Function%5D%22%3D%3D%3DtoString.call(e)%7D%2CisNumber%3Afunction(e)%7Breturn%22%5Bobject%20Number%5D%22%3D%3D%3DtoString.call(e)%26%26e%3D%3D%3D%2Be%7D%2CisArray%3Afunction(e)%7Breturn%22%5Bobject%20Array%5D%22%3D%3D%3DtoString.call(e)%7D%2CisInRange%3Afunction(e%2Ct%2Cn)%7Breturn!!(i.Util.isNumber(e)%26%26i.Util.isNumber(t)%26%26i.Util.isNumber(n))%26%26e%3E%3Dt%26%26e%3C%3Dn%7D%2CisBool%3Afunction(e)%7Breturn%22boolean%22%3D%3Dtypeof%20e%7D%2CisOscillator%3Afunction(e)%7Breturn%20e%26%26%22%5Bobject%20OscillatorNode%5D%22%3D%3D%3De.toString()%7D%2CisAudioBufferSourceNode%3Afunction(e)%7Breturn%20e%26%26%22%5Bobject%20AudioBufferSourceNode%5D%22%3D%3D%3De.toString()%7D%2CisSound%3Afunction(e)%7Breturn%20e%20instanceof%20i.Sound%7D%2CisEffect%3Afunction(e)%7Bfor(var%20i%20in%20t.Effects)if(e%20instanceof%20t.Effects%5Bi%5D)return!0%3Breturn!1%7D%2Cnormalize%3Afunction(e%2Ct%2Cn)%7Bif(i.Util.isNumber(e)%26%26i.Util.isNumber(t)%26%26i.Util.isNumber(n))return(n-t)*e%2F1%2Bt%7D%2CgetDryLevel%3Afunction(e)%7Breturn!i.Util.isNumber(e)%7C%7Ce%3E1%7C%7Ce%3C0%3F0%3Ae%3C%3D.5%3F1%3A1-(e-.5)*2%7D%2CgetWetLevel%3Afunction(e)%7Breturn!i.Util.isNumber(e)%7C%7Ce%3E1%7C%7Ce%3C0%3F0%3Ae%3E%3D.5%3F1%3A1-(.5-e)*2%7D%7D%3Bvar%20r%3DObject.getPrototypeOf(Object.getPrototypeOf(t.context.createGain()))%2Cc%3Dr.connect%3Br.connect%3Dfunction(e)%7Bvar%20t%3Di.Util.isEffect(e)%3Fe.inputNode%3Ae%3Breturn%20c.call(this%2Ct)%2Ce%7D%2CObject.defineProperty(t%2C%22volume%22%2C%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20a.gain.value%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26a%26%26(a.gain.value%3De)%7D%7D)%2CObject.defineProperty(t%2C%22masterGainNode%22%2C%7Benumerable%3A!1%2Cget%3Afunction()%7Breturn%20a%7D%2Cset%3Afunction(e)%7Bconsole.error(%22Can't%20set%20the%20master%20gain%20node%22)%7D%7D)%2Ct.Events%3D%7Bon%3Afunction(e%2Ct%2Ci)%7Be%26%26t%26%26(this._events%3Dthis._events%7C%7C%7B%7D%2C(this._events%5Be%5D%7C%7C(this._events%5Be%5D%3D%5B%5D)).push(%7Bcallback%3At%2Ccontext%3Ai%7C%7Cthis%2Chandler%3Athis%7D))%7D%2Ctrigger%3Afunction(e)%7Bvar%20t%2Ci%2Cn%2Co%3Bif(e)%7Bfor(this._events%3Dthis._events%7C%7C%7B%7D%2Ct%3Dthis._events%5Be%5D%7C%7C(this._events%5Be%5D%3D%5B%5D)%2Co%3D0%2Ci%3DMath.max(0%2Carguments.length-1)%2Cn%3D%5B%5D%3Bo%3Ci%3Bo%2B%2B)n%5Bo%5D%3Darguments%5Bo%2B1%5D%3Bfor(o%3D0%3Bo%3Ct.length%3Bo%2B%2B)t%5Bo%5D.callback.apply(t%5Bo%5D.context%2Cn)%7D%7D%2Coff%3Afunction(e)%7Be%3Fthis._events%5Be%5D%3Dvoid%200%3Athis._events%3D%7B%7D%7D%7D%2Ct.Sound%3Dfunction(e%2Cn)%7Bvar%20o%3Dthis%2Cs%3Dt.Util%2Ca%3Dfunction%20e(t)%7Bif(t%26%26!s.isFunction(t)%26%26!s.isString(t)%26%26!s.isObject(t))return%22Description%20type%20not%20supported.%20Initialize%20a%20sound%20using%20an%20object%2C%20a%20function%20or%20a%20string.%22%3Bif(s.isObject(t))%7Bif(!s.isString(t.source)%7C%7C-1%3D%3D%3D%5B%22wave%22%2C%22file%22%2C%22input%22%2C%22script%22%2C%22sound%22%5D.indexOf(t.source))return%22Specified%20source%20not%20supported.%20Sources%20can%20be%20wave%2C%20file%2C%20input%20or%20script%22%3Bif(%22file%22%3D%3D%3Dt.source%26%26(!t.options%7C%7C!t.options.path))return%22A%20path%20is%20needed%20for%20sounds%20with%20a%20file%20source%22%3Bif(%22script%22%3D%3D%3Dt.source%26%26(!t.options%7C%7C!t.options.audioFunction))return%22An%20audio%20function%20is%20needed%20for%20sounds%20with%20a%20script%20source%22%7D%7D(e)%2Cr%3Ds.isObject(e)%26%26s.isObject(e.options)%3Bif(a)throw%20console.error(a)%2CError(%22Error%20initializing%20Pizzicato%20Sound%3A%20%22%2Ba)%3Bfunction%20c(e%2Cn)%7Be%3De%7C%7C%7B%7D%2Cthis.getRawSourceNode%3Dfunction()%7Bvar%20i%3Dthis.sourceNode%3Fthis.sourceNode.frequency.value%3Ae.frequency%2Cn%3Dt.context.createOscillator()%3Breturn%20n.type%3De.type%7C%7C%22sine%22%2Cn.frequency.value%3Di%7C%7C440%2Cn%7D%2Cthis.sourceNode%3Dthis.getRawSourceNode()%2Cthis.sourceNode.gainSuccessor%3Di.context.createGain()%2Cthis.sourceNode.connect(this.sourceNode.gainSuccessor)%2Cs.isFunction(n)%26%26n()%7Dfunction%20h(e%2Ci)%7Be%3Ds.isArray(e)%3Fe%3A%5Be%5D%3Bvar%20n%3Dnew%20XMLHttpRequest%3Bn.open(%22GET%22%2Ce%5B0%5D%2C!0)%2Cn.responseType%3D%22arraybuffer%22%2Cn.onload%3Dfunction(n)%7Bt.context.decodeAudioData(n.target.response%2C(function(e)%7Bo.getRawSourceNode%3Dfunction()%7Bvar%20i%3Dt.context.createBufferSource()%3Breturn%20i.loop%3Dthis.loop%2Ci.buffer%3De%2Ci%7D%2Cs.isFunction(i)%26%26i()%7D).bind(o)%2C(function(t)%7Bif(console.error(%22Error%20decoding%20audio%20file%20%22%2Be%5B0%5D)%2Ce.length%3E1)%7Be.shift()%2Ch(e%2Ci)%3Breturn%7Dt%3Dt%7C%7CError(%22Error%20decoding%20audio%20file%20%22%2Be%5B0%5D)%2Cs.isFunction(i)%26%26i(t)%7D).bind(o))%7D%2Cn.onreadystatechange%3Dfunction(t)%7B4%3D%3D%3Dn.readyState%26%26200!%3D%3Dn.status%26%26console.error(%22Error%20while%20fetching%20%22%2Be%5B0%5D%2B%22.%20%22%2Bn.statusText)%7D%2Cn.send()%7Dfunction%20u(e%2Ci)%7Bvar%20n%3Ds.isFunction(e)%3Fe%3Ae.audioFunction%2Co%3Ds.isObject(e)%26%26e.bufferSize%3Fe.bufferSize%3Anull%3Bif(!o)try%7Bt.context.createScriptProcessor()%7Dcatch(a)%7Bo%3D2048%7Dthis.getRawSourceNode%3Dfunction()%7Bvar%20e%3Dt.context.createScriptProcessor(o%2C1%2C1)%3Breturn%20e.onaudioprocess%3Dn%2Ce%7D%7Dthis.detached%3Dr%26%26e.options.detached%2Cthis.masterVolume%3Dt.context.createGain()%2Cthis.fadeNode%3Dt.context.createGain()%2Cthis.fadeNode.gain.value%3D0%2Cthis.detached%7C%7Cthis.masterVolume.connect(t.masterGainNode)%2Cthis.lastTimePlayed%3D0%2Cthis.effects%3D%5B%5D%2Cthis.effectConnectors%3D%5B%5D%2Cthis.playing%3Dthis.paused%3D!1%2Cthis.loop%3Dr%26%26e.options.loop%2Cthis.attack%3Dr%26%26s.isNumber(e.options.attack)%3Fe.options.attack%3A.04%2Cthis.volume%3Dr%26%26s.isNumber(e.options.volume)%3Fe.options.volume%3A1%2Cr%26%26s.isNumber(e.options.release)%3Fthis.release%3De.options.release%3Ar%26%26s.isNumber(e.options.sustain)%3F(console.warn(%22'sustain'%20is%20deprecated.%20Use%20'release'%20instead.%22)%2Cthis.release%3De.options.sustain)%3Athis.release%3D.04%2Ce%3Fs.isString(e)%3Fh.bind(this)(e%2Cn)%3As.isFunction(e)%3Fu.bind(this)(e%2Cn)%3A%22file%22%3D%3D%3De.source%3Fh.bind(this)(e.options.path%2Cn)%3A%22wave%22%3D%3D%3De.source%3Fc.bind(this)(e.options%2Cn)%3A%22input%22%3D%3D%3De.source%3F(function%20e(i%2Cn)%7Bif(navigator.getUserMedia%3Dnavigator.getUserMedia%7C%7Cnavigator.webkitGetUserMedia%7C%7Cnavigator.mozGetUserMedia%7C%7Cnavigator.msGetUserMedia%2C!navigator.getUserMedia%26%26(!navigator.mediaDevices%7C%7Cnavigator.mediaDevices.getUserMedia))%7Bconsole.error(%22Your%20browser%20does%20not%20support%20getUserMedia.%20Note%20that%20the%20current%20document%20must%20be%20loaded%20securely%20for%20this%20to%20work%22)%3Breturn%7Dvar%20a%3D(function(e)%7Bo.getRawSourceNode%3Dfunction()%7Breturn%20t.context.createMediaStreamSource(e)%7D%2Cs.isFunction(n)%26%26n()%7D).bind(o)%2Cr%3Dfunction(e)%7Bs.isFunction(n)%26%26n(e)%7D%3Bnavigator.mediaDevices.getUserMedia%3Fnavigator.mediaDevices.getUserMedia(%7Baudio%3A!0%7D).then(a).catch(r)%3Anavigator.getUserMedia(%7Baudio%3A!0%7D%2Ca%2Cr)%7D).bind(this)(e%2Cn)%3A%22script%22%3D%3D%3De.source%3Fu.bind(this)(e.options%2Cn)%3A%22sound%22%3D%3D%3De.source%26%26(function%20e(t%2Cn)%7Bthis.getRawSourceNode%3Dt.sound.getRawSourceNode%2Ct.sound.sourceNode%26%26i.Util.isOscillator(t.sound.sourceNode)%26%26(this.sourceNode%3Dthis.getRawSourceNode()%2Cthis.frequency%3Dt.sound.frequency)%7D).bind(this)(e.options%2Cn)%3Ac.bind(this)(%7B%7D%2Cn)%7D%2Ct.Sound.prototype%3DObject.create(t.Events%2C%7Bplay%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e%2Cn)%7Bthis.playing%7C%7C(i.Util.isNumber(n)%7C%7C(n%3Dthis.offsetTime%7C%7C0)%2Ci.Util.isNumber(e)%7C%7C(e%3D0)%2Cthis.playing%3D!0%2Cthis.paused%3D!1%2Cthis.sourceNode%3Dthis.getSourceNode()%2Cthis.applyAttack()%2Ci.Util.isFunction(this.sourceNode.start)%26%26(this.lastTimePlayed%3Dt.context.currentTime-n%2Cthis.sourceNode.start(i.context.currentTime%2Be%2Cn))%2Cthis.trigger(%22play%22))%7D%7D%2Cstop%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7B(this.paused%7C%7Cthis.playing)%26%26(this.paused%3Dthis.playing%3D!1%2Cthis.stopWithRelease()%2Cthis.offsetTime%3D0%2Cthis.trigger(%22stop%22))%7D%7D%2Cpause%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bif(!this.paused%26%26this.playing)%7Bthis.paused%3D!0%2Cthis.playing%3D!1%2Cthis.stopWithRelease()%3Bvar%20e%3Di.context.currentTime-this.lastTimePlayed%3Bthis.sourceNode.buffer%3Fthis.offsetTime%3De%25(this.sourceNode.buffer.length%2Fi.context.sampleRate)%3Athis.offsetTime%3De%2Cthis.trigger(%22pause%22)%7D%7D%7D%2Cclone%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bfor(var%20e%3Dnew%20t.Sound(%7Bsource%3A%22sound%22%2Coptions%3A%7Bloop%3Athis.loop%2Cattack%3Athis.attack%2Crelease%3Athis.release%2Cvolume%3Athis.volume%2Csound%3Athis%7D%7D)%2Ci%3D0%3Bi%3Cthis.effects.length%3Bi%2B%2B)e.addEffect(this.effects%5Bi%5D)%3Breturn%20e%7D%7D%2ConEnded%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20function()%7Bthis.sourceNode%26%26this.sourceNode!%3D%3De%7C%7C(this.playing%26%26this.stop()%2Cthis.paused%7C%7Cthis.trigger(%22end%22))%7D%7D%7D%2CaddEffect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Bif(!i.Util.isEffect(e))return%20console.error(%22The%20object%20provided%20is%20not%20a%20Pizzicato%20effect.%22)%2Cthis%3Bthis.effects.push(e)%3Bvar%20t%3Dthis.effectConnectors.length%3E0%3Fthis.effectConnectors%5Bthis.effectConnectors.length-1%5D%3Athis.fadeNode%3Bt.disconnect()%2Ct.connect(e)%3Bvar%20n%3Di.context.createGain()%3Breturn%20this.effectConnectors.push(n)%2Ce.connect(n)%2Cn.connect(this.masterVolume)%2Cthis%7D%7D%2CremoveEffect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Bvar%20t%2Ci%3Dthis.effects.indexOf(e)%3Bif(-1%3D%3D%3Di)return%20console.warn(%22Cannot%20remove%20effect%20that%20is%20not%20applied%20to%20this%20sound.%22)%2Cthis%3Bvar%20n%3Dthis.playing%3Bn%26%26this.pause()%3Bvar%20o%3D0%3D%3D%3Di%3Fthis.fadeNode%3Athis.effectConnectors%5Bi-1%5D%3Bo.disconnect()%3Bvar%20s%3Dthis.effectConnectors%5Bi%5D%3Breturn%20s.disconnect()%2Ce.disconnect(s)%2Cthis.effectConnectors.splice(i%2C1)%2Cthis.effects.splice(i%2C1)%2Ct%3Di%3Ethis.effects.length-1%7C%7C0%3D%3D%3Dthis.effects.length%3Fthis.masterVolume%3Athis.effects%5Bi%5D%2Co.connect(t)%2Cn%26%26this.play()%2Cthis%7D%7D%2Cconnect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20this.masterVolume.connect(e)%2Cthis%7D%7D%2Cdisconnect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20this.masterVolume.disconnect(e)%2Cthis%7D%7D%2CconnectEffects%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bfor(var%20e%3D%5B%5D%2Ct%3D0%3Bt%3Cthis.effects.length%3Bt%2B%2B)%7Bvar%20n%3Dt%3D%3D%3Dthis.effects.length-1%3Fthis.masterVolume%3Athis.effects%5Bt%2B1%5D.inputNode%3Be%5Bt%5D%3Di.context.createGain()%2Cthis.effects%5Bt%5D.outputNode.disconnect(this.effectConnectors%5Bt%5D)%2Cthis.effects%5Bt%5D.outputNode.connect(n)%7D%7D%7D%2Cvolume%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Bif(this.masterVolume)return%20this.masterVolume.gain.value%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26this.masterVolume%26%26(this.masterVolume.gain.value%3De)%7D%7D%2Cfrequency%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.sourceNode%26%26i.Util.isOscillator(this.sourceNode)%3Fthis.sourceNode.frequency.value%3Anull%7D%2Cset%3Afunction(e)%7Bthis.sourceNode%26%26i.Util.isOscillator(this.sourceNode)%26%26(this.sourceNode.frequency.value%3De)%7D%7D%2Csustain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20console.warn(%22'sustain'%20is%20deprecated.%20Use%20'release'%20instead.%22)%2Cthis.release%7D%2Cset%3Afunction(e)%7Bconsole.warn(%22'sustain'%20is%20deprecated.%20Use%20'release'%20instead.%22)%2Ci.Util.isInRange(e%2C0%2C10)%26%26(this.release%3De)%7D%7D%2CgetSourceNode%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bif(this.sourceNode)%7Bvar%20e%3Dthis.sourceNode%3Be.gainSuccessor.gain.setValueAtTime(e.gainSuccessor.gain.value%2Ci.context.currentTime)%2Ce.gainSuccessor.gain.linearRampToValueAtTime(1e-4%2Ci.context.currentTime%2B.2)%2CsetTimeout(function()%7Be.disconnect()%2Ce.gainSuccessor.disconnect()%7D%2C200)%7Dvar%20t%3Dthis.getRawSourceNode()%3Breturn%20t.gainSuccessor%3Di.context.createGain()%2Ct.connect(t.gainSuccessor)%2Ct.gainSuccessor.connect(this.fadeNode)%2Cthis.fadeNode.connect(this.getInputNode())%2Ci.Util.isAudioBufferSourceNode(t)%26%26(t.onended%3Dthis.onEnded(t).bind(this))%2Ct%7D%7D%2CgetInputNode%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Breturn%20this.effects.length%3E0%3Fthis.effects%5B0%5D.inputNode%3Athis.masterVolume%7D%7D%2CapplyAttack%3A%7Benumerable%3A!1%2Cvalue%3Afunction()%7Bif(this.fadeNode.gain.value%2Cthis.fadeNode.gain.cancelScheduledValues(i.context.currentTime)%2C!this.attack)%7Bthis.fadeNode.gain.setTargetAtTime(1%2Ci.context.currentTime%2C.001)%3Breturn%7Dvar%20e%3Dnavigator.userAgent.toLowerCase().indexOf(%22firefox%22)%3E-1%2Ct%3Dthis.attack%3Be%7C%7C(t%3D(1-this.fadeNode.gain.value)*this.attack)%2Cthis.fadeNode.gain.setTargetAtTime(1%2Ci.context.currentTime%2C2*t)%7D%7D%2CstopWithRelease%3A%7Benumerable%3A!1%2Cvalue%3Afunction(e)%7Bvar%20t%3Dthis.sourceNode%2Cn%3Dfunction()%7Breturn%20i.Util.isFunction(t.stop)%3Ft.stop(0)%3At.disconnect()%7D%3Bif(this.fadeNode.gain.value%2Cthis.fadeNode.gain.cancelScheduledValues(i.context.currentTime)%2C!this.release)%7Bthis.fadeNode.gain.setTargetAtTime(0%2Ci.context.currentTime%2C.001)%2Cn()%3Breturn%7Dvar%20o%3Dnavigator.userAgent.toLowerCase().indexOf(%22firefox%22)%3E-1%2Cs%3Dthis.release%3Bo%7C%7C(s%3Dthis.fadeNode.gain.value*this.release)%2Cthis.fadeNode.gain.setTargetAtTime(1e-5%2Ci.context.currentTime%2Cs%2F5)%2Cwindow.setTimeout(function()%7Bn()%7D%2C1e3*s)%7D%7D%7D)%2Ct.Group%3Dfunction(e)%7Be%3De%7C%7C%5B%5D%2Cthis.mergeGainNode%3Di.context.createGain()%2Cthis.masterVolume%3Di.context.createGain()%2Cthis.sounds%3D%5B%5D%2Cthis.effects%3D%5B%5D%2Cthis.effectConnectors%3D%5B%5D%2Cthis.mergeGainNode.connect(this.masterVolume)%2Cthis.masterVolume.connect(i.masterGainNode)%3Bfor(var%20t%3D0%3Bt%3Ce.length%3Bt%2B%2B)this.addSound(e%5Bt%5D)%7D%2Ct.Group.prototype%3DObject.create(i.Events%2C%7Bconnect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20this.masterVolume.connect(e)%2Cthis%7D%7D%2Cdisconnect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20this.masterVolume.disconnect(e)%2Cthis%7D%7D%2CaddSound%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Bif(!i.Util.isSound(e))%7Bconsole.error(%22You%20can%20only%20add%20Pizzicato.Sound%20objects%22)%3Breturn%7Dif(this.sounds.indexOf(e)%3E-1)%7Bconsole.warn(%22The%20Pizzicato.Sound%20object%20was%20already%20added%20to%20this%20group%22)%3Breturn%7Dif(e.detached)%7Bconsole.warn(%22Groups%20do%20not%20support%20detached%20sounds.%20You%20can%20manually%20create%20an%20audio%20graph%20to%20group%20detached%20sounds%20together.%22)%3Breturn%7De.disconnect(i.masterGainNode)%2Ce.connect(this.mergeGainNode)%2Cthis.sounds.push(e)%7D%7D%2CremoveSound%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Bvar%20t%3Dthis.sounds.indexOf(e)%3Bif(-1%3D%3D%3Dt)%7Bconsole.warn(%22Cannot%20remove%20a%20sound%20that%20is%20not%20part%20of%20this%20group.%22)%3Breturn%7De.disconnect(this.mergeGainNode)%2Ce.connect(i.masterGainNode)%2Cthis.sounds.splice(t%2C1)%7D%7D%2Cvolume%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Bif(this.masterVolume)return%20this.masterVolume.gain.value%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.masterVolume.gain.value%3De)%7D%7D%2Cplay%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bfor(var%20e%3D0%3Be%3Cthis.sounds.length%3Be%2B%2B)this.sounds%5Be%5D.play()%3Bthis.trigger(%22play%22)%7D%7D%2Cstop%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bfor(var%20e%3D0%3Be%3Cthis.sounds.length%3Be%2B%2B)this.sounds%5Be%5D.stop()%3Bthis.trigger(%22stop%22)%7D%7D%2Cpause%3A%7Benumerable%3A!0%2Cvalue%3Afunction()%7Bfor(var%20e%3D0%3Be%3Cthis.sounds.length%3Be%2B%2B)this.sounds%5Be%5D.pause()%3Bthis.trigger(%22pause%22)%7D%7D%2CaddEffect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Bif(!i.Util.isEffect(e))return%20console.error(%22The%20object%20provided%20is%20not%20a%20Pizzicato%20effect.%22)%2Cthis%3Bthis.effects.push(e)%3Bvar%20t%3Dthis.effectConnectors.length%3E0%3Fthis.effectConnectors%5Bthis.effectConnectors.length-1%5D%3Athis.mergeGainNode%3Bt.disconnect()%2Ct.connect(e)%3Bvar%20n%3Di.context.createGain()%3Breturn%20this.effectConnectors.push(n)%2Ce.connect(n)%2Cn.connect(this.masterVolume)%2Cthis%7D%7D%2CremoveEffect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Bvar%20t%2Ci%3Dthis.effects.indexOf(e)%3Bif(-1%3D%3D%3Di)return%20console.warn(%22Cannot%20remove%20effect%20that%20is%20not%20applied%20to%20this%20group.%22)%2Cthis%3Bvar%20n%3D0%3D%3D%3Di%3Fthis.mergeGainNode%3Athis.effectConnectors%5Bi-1%5D%3Bn.disconnect()%3Bvar%20o%3Dthis.effectConnectors%5Bi%5D%3Breturn%20o.disconnect()%2Ce.disconnect(o)%2Cthis.effectConnectors.splice(i%2C1)%2Cthis.effects.splice(i%2C1)%2Ct%3Di%3Ethis.effects.length-1%7C%7C0%3D%3D%3Dthis.effects.length%3Fthis.masterVolume%3Athis.effects%5Bi%5D%2Cn.connect(t)%2Cthis%7D%7D%7D)%2Ct.Effects%3D%7B%7D%3Bvar%20h%3DObject.create(null%2C%7Bconnect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20this.outputNode.connect(e)%2Cthis%7D%7D%2Cdisconnect%3A%7Benumerable%3A!0%2Cvalue%3Afunction(e)%7Breturn%20this.outputNode.disconnect(e)%2Cthis%7D%7D%7D)%3Bfunction%20u(e%2Cn)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20o%3D%7Bfrequency%3A350%2Cpeak%3A1%7D%3Bfor(var%20s%20in%20this.inputNode%3Dthis.filterNode%3Di.context.createBiquadFilter()%2Cthis.filterNode.type%3Dn%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.filterNode.connect(this.outputNode)%2Co)this%5Bs%5D%3De%5Bs%5D%2Cthis%5Bs%5D%3Dvoid%200%3D%3D%3Dthis%5Bs%5D%7C%7Cnull%3D%3D%3Dthis%5Bs%5D%3Fo%5Bs%5D%3Athis%5Bs%5D%7Dt.Effects.Delay%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bfeedback%3A.5%2Ctime%3A.3%2Cmix%3A.5%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.feedbackGainNode%3Dt.context.createGain()%2Cthis.delayNode%3Dt.context.createDelay()%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.delayNode.connect(this.feedbackGainNode)%2Cthis.feedbackGainNode.connect(this.delayNode)%2Cthis.inputNode.connect(this.delayNode)%2Cthis.delayNode.connect(this.wetGainNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.Delay.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%2Ctime%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.time%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C180)%26%26(this.options.time%3De%2Cthis.delayNode.delayTime.value%3De)%7D%7D%2Cfeedback%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.feedback%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.feedback%3DparseFloat(e%2C10)%2Cthis.feedbackGainNode.gain.value%3Dthis.feedback)%7D%7D%7D)%2Ct.Effects.Compressor%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bthreshold%3A-24%2Cknee%3A30%2Cattack%3A.003%2Crelease%3A.25%2Cratio%3A12%7D%3Bfor(var%20n%20in%20this.inputNode%3Dthis.compressorNode%3Dt.context.createDynamicsCompressor()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.compressorNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.Compressor.prototype%3DObject.create(h%2C%7Bthreshold%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.compressorNode.threshold.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C-100%2C0)%26%26(this.compressorNode.threshold.value%3De)%7D%7D%2Cknee%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.compressorNode.knee.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C0%2C40)%26%26(this.compressorNode.knee.value%3De)%7D%7D%2Cattack%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.compressorNode.attack.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C0%2C1)%26%26(this.compressorNode.attack.value%3De)%7D%7D%2Crelease%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.compressorNode.release.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C0%2C1)%26%26(this.compressorNode.release.value%3De)%7D%7D%2Cratio%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.compressorNode.ratio.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C1%2C20)%26%26(this.compressorNode.ratio.value%3De)%7D%7D%2CgetCurrentGainReduction%3Afunction()%7Breturn%20this.compressorNode.reduction%7D%7D)%2Ct.Effects.LowPassFilter%3Dfunction(e)%7Bu.call(this%2Ce%2C%22lowpass%22)%7D%2Ct.Effects.HighPassFilter%3Dfunction(e)%7Bu.call(this%2Ce%2C%22highpass%22)%7D%3Bvar%20d%3DObject.create(h%2C%7Bfrequency%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.filterNode.frequency.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C10%2C22050)%26%26(this.filterNode.frequency.value%3De)%7D%7D%2Cpeak%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.filterNode.Q.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C1e-4%2C1e3)%26%26(this.filterNode.Q.value%3De)%7D%7D%7D)%3Bfunction%20l()%7Bvar%20e%2Cn%2Co%3Di.context.sampleRate*this.time%2Cs%3Dt.context.createBuffer(2%2Co%2Ci.context.sampleRate)%2Ca%3Ds.getChannelData(0)%2Cr%3Ds.getChannelData(1)%3Bfor(n%3D0%3Bn%3Co%3Bn%2B%2B)e%3Dthis.reverse%3Fo-n%3An%2Ca%5Bn%5D%3D(2*Math.random()-1)*Math.pow(1-e%2Fo%2Cthis.decay)%2Cr%5Bn%5D%3D(2*Math.random()-1)*Math.pow(1-e%2Fo%2Cthis.decay)%3Bthis.reverbNode.buffer%26%26(this.inputNode.disconnect(this.reverbNode)%2Cthis.reverbNode.disconnect(this.wetGainNode)%2Cthis.reverbNode%3Dt.context.createConvolver()%2Cthis.inputNode.connect(this.reverbNode)%2Cthis.reverbNode.connect(this.wetGainNode))%2Cthis.reverbNode.buffer%3Ds%7Dfunction%20f(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20t%3D%7Bcutoff_frequency_low%3A100%2Ccutoff_frequency_high%3A8e3%2Clow_band_gain%3A1%2Cmid_band_gain%3A1%2Chigh_band_gain%3A1%2Clow_peak%3A1%2Cmid_peak%3A1%2Chigh_peak%3A1%7D%3Bfor(var%20n%20in%20this.inputNode%3Di.context.createGain()%2Cthis.outputNode%3Di.context.createGain()%2Cthis.lowFilterNode%3Di.context.createBiquadFilter()%2Cthis.lowFilterNode.type%3D%22lowpass%22%2Cthis.inputNode.connect(this.lowFilterNode)%2Cthis.lowGainNode%3Di.context.createGain()%2Cthis.lowFilterNode.connect(this.lowGainNode)%2Cthis.midFilterNode%3Di.context.createBiquadFilter()%2Cthis.midFilterNode.type%3D%22bandpass%22%2Cthis.inputNode.connect(this.midFilterNode)%2Cthis.midGainNode%3Di.context.createGain()%2Cthis.midFilterNode.connect(this.midGainNode)%2Cthis.highFilterNode%3Di.context.createBiquadFilter()%2Cthis.highFilterNode.type%3D%22highpass%22%2Cthis.inputNode.connect(this.highFilterNode)%2Cthis.highGainNode%3Di.context.createGain()%2Cthis.highFilterNode.connect(this.highGainNode)%2Cthis.analyserNode%3Di.context.createAnalyser()%2Cthis.lowGainNode.connect(this.analyserNode)%2Cthis.midGainNode.connect(this.analyserNode)%2Cthis.highGainNode.connect(this.analyserNode)%2Cthis.analyserNode.connect(this.outputNode)%2Cthis.analyserNode.minDecibels%3D-90%2Cthis.analyserNode.maxDecibels%3D15%2Cthis.analyserNode.smoothingTimeConstant%3D.85%2Cthis.analyserNode.fftSize%3D256%2Cthis.options.cutoff_frequency_low%3Dt.cutoff_frequency_low%2Cthis.options.cutoff_frequency_high%3Dt.cutoff_frequency_high%2Ct)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Ft%5Bn%5D%3Athis%5Bn%5D%7Dt.Effects.LowPassFilter.prototype%3Dd%2Ct.Effects.HighPassFilter.prototype%3Dd%2Ct.Effects.Distortion%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bgain%3A.5%7D%3Bfor(var%20n%20in%20this.waveShaperNode%3Dt.context.createWaveShaper()%2Cthis.inputNode%3Dthis.outputNode%3Dthis.waveShaperNode%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.Distortion.prototype%3DObject.create(h%2C%7Bgain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.gain%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.gain%3De%2Cthis.adjustGain())%7D%7D%2CadjustGain%3A%7Bwritable%3A!1%2Cconfigurable%3A!1%2Cenumerable%3A!1%2Cvalue%3Afunction()%7Bfor(var%20e%2Ct%3Di.Util.isNumber(this.options.gain)%3FparseInt(100*this.options.gain%2C10)%3A50%2Cn%3Dnew%20Float32Array(44100)%2Co%3DMath.PI%2F180%2Cs%3D0%3Bs%3C44100%3B%2B%2Bs)e%3D2*s%2F44100-1%2Cn%5Bs%5D%3D(3%2Bt)*e*20*o%2F(Math.PI%2Bt*Math.abs(e))%3Bthis.waveShaperNode.curve%3Dn%7D%7D%7D)%2Ct.Effects.Flanger%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Btime%3A.45%2Cspeed%3A.2%2Cdepth%3A.1%2Cfeedback%3A.1%2Cmix%3A.5%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.inputFeedbackNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.delayNode%3Dt.context.createDelay()%2Cthis.oscillatorNode%3Dt.context.createOscillator()%2Cthis.gainNode%3Dt.context.createGain()%2Cthis.feedbackNode%3Dt.context.createGain()%2Cthis.oscillatorNode.type%3D%22sine%22%2Cthis.inputNode.connect(this.inputFeedbackNode)%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.inputFeedbackNode.connect(this.delayNode)%2Cthis.inputFeedbackNode.connect(this.wetGainNode)%2Cthis.delayNode.connect(this.wetGainNode)%2Cthis.delayNode.connect(this.feedbackNode)%2Cthis.feedbackNode.connect(this.inputFeedbackNode)%2Cthis.oscillatorNode.connect(this.gainNode)%2Cthis.gainNode.connect(this.delayNode.delayTime)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Cthis.oscillatorNode.start(0)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.Flanger.prototype%3DObject.create(h%2C%7Btime%3A%7Benumberable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.time%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.time%3De%2Cthis.delayNode.delayTime.value%3Di.Util.normalize(e%2C.001%2C.02))%7D%7D%2Cspeed%3A%7Benumberable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.speed%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.speed%3De%2Cthis.oscillatorNode.frequency.value%3Di.Util.normalize(e%2C.5%2C5))%7D%7D%2Cdepth%3A%7Benumberable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.depth%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.depth%3De%2Cthis.gainNode.gain.value%3Di.Util.normalize(e%2C5e-4%2C.005))%7D%7D%2Cfeedback%3A%7Benumberable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.feedback%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.feedback%3De%2Cthis.feedbackNode.gain.value%3Di.Util.normalize(e%2C0%2C.8))%7D%7D%2Cmix%3A%7Benumberable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%7D)%2Ct.Effects.StereoPanner%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bpan%3A0%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Ct.context.createStereoPanner%3F(this.pannerNode%3Dt.context.createStereoPanner()%2Cthis.inputNode.connect(this.pannerNode)%2Cthis.pannerNode.connect(this.outputNode))%3At.context.createPanner%3F(console.warn(%22Your%20browser%20does%20not%20support%20the%20StereoPannerNode.%20Will%20use%20PannerNode%20instead.%22)%2Cthis.pannerNode%3Dt.context.createPanner()%2Cthis.pannerNode.type%3D%22equalpower%22%2Cthis.inputNode.connect(this.pannerNode)%2Cthis.pannerNode.connect(this.outputNode))%3A(console.warn(%22Your%20browser%20does%20not%20support%20the%20Panner%20effect.%22)%2Cthis.inputNode.connect(this.outputNode))%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.StereoPanner.prototype%3DObject.create(h%2C%7Bpan%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.pan%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C-1%2C1)%26%26(this.options.pan%3De%2Cthis.pannerNode%26%26(this.pannerNode.toString().indexOf(%22StereoPannerNode%22)%3E-1%3Fthis.pannerNode.pan.value%3De%3Athis.pannerNode.setPosition(e%2C0%2C1-Math.abs(e))))%7D%7D%7D)%2Ct.Effects.Convolver%3Dfunction(e%2Cn)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20o%3Dthis%2Cs%3Dnew%20XMLHttpRequest%2Ca%3D%7Bmix%3A.5%7D%3Bfor(var%20r%20in%20this.callback%3Dn%2Cthis.inputNode%3Dt.context.createGain()%2Cthis.convolverNode%3Dt.context.createConvolver()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.inputNode.connect(this.convolverNode)%2Cthis.convolverNode.connect(this.wetGainNode)%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ca)this%5Br%5D%3De%5Br%5D%2Cthis%5Br%5D%3Dvoid%200%3D%3D%3Dthis%5Br%5D%7C%7Cnull%3D%3D%3Dthis%5Br%5D%3Fa%5Br%5D%3Athis%5Br%5D%3Bif(!e.impulse)%7Bconsole.error(%22No%20impulse%20file%20specified.%22)%3Breturn%7Ds.open(%22GET%22%2Ce.impulse%2C!0)%2Cs.responseType%3D%22arraybuffer%22%2Cs.onload%3Dfunction(e)%7Bvar%20n%3De.target.response%3Bt.context.decodeAudioData(n%2Cfunction(e)%7Bo.convolverNode.buffer%3De%2Co.callback%26%26i.Util.isFunction(o.callback)%26%26o.callback()%7D%2Cfunction(e)%7Be%3De%7C%7CError(%22Error%20decoding%20impulse%20file%22)%2Co.callback%26%26i.Util.isFunction(o.callback)%26%26o.callback(e)%7D)%7D%2Cs.onreadystatechange%3Dfunction(t)%7B4%3D%3D%3Ds.readyState%26%26200!%3D%3Ds.status%26%26console.error(%22Error%20while%20fetching%20%22%2Be.impulse%2B%22.%20%22%2Bs.statusText)%7D%2Cs.send()%7D%2Ct.Effects.Convolver.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%7D)%2Ct.Effects.PingPongDelay%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bfeedback%3A.5%2Ctime%3A.3%2Cmix%3A.5%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.delayNodeLeft%3Dt.context.createDelay()%2Cthis.delayNodeRight%3Dt.context.createDelay()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.feedbackGainNode%3Dt.context.createGain()%2Cthis.channelMerger%3Dt.context.createChannelMerger(2)%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.delayNodeLeft.connect(this.channelMerger%2C0%2C0)%2Cthis.delayNodeRight.connect(this.channelMerger%2C0%2C1)%2Cthis.delayNodeLeft.connect(this.delayNodeRight)%2Cthis.feedbackGainNode.connect(this.delayNodeLeft)%2Cthis.delayNodeRight.connect(this.feedbackGainNode)%2Cthis.inputNode.connect(this.feedbackGainNode)%2Cthis.channelMerger.connect(this.wetGainNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.PingPongDelay.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%2Ctime%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.time%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C180)%26%26(this.options.time%3De%2Cthis.delayNodeLeft.delayTime.value%3De%2Cthis.delayNodeRight.delayTime.value%3De)%7D%7D%2Cfeedback%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.feedback%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.feedback%3DparseFloat(e%2C10)%2Cthis.feedbackGainNode.gain.value%3Dthis.feedback)%7D%7D%7D)%2Ct.Effects.Reverb%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bmix%3A.5%2Ctime%3A.01%2Cdecay%3A.01%2Creverse%3A!1%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.reverbNode%3Dt.context.createConvolver()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.inputNode.connect(this.reverbNode)%2Cthis.reverbNode.connect(this.wetGainNode)%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%3Bl.bind(this)()%7D%2Ct.Effects.Reverb.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%2Ctime%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.time%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C1e-4%2C10)%26%26(this.options.time%3De%2Cl.bind(this)())%7D%7D%2Cdecay%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.decay%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C1e-4%2C10)%26%26(this.options.decay%3De%2Cl.bind(this)())%7D%7D%2Creverse%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.reverse%7D%2Cset%3Afunction(e)%7Bi.Util.isBool(e)%26%26(this.options.reverse%3De%2Cl.bind(this)())%7D%7D%7D)%2Ct.Effects.Bitcrusher%3Dfunction(e)%7Bthis.inputNode%3Di.context.createGain()%2Cthis.outputNode%3Di.context.createGain()%2Cthis.bits%3De.bits%7C%7C4%2Cthis.frequency%3De.frequency%7C%7C44100%2Cthis.crusherNode%3Di.context.createScriptProcessor(4096%2C1%2C1)%3Bvar%20t%3Dthis%3Bthis.crusherNode.onaudioprocess%3Dfunction(e)%7Bfor(var%20n%3De.inputBuffer%2Co%3De.outputBuffer%2Cs%3D0%3Bs%3Co.numberOfChannels%3Bs%2B%2B)for(var%20a%3Dn.getChannelData(s)%2Cr%3Do.getChannelData(s)%2Cc%3DMath.pow(.5%2Ct.bits-1)%2Ch%3Dt.frequency%2Fi.context.sampleRate%2Cu%3D0%3Bu%3Cn.length%3Bu%2B%2B)u%25h%3D%3D0%3Fr%5Bu%5D%3DMath.floor(a%5Bu%5D%2Fc)*c%3Ar%5Bu%5D%3Dr%5Bu-1%5D%7D%2Cthis.inputNode.connect(this.crusherNode)%2Cthis.crusherNode.connect(this.outputNode)%2Cthis.connect%3Dfunction(e)%7Bthis.outputNode.connect(e)%7D%2Cthis.disconnect%3Dfunction()%7Bthis.outputNode.disconnect()%7D%7D%2Ct.Effects.Bitcrusher.prototype%3D%7Bconstructor%3At.Effects.Bitcrusher%2CsetBits%3Afunction(e)%7Be%3E%3D1%26%26e%3C%3D16%26%26(this.bits%3De)%7D%2CgetBits%3Afunction()%7Breturn%20this.bits%7D%2CsetFrequency%3Afunction(e)%7Be%3E0%26%26(this.frequency%3De)%7D%2CgetFrequency%3Afunction()%7Breturn%20this.frequency%7D%7D%2Ct.Effects.ThreeBandEqualizer%3Dfunction(e)%7Bf.call(this%2Ce)%7D%3Bvar%20p%3DObject.create(h%2C%7Bcutoff_frequency_low%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.cutoff_frequency_low%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C10%2C22050)%26%26(this.options.cutoff_frequency_low%3De%2Cthis.lowFilterNode.frequency.value%3De%2Cthis.midFilterNode.frequency.value%3D.707*(this.options.cutoff_frequency_low%2Bthis.options.cutoff_frequency_high))%7D%7D%2Ccutoff_frequency_high%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.cutoff_frequency_high%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C10%2C22050)%26%26(this.options.cutoff_frequency_high%3De%2Cthis.highFilterNode.frequency.value%3De%2Cthis.midFilterNode.frequency.value%3D.707*(this.options.cutoff_frequency_low%2Bthis.options.cutoff_frequency_high))%7D%7D%2Clow_band_gain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.low_band_gain%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C-40%2C15)%26%26(this.options.low_band_gain%3De%2Cthis.lowGainNode.gain.value%3DMath.pow(10%2Ce%2F20))%7D%7D%2Cmid_band_gain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mid_band_gain%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C-40%2C15)%26%26(this.options.mid_band_gain%3De%2Cthis.midGainNode.gain.value%3DMath.pow(10%2Ce%2F20))%7D%7D%2Chigh_band_gain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.high_band_gain%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C-40%2C15)%26%26(this.options.high_band_gain%3De%2Cthis.highGainNode.gain.value%3DMath.pow(10%2Ce%2F20))%7D%7D%2Clow_peak%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.lowFilterNode.Q.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C1e-4%2C100)%26%26(this.lowFilterNode.Q.value%3De)%7D%7D%2Cmid_peak%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.midFilterNode.Q.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C1e-4%2C100)%26%26(this.midFilterNode.Q.value%3De)%7D%7D%2Chigh_peak%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.highFilterNode.Q.value%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C1e-4%2C1e3)%26%26(this.highFilterNode.Q.value%3De)%7D%7D%2CvisualizerBinCount%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.analyserNode.frequencyBinCount%7D%2Cset%3Afunction(e)%7Bt.Util.isInRange(e%2C16%2C1024)%26%26(this.analyzerNode.fftSize%3De)%7D%7D%2Canalyser%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.analyserNode%7D%7D%2CfrequencyData%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20void%200%3D%3D%3Dthis.byteFrequencyData%26%26(this.byteFrequencyData%3Dnew%20Uint8Array(this.analyserNode.frequencyBinCount.value))%2Cthis.analyserNode.getByteFrequencyData(this.FrequencyData)%2Cthis.byteFrequencyData%7D%7D%7D)%3Bt.Effects.ThreeBandEqualizer.prototype%3Dp%2Ct.Effects.Tremolo%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bspeed%3A4%2Cdepth%3A1%2Cmix%3A.8%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.tremoloGainNode%3Dt.context.createGain()%2Cthis.tremoloGainNode.gain.value%3D0%2Cthis.lfoNode%3Dt.context.createOscillator()%2Cthis.shaperNode%3Dt.context.createWaveShaper()%2Cthis.shaperNode.curve%3Dnew%20Float32Array(%5B0%2C1%5D)%2Cthis.shaperNode.connect(this.tremoloGainNode.gain)%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.lfoNode.connect(this.shaperNode)%2Cthis.lfoNode.type%3D%22sine%22%2Cthis.lfoNode.start(0)%2Cthis.inputNode.connect(this.tremoloGainNode)%2Cthis.tremoloGainNode.connect(this.wetGainNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.Tremolo.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%2Cspeed%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.speed%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C20)%26%26(this.options.speed%3De%2Cthis.lfoNode.frequency.value%3De)%7D%7D%2Cdepth%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.depth%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.depth%3De%2Cthis.shaperNode.curve%3Dnew%20Float32Array(%5B1-e%2C1%5D))%7D%7D%7D)%2Ct.Effects.DubDelay%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bfeedback%3A.6%2Ctime%3A.7%2Cmix%3A.5%2Ccutoff%3A700%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.feedbackGainNode%3Dt.context.createGain()%2Cthis.delayNode%3Dt.context.createDelay()%2Cthis.bqFilterNode%3Dt.context.createBiquadFilter()%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.inputNode.connect(this.wetGainNode)%2Cthis.inputNode.connect(this.feedbackGainNode)%2Cthis.feedbackGainNode.connect(this.bqFilterNode)%2Cthis.bqFilterNode.connect(this.delayNode)%2Cthis.delayNode.connect(this.feedbackGainNode)%2Cthis.delayNode.connect(this.wetGainNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%2Ct.Effects.DubDelay.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%2Ctime%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.time%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C180)%26%26(this.options.time%3De%2Cthis.delayNode.delayTime.value%3De)%7D%7D%2Cfeedback%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.feedback%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.feedback%3DparseFloat(e%2C10)%2Cthis.feedbackGainNode.gain.value%3Dthis.feedback)%7D%7D%2Ccutoff%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.cutoff%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C4e3)%26%26(this.options.cutoff%3De%2Cthis.bqFilterNode.frequency.value%3Dthis.cutoff)%7D%7D%7D)%2Ct.Effects.RingModulator%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20i%3D%7Bspeed%3A30%2Cdistortion%3A1%2Cmix%3A.5%7D%3Bfor(var%20n%20in%20this.inputNode%3Dt.context.createGain()%2Cthis.outputNode%3Dt.context.createGain()%2Cthis.dryGainNode%3Dt.context.createGain()%2Cthis.wetGainNode%3Dt.context.createGain()%2Cthis.vIn%3Dt.context.createOscillator()%2Cthis.vIn.start(0)%2Cthis.vInGain%3Dt.context.createGain()%2Cthis.vInGain.gain.value%3D.5%2Cthis.vInInverter1%3Dt.context.createGain()%2Cthis.vInInverter1.gain.value%3D-1%2Cthis.vInInverter2%3Dt.context.createGain()%2Cthis.vInInverter2.gain.value%3D-1%2Cthis.vInDiode1%3Dnew%20N(t.context)%2Cthis.vInDiode2%3Dnew%20N(t.context)%2Cthis.vInInverter3%3Dt.context.createGain()%2Cthis.vInInverter3.gain.value%3D-1%2Cthis.vcInverter1%3Dt.context.createGain()%2Cthis.vcInverter1.gain.value%3D-1%2Cthis.vcDiode3%3Dnew%20N(t.context)%2Cthis.vcDiode4%3Dnew%20N(t.context)%2Cthis.outGain%3Dt.context.createGain()%2Cthis.outGain.gain.value%3D3%2Cthis.compressor%3Dt.context.createDynamicsCompressor()%2Cthis.compressor.threshold.value%3D-24%2Cthis.compressor.ratio.value%3D16%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%2Cthis.inputNode.connect(this.vcInverter1)%2Cthis.inputNode.connect(this.vcDiode4.node)%2Cthis.vcInverter1.connect(this.vcDiode3.node)%2Cthis.vIn.connect(this.vInGain)%2Cthis.vInGain.connect(this.vInInverter1)%2Cthis.vInGain.connect(this.vcInverter1)%2Cthis.vInGain.connect(this.vcDiode4.node)%2Cthis.vInInverter1.connect(this.vInInverter2)%2Cthis.vInInverter1.connect(this.vInDiode2.node)%2Cthis.vInInverter2.connect(this.vInDiode1.node)%2Cthis.vInDiode1.connect(this.vInInverter3)%2Cthis.vInDiode2.connect(this.vInInverter3)%2Cthis.vInInverter3.connect(this.compressor)%2Cthis.vcDiode3.connect(this.compressor)%2Cthis.vcDiode4.connect(this.compressor)%2Cthis.compressor.connect(this.outGain)%2Cthis.outGain.connect(this.wetGainNode)%2Cthis.wetGainNode.connect(this.outputNode)%2Ci)this%5Bn%5D%3De%5Bn%5D%2Cthis%5Bn%5D%3Dvoid%200%3D%3D%3Dthis%5Bn%5D%7C%7Cnull%3D%3D%3Dthis%5Bn%5D%3Fi%5Bn%5D%3Athis%5Bn%5D%7D%3Bvar%20N%3Dfunction(e)%7Bthis.context%3De%2Cthis.node%3Dthis.context.createWaveShaper()%2Cthis.vb%3D.2%2Cthis.vl%3D.4%2Cthis.h%3D1%2Cthis.setCurve()%7D%3Bfunction%20v(e)%7Bfor(var%20t%3Di.context.sampleRate%2Cn%3Dnew%20Float32Array(t)%2Co%3DMath.PI%2F180%2Cs%3D0%3Bs%3Ct%3Bs%2B%2B)%7Bvar%20a%3D2*s%2Ft-1%3Bn%5Bs%5D%3D(3%2Be)*a*20*o%2F(Math.PI%2Be*Math.abs(a))%7Dreturn%20n%7DN.prototype.setDistortion%3Dfunction(e)%7Breturn%20this.h%3De%2Cthis.setCurve()%7D%2CN.prototype.setCurve%3Dfunction()%7Bvar%20e%2Ct%2Ci%2Cn%2Co%2Cs%2Ca%2Cr%3Bfor(t%3D1024%2Co%3Dnew%20Float32Array(t)%2Ce%3Ds%3D0%2Ca%3Do.length%3B0%3C%3Da%3Fs%3Ca%3As%3Ea%3Be%3D0%3C%3Da%3F%2B%2Bs%3A--s)n%3D(i%3DMath.abs(i%3D(e-t%2F2)%2F(t%2F2)))%3C%3Dthis.vb%3F0%3Athis.vb%3Ci%26%26i%3C%3Dthis.vl%3Fthis.h*(Math.pow(i-this.vb%2C2)%2F(2*this.vl-2*this.vb))%3Athis.h*i-this.h*this.vl%2Bthis.h*(Math.pow(this.vl-this.vb%2C2)%2F(2*this.vl-2*this.vb))%2Co%5Be%5D%3Dn%3Breturn%20this.node.curve%3Do%7D%2CN.prototype.connect%3Dfunction(e)%7Breturn%20this.node.connect(e)%7D%2Ct.Effects.RingModulator.prototype%3DObject.create(h%2C%7Bmix%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.mix%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.mix%3De%2Cthis.dryGainNode.gain.value%3Dt.Util.getDryLevel(this.mix)%2Cthis.wetGainNode.gain.value%3Dt.Util.getWetLevel(this.mix))%7D%7D%2Cspeed%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.speed%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C2e3)%26%26(this.options.speed%3De%2Cthis.vIn.frequency.value%3De)%7D%7D%2Cdistortion%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.distortion%7D%2Cset%3Afunction(e)%7Bif(i.Util.isInRange(e%2C.2%2C50))%7Bthis.options.distortion%3DparseFloat(e%2C10)%3Bfor(var%20t%3D%5Bthis.vInDiode1%2Cthis.vInDiode2%2Cthis.vcDiode3%2Cthis.vcDiode4%5D%2Cn%3D0%2Co%3Dt.length%3Bn%3Co%3Bn%2B%2B)t%5Bn%5D.setDistortion(e)%7D%7D%7D%7D)%2Ct.Effects.Quadrafuzz%3Dfunction(e)%7Bthis.options%3D%7B%7D%2Ce%3De%7C%7Cthis.options%3Bvar%20t%3D%7BlowGain%3A.6%2CmidLowGain%3A.8%2CmidHighGain%3A.5%2ChighGain%3A.6%7D%3Bthis.inputNode%3Di.context.createGain()%2Cthis.outputNode%3Di.context.createGain()%2Cthis.dryGainNode%3Di.context.createGain()%2Cthis.wetGainNode%3Di.context.createGain()%2Cthis.lowpassLeft%3Di.context.createBiquadFilter()%2Cthis.lowpassLeft.type%3D%22lowpass%22%2Cthis.lowpassLeft.frequency.value%3D147%2Cthis.lowpassLeft.Q.value%3D.7071%2Cthis.bandpass1Left%3Di.context.createBiquadFilter()%2Cthis.bandpass1Left.type%3D%22bandpass%22%2Cthis.bandpass1Left.frequency.value%3D587%2Cthis.bandpass1Left.Q.value%3D.7071%2Cthis.bandpass2Left%3Di.context.createBiquadFilter()%2Cthis.bandpass2Left.type%3D%22bandpass%22%2Cthis.bandpass2Left.frequency.value%3D2490%2Cthis.bandpass2Left.Q.value%3D.7071%2Cthis.highpassLeft%3Di.context.createBiquadFilter()%2Cthis.highpassLeft.type%3D%22highpass%22%2Cthis.highpassLeft.frequency.value%3D4980%2Cthis.highpassLeft.Q.value%3D.7071%2Cthis.overdrives%3D%5B%5D%3Bfor(var%20n%3D0%3Bn%3C4%3Bn%2B%2B)this.overdrives%5Bn%5D%3Di.context.createWaveShaper()%2Cthis.overdrives%5Bn%5D.curve%3Dv()%3Bthis.inputNode.connect(this.wetGainNode)%2Cthis.inputNode.connect(this.dryGainNode)%2Cthis.dryGainNode.connect(this.outputNode)%3Bvar%20o%3D%5Bthis.lowpassLeft%2Cthis.bandpass1Left%2Cthis.bandpass2Left%2Cthis.highpassLeft%5D%3Bfor(n%3D0%3Bn%3Co.length%3Bn%2B%2B)this.wetGainNode.connect(o%5Bn%5D)%2Co%5Bn%5D.connect(this.overdrives%5Bn%5D)%2Cthis.overdrives%5Bn%5D.connect(this.outputNode)%3Bfor(var%20s%20in%20t)this%5Bs%5D%3De%5Bs%5D%2Cthis%5Bs%5D%3Dvoid%200%3D%3D%3Dthis%5Bs%5D%7C%7Cnull%3D%3D%3Dthis%5Bs%5D%3Ft%5Bs%5D%3Athis%5Bs%5D%7D%2Ct.Effects.Quadrafuzz.prototype%3DObject.create(h%2C%7BlowGain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.lowGain%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.lowGain%3De%2Cthis.overdrives%5B0%5D.curve%3Dv(i.Util.normalize(this.lowGain%2C0%2C150)))%7D%7D%2CmidLowGain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.midLowGain%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.midLowGain%3De%2Cthis.overdrives%5B1%5D.curve%3Dv(i.Util.normalize(this.midLowGain%2C0%2C150)))%7D%7D%2CmidHighGain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.midHighGain%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.midHighGain%3De%2Cthis.overdrives%5B2%5D.curve%3Dv(i.Util.normalize(this.midHighGain%2C0%2C150)))%7D%7D%2ChighGain%3A%7Benumerable%3A!0%2Cget%3Afunction()%7Breturn%20this.options.highGain%7D%2Cset%3Afunction(e)%7Bi.Util.isInRange(e%2C0%2C1)%26%26(this.options.highGain%3De%2Cthis.overdrives%5B3%5D.curve%3Dv(i.Util.normalize(this.highGain%2C0%2C150)))%7D%7D%7D)%7D(%22undefined%22!%3Dtypeof%20window%3Fwindow%3Aglobal)%3B%60%3B%0D%0A%20%20document.body.appendChild(scriptElement)%3B%0D%0A%20%20%2F*%20global%20Pizzicato%20*%2F%0D%0A%0D%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0D%0A%20%20const%20runtime%20%3D%20vm.runtime%3B%0D%0A%20%20const%20scratchAudio%20%3D%20runtime.audioEngine%3B%0D%0A%20%20const%20allSingleEffects%20%3D%20%5B%0D%0A%20%20%20%20%22pitch%22%2C%20%22detune%22%2C%20%22speed%22%2C%20%22pan%22%2C%0D%0A%20%20%20%20%22gain%22%2C%20%22distortion%22%2C%20%22attack%22%2C%20%22release%22%0D%0A%20%20%5D%3B%0D%0A%0D%0A%20%20let%20soundBank%20%3D%20%7B%7D%3B%0D%0A%20%20let%20settings%20%3D%20%7B%20flagCtrl%20%3A%20false%2C%20canSave%20%3A%20false%20%7D%3B%0D%0A%20%20const%20load%20%3D%20(storage)%20%3D%3E%20%7B%0D%0A%20%20%20%20if%20(storage%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20settings%20%3D%20storage.settings%3B%0D%0A%20%20%20%20soundBank%20%3D%20storage.bank%3B%0D%0A%20%20%20%20for%20(const%20item%20in%20soundBank)%20%7B%0D%0A%20%20%20%20%20%20soundBank%5Bitem%5D.loaded%20%3D%20false%3B%0D%0A%20%20%20%20%20%20const%20engine%20%3D%20new%20Pizzicato.Sound(soundBank%5Bitem%5D.src%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20engine.sourceNode%20%3D%20engine.getSourceNode()%3B%0D%0A%20%20%20%20%20%20%20%20soundBank%5Bitem%5D.context%20%3D%20engine%3B%0D%0A%20%20%20%20%20%20%20%20soundBank%5Bitem%5D.loaded%20%3D%20true%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%3B%0D%0A%20%20if%20(!Scratch.extensions.isPenguinMod)%20load(runtime.extensionStorage%5B%22SPtuneShark3%22%5D)%3B%0D%0A%0D%0A%20%20%2F%2F%20Create%20an%20Event%20for%20when%20Pause%20Project%20is%20Activated%0D%0A%20%20%2F%2F%20Save%20original%20function%20if%20it%20exists%0D%0A%20%20let%20ogPauseFunc%20%3D%20Object.getOwnPropertyDescriptor(runtime.ioDevices.clock%2C%20%22_paused%22)%3F.set%3B%0D%0A%20%20Object.defineProperty(runtime.ioDevices.clock%2C%20%22_paused%22%2C%20%7B%0D%0A%20%20%20%20set%3A%20function(value)%20%7B%0D%0A%20%20%20%20%20%20this._pausedValue%20%3D%20value%3B%0D%0A%20%20%20%20%20%20runtime.emit(%22SP_TUNE3_PROJECT_PAUSE%22%2C%20value)%3B%0D%0A%20%20%20%20%20%20if%20(ogPauseFunc)%20ogPauseFunc.call(this%2C%20value)%3B%0D%0A%20%20%20%20%7D%2C%0D%0A%20%20%20%20get%3A%20function()%20%7B%20return%20this._pausedValue%20%7D%0D%0A%20%20%7D)%3B%0D%0A%0D%0A%20%20class%20SPtuneShark3%20%7B%0D%0A%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20runtime.on(%22PROJECT_START%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(settings.flagCtrl)%20this.ctrlSounds(%7B%20CONTROL%20%3A%20%22stop%22%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20runtime.on(%22PROJECT_STOP_ALL%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(settings.flagCtrl)%20this.ctrlSounds(%7B%20CONTROL%20%3A%20%22stop%22%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20runtime.on(%22BEFORE_EXECUTE%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20projectVal%20%3D%20scratchAudio.inputNode.gain.value%3B%0D%0A%20%20%20%20%20%20%20%20Object.keys(soundBank).forEach(key%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20bank%20%3D%20soundBank%5Bkey%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(bank.loaded)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20sound%20%3D%20bank.context%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Clamp%20Volume%20to%20Project%20Volume%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20curVol%20%3D%20Math.min(100%2C%20Math.max(0%2C%20bank.vol))%20%2F%20100%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sound.volume%20%3D%20curVol%20*%20projectVal%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Apply%20Speed%20Changes%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(bank.speed%20!%3D%3D%201%20%26%26%20sound.playing)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20lastplay%20%3D%20sound.lastTimePlayed%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20time%20%3D%20Math.abs(lastplay%20-%20sound.sourceNode.context.currentTime)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20sound.stop()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20sound.play(0%2C%20time%20*%20bank.speed)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20sound.lastTimePlayed%20%3D%20lastplay%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.patchLinks(sound.sourceNode%2C%20bank)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20runtime.on(%22SP_TUNE3_PROJECT_PAUSE%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(runtime.ioDevices.clock._paused)%20this.ctrlSounds(%7B%20CONTROL%3A%20%22pause%22%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20else%20this.ctrlSounds(%7B%20CONTROL%3A%20%22unpause%22%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20getInfo()%20%7B%0D%0A%20%20%20%20%20%20return%20%7B%0D%0A%20%20%20%20%20%20%20%20id%3A%20%22SPtuneShark3%22%2C%0D%0A%20%20%20%20%20%20%20%20name%3A%20%22Tune%20Shark%20V3%22%2C%0D%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23666666%22%2C%0D%0A%20%20%20%20%20%20%20%20menuIconURI%2C%0D%0A%20%20%20%20%20%20%20%20blockIconURI%2C%0D%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importURL%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20sound%20from%20URL%20%5BURL%5D%20named%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20URL%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22https%3A%2F%2Fsharkpools-extensions.vercel.app%2Fextension-utils%2FTS%2FResonance-Home.mp3%22%20%7D%2C%0D%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%22MySound%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22importMenu%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22import%20sound%20%5BSOUND%5D%20named%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SOUND%3A%20%7B%20type%3A%20Scratch.ArgumentType.SOUND%20%7D%2C%0D%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%22MySound%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22convertSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22convert%20sound%20%5BNAME1%5D%20from%20URL%20to%20URI%20and%20save%20to%20%5BNAME2%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME1%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME2%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22MySound2%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22bindSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BTYPE%5D%20sound%20%5BNAME2%5D%20and%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22bindMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME2%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22MySound%22%20%7D%2C%0D%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%22MySound2%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22save2Project%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BSAVE%5D%20all%20sounds%20to%20project%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SAVE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22saveMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Audio%20Playback%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22startSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22start%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22startSoundAt%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22start%20sound%20%5BNAME%5D%20at%20time%20%5BTIME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22playAndStop%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22start%20sound%20%5BNAME%5D%20at%20time%20%5BTIME%5D%20and%20stop%20at%20%5BMAX%5D%20seconds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0D%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%202%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22stopSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22stop%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22pauseSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BUN_PAUSE%5D%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20UN_PAUSE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22un_pauseMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22ctrlSounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BCONTROL%5D%20all%20sounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONTROL%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22playMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Audio%20Operations%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22enableControl%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20sound%20link%20to%20%5BGO%5D%20%5BSTOP%5D%20%5BON_OFF%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20GO%3A%20%7B%20type%3A%20Scratch.ArgumentType.IMAGE%2C%20dataURI%3A%20startFlag%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20STOP%3A%20%7B%20type%3A%20Scratch.ArgumentType.IMAGE%2C%20dataURI%3A%20stopSign%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ON_OFF%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22toggleMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22toggleOverlap%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20sound%20%5BNAME%5D%20overlapping%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%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%22toggleMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22toggleLoop%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20sound%20%5BNAME%5D%20looping%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%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%22toggleMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22toggleReverse%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20sound%20%5BNAME%5D%20reverse%20mode%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%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%22toggleMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22loopParams%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22sound%20%5BNAME%5D%20loop%20start%20%5BSTART%5D%20end%20%5BEND%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20START%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20END%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%202%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteSound%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteAllSounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22delete%20all%20sounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22allSounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22all%20sounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22allPlaySounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22all%20playing%20sounds%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22soundCheck%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22sound%20%5BNAME%5D%20%5BCONTROL%5D%20%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONTROL%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22soundBools%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22soundProperty%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BPROP%5D%20of%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20PROP%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22soundProps%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getLoudTime%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BTYPE%5D%20of%20sound%20%5BNAME%5D%20at%20time%20%5BTIME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20settingsIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22loudProps%22%20%7D%2C%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Audio%20Effects%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setVol%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20volume%20of%20sound%20%5BNAME%5D%20to%20%5BNUM%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetEffect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20%5BEFFECT%5D%20of%20sound%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22effectMenu%22%20%7D%2C%0D%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%22MySound%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setThing%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%20hideFromPalette%3A%20true%2C%20%2F%2F%20deprecated%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BTYPE%5D%20of%20sound%20%5BNAME%5D%20to%20%5BVALUE%5D%22%2C%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22MySound%22%20%7D%2C%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22singleEffects%22%20%7D%2C%20VALUE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setThingNew%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BTYPE%5D%20of%20sound%20%5BNAME%5D%20to%20%5BVALUE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%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%22singleEffectNew%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setReverb%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20reverb%20of%20sound%20%5BNAME%5D%20to%20time%20%5BTIME%5D%20decay%20%5BDECAY%5D%20mix%20%5BMIX%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DECAY%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MIX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDelay%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20delay%20of%20sound%20%5BNAME%5D%20to%20time%20%5BTIME%5D%20feedback%20%5BFEED%5D%20mix%20%5BMIX%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20FEED%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2060%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MIX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setTremolo%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20tremolo%20of%20sound%20%5BNAME%5D%20to%20speed%20%5BSPEED%5D%20depth%20%5BDEPTH%5D%20mix%20%5BMIX%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPEED%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2035%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DEPTH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2080%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MIX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFuzz%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20fuzz%20of%20sound%20%5BNAME%5D%20to%20low%20%5BLOW%5D%20med-low%20%5BMED1%5D%20med-high%20%5BMED2%5D%20high%20%5BHIGH%5D%20mix%20%5BMIX%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20LOW%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2060%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MED1%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2080%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MED2%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20HIGH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2060%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MIX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBitcrush%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20bitcrush%20of%20sound%20%5BNAME%5D%20bits%20%5BBITS%5D%20freq%20%5BFREQ%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BITS%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2015%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20FREQ%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2060000%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPass%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BTYPE%5D%20of%20sound%20%5BNAME%5D%20to%20frequency%20%5BFREQ%5D%20peak%20%5BPEAK%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%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%22typePass%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20FREQ%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20400%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20PEAK%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2010%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFlanger%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20flanger%20of%20sound%20%5BNAME%5D%20to%20time%20%5BTIME%5D%20speed%20%5BSPEED%5D%20depth%20%5BDEPTH%5D%20feed%20%5BFEED%5D%20mix%20%5BMIX%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2045%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPEED%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2020%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DEPTH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2010%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20FEED%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2010%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MIX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCompress%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20compressor%20of%20sound%20%5BNAME%5D%20to%20threshold%20%5BTHRESH%5D%20knee%20%5BKNEE%5D%20attack%20%5BATTACK%5D%20release%20%5BRELEASE%5D%20ratio%20%5BRATIO%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20THRESH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KNEE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ATTACK%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RELEASE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20RATIO%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setEqualize%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20equalizer%20of%20sound%20%5BNAME%5D%20to%20gain%20low%20%5BLOW%5D%20mid%20%5BMID%5D%20high%20%5BHIGH%5D%20cutoff%20low%20%5BCUT_LOW%5D%20cutoff%20high%20%5BCUT_HIGH%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20nobIconURI%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22MySound%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20LOW%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MID%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20HIGH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CUT_LOW%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20-50%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CUT_HIGH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20singleEffects%3A%20allSingleEffects%2C%20%2F%2F%20deprecated%0D%0A%20%20%20%20%20%20%20%20%20%20saveMenu%3A%20%5B%22save%22%2C%20%22dont%20save%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20un_pauseMenu%3A%20%5B%22pause%22%2C%20%22unpause%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20playMenu%3A%20%5B%22start%22%2C%20%22stop%22%2C%20%22pause%22%2C%20%22unpause%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20toggleMenu%3A%20%5B%22on%22%2C%20%22off%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20bindMenu%3A%20%5B%22bind%22%2C%20%22unBind%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20loudProps%3A%20%5B%22loudness%22%2C%20%22raw%20noise%22%2C%20%22tone%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20typePass%3A%20%5B%22highpass%22%2C%20%22lowpass%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20singleEffectNew%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20allSingleEffects%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20soundProps%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22length%22%2C%20%22current%20time%22%2C%20%22estimated%20bpm%22%2C%20%22source%22%2C%20%22binds%22%2C%20%22volume%22%2C%20%22pitch%22%2C%20%22detune%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22speed%22%2C%20%22pan%22%2C%20%22gain%22%2C%20%22distortion%22%2C%20%22attack%22%2C%20%22release%22%2C%20%22reverb%22%2C%20%22delay%22%2C%20%22tremolo%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22fuzz%22%2C%20%22bitcrush%22%2C%20%22highpass%22%2C%20%22lowpass%22%2C%20%22flanger%22%2C%20%22compressor%22%2C%20%22equalizer%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20soundBools%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22exists%22%2C%20%22playing%22%2C%20%22paused%22%2C%20%22looped%22%2C%20%22overlaped%22%2C%20%22reversed%22%2C%20%22binded%22%5D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20effectMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22all%20effects%22%2C%20%22pitch%22%2C%20%22detune%22%2C%20%22speed%22%2C%20%22pan%22%2C%20%22gain%22%2C%20%22distortion%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22attack%22%2C%20%22release%22%2C%20%22reverb%22%2C%20%22delay%22%2C%20%22tremolo%22%2C%20%22fuzz%22%2C%20%22bitcrush%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22highpass%22%2C%20%22lowpass%22%2C%20%22flanger%22%2C%20%22compressor%22%2C%20%22equalizer%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20Helper%20Funcs%0D%0A%20%20%20%20getSoundIndex(name%2C%20target)%20%7B%0D%0A%20%20%20%20%20%20const%20sounds%20%3D%20target.sounds%3B%0D%0A%20%20%20%20%20%20return%20sounds.indexOf(sounds.filter((i)%20%3D%3E%20%7B%20return%20i.name%20%3D%3D%3D%20name%20%7D)%5B0%5D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20currentTime(sound%2C%20ctx%2C%20src)%20%7B%0D%0A%20%20%20%20%20%20if%20(!ctx.playing%20%26%26%20!ctx.paused)%20return%200%3B%0D%0A%20%20%20%20%20%20let%20leng%20%3D%20ctx.loop%20%26%26%20sound.loopParm%5B1%5D%20%3F%20sound.loopParm%5B1%5D%20%3A%20src.buffer.duration%3B%0D%0A%20%20%20%20%20%20leng%20%3D%20this.modTime(leng%2C%20sound)%3B%0D%0A%20%20%20%20%20%20const%20loopStart%20%3D%20sound.loopParm%5B0%5D%3B%0D%0A%20%20%20%20%20%20const%20now%20%3D%20ctx.paused%20%3F%20sound.pauseTime%20%3A%20src.context.currentTime%3B%0D%0A%20%20%20%20%20%20let%20time%20%3D%20Math.abs(ctx.lastTimePlayed%20-%20now)%3B%0D%0A%20%20%20%20%20%20if%20(ctx.loop)%20return%20(Math.max(0%2C%20time%20%25%20(leng%20-%20loopStart))%20%2B%20loopStart)%3B%0D%0A%20%20%20%20%20%20return%20Math.min(leng%2C%20Math.max(0%2C%20time))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20modTime(number%2C%20opts)%20%7B%20return%20number%20%2F%20(opts.pitch%20*%20opts.speed%20*%20((opts.detune%20%2F%201000)%20%2B%201))%20%7D%0D%0A%0D%0A%20%20%20%20updateEffect(effect%2C%20sound%2C%20name%2C%20args)%20%7B%0D%0A%20%20%20%20%20%20delete%20args.NAME%3B%20delete%20args.TYPE%3B%0D%0A%20%20%20%20%20%20effect.arguments%20%3D%20args%3B%20%2F%2F%20Match%20Original%20Values%2C%20not%20Converted%0D%0A%20%20%20%20%20%20if%20(sound.effects%5Bname%5D%20%3D%3D%3D%20undefined)%20%7B%0D%0A%20%20%20%20%20%20%20%20effect.id%20%3D%20name%3B%0D%0A%20%20%20%20%20%20%20%20sound.context.addEffect(effect)%3B%0D%0A%20%20%20%20%20%20%20%20sound.effects%5Bname%5D%20%3D%20effect%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Dont%20Remove%20the%20Effect%20(Causes%20Glitches%20in%20Forever%20Loops)%2C%20simply%20change%20each%20value%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20We%20use%20args%20just%20in%20case%20some%20Effects%20dont%20store%20them%20in%20the%20audio%20context%0D%0A%20%20%20%20%20%20%20%20const%20options%20%3D%20effect.options%3B%0D%0A%20%20%20%20%20%20%20%20const%20thisEffect%20%3D%20sound.context.effects.find(effect%20%3D%3E%20effect.id%20%3D%3D%3D%20name)%3B%0D%0A%20%20%20%20%20%20%20%20thisEffect.arguments%20%3D%20effect.arguments%3B%0D%0A%20%20%20%20%20%20%20%20thisEffect.options%20%3D%20options%3B%0D%0A%20%20%20%20%20%20%20%20switch%20(name)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20case%20%22PAN%22%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.pannerNode.pan.value%20%3D%20options.pan%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.pan%20%3D%20options.pan%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20case%20%22DISTORTION%22%3A%20%7B%20return%20thisEffect.gain%20%3D%20options.gain%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20case%20%22BITCRUSH%22%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.frequency%20%3D%20Math.max(30000%2C%20Scratch.Cast.toNumber(args.FREQ))%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.bits%20%3D%20Math.max(10%2C%20Scratch.Cast.toNumber(args.BITS))%20%2F%2010%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20case%20%22LOWPASS%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20case%20%22HIGHPASS%22%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20freq%20%3D%20Scratch.Cast.toNumber(args.FREQ)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20peak%20%3D%20Scratch.Cast.toNumber(args.PEAK)%20%2F%205%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.filterNode.frequency.value%20%3D%20freq%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.inputNode.frequency.value%20%3D%20freq%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.frequency%20%3D%20freq%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.filterNode.Q.value%20%3D%20peak%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.inputNode.Q.value%20%3D%20peak%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20thisEffect.peak%20%3D%20peak%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20case%20%22COMPRESSOR%22%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20node%20%3D%20thisEffect.compressorNode%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20values%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20threshold%3A%20Math.min(0%2C%20Math.max(-100%2C%20Scratch.Cast.toNumber(args.THRESH)%20*%20-1))%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ratio%3A%20Scratch.Cast.toNumber(args.RATIO)%20%2F%205%2C%20attack%3A%20Math.min(0%2C%20Math.max(1%2C%20Scratch.Cast.toNumber(args.ATTACK)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20release%3A%20Math.min(0%2C%20Math.max(1%2C%20Scratch.Cast.toNumber(args.RELEASE)%20%2F%20100))%2C%20knee%3A%20Scratch.Cast.toNumber(args.KNEE)%20%2F%202.5%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20Object.keys(values).forEach(key%20%3D%3E%20%7B%20node%5Bkey%5D.value%20%3D%20values%5Bkey%5D%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20Object.keys(options).forEach(key%20%3D%3E%20%7B%20thisEffect%5Bkey%5D%20%3D%20options%5Bkey%5D%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getBPM(data%2C%20sampleRate)%20%7B%0D%0A%20%20%20%20%20%20const%20peaks%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20let%20lastPeakIndex%20%3D%200%3B%0D%0A%20%20%20%20%20%20let%20max%20%3D%200.1%3B%0D%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20data.length%3B%20i%2B%2B)%20%7B%20if%20(data%5Bi%5D%20%3E%20max)%20max%20%3D%20data%5Bi%5D%20%7D%0D%0A%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20data.length%3B%20i%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(data%5Bi%5D%20%3E%20max%20-%200.1%20%26%26%20i%20-%20lastPeakIndex%20%3E%20sampleRate%20%2F%204)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20peaks.push(i)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20lastPeakIndex%20%3D%20i%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20intervals%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20for%20(let%20i%20%3D%201%3B%20i%20%3C%20peaks.length%3B%20i%2B%2B)%20%7B%20intervals.push(peaks%5Bi%5D%20-%20peaks%5Bi%20-%201%5D)%20%7D%0D%0A%20%20%20%20%20%20const%20avgInterval%20%3D%20intervals.reduce((a%2C%20b)%20%3D%3E%20a%20%2B%20b%2C%200)%20%2F%20intervals.length%3B%0D%0A%20%20%20%20%20%20const%20value%20%3D%20Math.round((sampleRate%20%2F%20avgInterval)%20*%2060)%3B%0D%0A%20%20%20%20%20%20return%20isNaN(value)%20%3F%200%20%3A%20value%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20play(sound%2C%20atTime%2C%20con)%20%7B%0D%0A%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(sound.playing%20%26%26%20con.overlap)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20clone%20%3D%20sound.clone()%3B%20%2F%2F%20Clone%20context%20to%20Menu%20for%20Control%20Purposes%0D%0A%20%20%20%20%20%20%20%20%20%20const%20newName%20%3D%20%60%24%7Bcon.name%7D_COPY_%24%7BMath.random()%7D%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20soundBank%5BnewName%5D%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20...sound%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20context%3A%20clone%2C%20name%3A%20newName%2C%20loopParm%3A%20%5B0%2C%200%5D%2C%20pauseTime%3A%200%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20overlap%3A%20false%2C%20overlays%3A%20%5B%5D%2C%20isBind%3A%20false%2C%20binds%3A%20%7B%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20clone.play()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20clone.sourceNode.playbackRate.value%20%3D%20con.pitch%3B%0D%0A%20%20%20%20%20%20%20%20%20%20clone.sourceNode.gainSuccessor.gain.value%20%3D%20con.gain%3B%0D%0A%20%20%20%20%20%20%20%20%20%20con.overlays.push(clone)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20clone.on(%22end%22%2C%20()%20%3D%3E%20%7B%20delete%20soundBank%5BnewName%5D%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20sound.play(0%2C%20sound.loop%20%3F%20con.loopParm%5B0%5D%20%3A%20atTime)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20srcNode%20%3D%20sound.sourceNode%3B%0D%0A%20%20%20%20%20%20%20%20%20%20this.patchLinks(srcNode%2C%20con)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(Object.keys(con.binds).length%20%3E%200)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20Object.keys(con.binds).forEach(key%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20thisSound%20%3D%20con.binds%5Bkey%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20context%20%3D%20thisSound.context%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20context.play(0%2C%20atTime)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.patchLinks(context.sourceNode%2C%20thisSound)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(sound.loop)%20this.loopParams(%7B%20NAME%20%3A%20con.name%20%2C%20START%20%3A%20con.loopParm%5B0%5D%2C%20END%20%3A%20con.loopParm%5B1%5D%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%20catch%20%7B%0D%0A%20%20%20%20%20%20%20%20console.warn(%22Audio%20has%20not%20Loaded%20Yet%2C%20Ignore%20Next%20Error%22)%3B%0D%0A%20%20%20%20%20%20%20%20sound.stop()%3B%20%2F%2F%20Reset%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20typeOverlay(sound%2C%20type)%20%7B%0D%0A%20%20%20%20%20%20const%20ctx%20%3D%20sound.context%3B%0D%0A%20%20%20%20%20%20const%20src%20%3D%20ctx.sourceNode%3B%0D%0A%20%20%20%20%20%20if%20(type%20%3D%3D%3D%20%22stop%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20ctx.stop()%3B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20sound.overlays.length%3B%20i%2B%2B)%20%7B%20sound.overlays%5Bi%5D.stop()%20%7D%0D%0A%20%20%20%20%20%20%7D%20else%20if%20(type%20%3D%3D%3D%20%22pause%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20sound.pauseTime%20%3D%20src.context.currentTime%3B%0D%0A%20%20%20%20%20%20%20%20ctx.pause()%3B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20sound.overlays.length%3B%20i%2B%2B)%20%7B%20sound.overlays%5Bi%5D.pause()%20%7D%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(type%20%3D%3D%3D%20%22play%22)%20ctx.play()%3B%0D%0A%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(!ctx.paused)%20return%3B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20lastTime%20%3D%20this.currentTime(sound%2C%20ctx%2C%20src)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20ctx.stop()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20ctx.play(0%2C%20lastTime)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20return%20this.patchLinks(ctx.sourceNode%2C%20sound)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20this.patchLinks(src%2C%20sound)%3B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20sound.overlays.length%3B%20i%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20sound.overlays%5Bi%5D.play()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20this.patchLinks(sound.overlays%5Bi%5D.sourceNode%2C%20sound)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20patchLinks(src%2C%20sound)%20%7B%0D%0A%20%20%20%20%20%20src.playbackRate.value%20%3D%20sound.pitch%3B%0D%0A%20%20%20%20%20%20src.detune.value%20%3D%20sound.detune%3B%0D%0A%20%20%20%20%20%20src.gainSuccessor.gain.value%20%3D%20sound.gain%3B%0D%0A%20%20%20%20%20%20if%20(src.loop)%20this.loopParams(%7B%20NAME%20%3A%20sound.name%20%2C%20START%20%3A%20sound.loopParm%5B0%5D%2C%20END%20%3A%20sound.loopParm%5B1%5D%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20Block%20Funcs%0D%0A%20%20%20%20importURL(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20return%20new%20Promise((resolve)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20this.deleteSound(args)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(!args.URL)%20return%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20const%20engine%20%3D%20new%20Pizzicato.Sound(args.URL%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20engine.sourceNode%20%3D%20engine.getSourceNode()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20engine.attack%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20soundBank%5Bargs.NAME%5D%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20context%3A%20engine%2C%20name%3A%20args.NAME%2C%20src%3A%20args.URL%2C%20effects%3A%20%7B%7D%2C%20pauseTime%3A%200%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20loaded%3A%20true%2C%20reversed%3A%20false%2C%20vol%3A%20100%2C%20gain%3A%201%2C%20pitch%3A%201%2C%20detune%3A%200%2C%20speed%3A%201%2C%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20loopParm%3A%20%5B0%2C%200%5D%2C%20overlap%3A%20false%2C%20overlays%3A%20%5B%5D%2C%20isBind%3A%20false%2C%20binds%3A%20%7B%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20File%20is%20Corrupted%20%2F%20Doesnt%20Exist%20%2F%20is%20a%20unedited%20Scratch%20Sound%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20alert(%22Tune%20Shark%20V3%20Cant%20Import%20this%20Sound%2C%20File%20may%20be%20Corrupted%20or%20Non-Existent%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20async%20importMenu(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20target%20%3D%20util.target.sprite%3B%0D%0A%20%20%20%20%20%20const%20index%20%3D%20this.getSoundIndex(args.SOUND%2C%20target)%3B%0D%0A%20%20%20%20%20%20if%20(index%20%3C%200)%20return%3B%0D%0A%20%20%20%20%20%20if%20(runtime.isPackaged)%20%7B%0D%0A%20%20%20%20%20%20%20%20alert(%60For%20%22Import%20Scratch%20Sound%22%20(Tune%20Shark)%20to%20Work%2C%20Disable%20%22Remove%20raw%20asset%20data%20after%20loading%20to%20save%20RAM%22%20under%20advanced%20settings%20in%20the%20packager.%60)%3B%0D%0A%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20target.sounds%5Bindex%5D.asset.encodeDataURI()%3B%0D%0A%20%20%20%20%20%20await%20this.importURL(%7B%20...args%2C%20URL%3A%20sound%20%7D%2C%20util)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20async%20convertSound(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME1%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20response%20%3D%20await%20Scratch.fetch(sound.src)%3B%0D%0A%20%20%20%20%20%20%20%20const%20audioBlob%20%3D%20await%20response.blob()%3B%0D%0A%20%20%20%20%20%20%20%20const%20audioDataURL%20%3D%20await%20new%20Promise((resolve)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20reader%20%3D%20new%20FileReader()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20reader.onloadend%20%3D%20()%20%3D%3E%20resolve(reader.result)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20reader.readAsDataURL(audioBlob)%3B%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20await%20this.importURL(%7B%20NAME%3A%20args.NAME2%2C%20URL%3A%20audioDataURL%20%7D%2C%20util)%3B%0D%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%20console.error(e)%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20bindSound(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound1%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20const%20sound2%20%3D%20soundBank%5Bargs.NAME2%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound1%20%3D%3D%3D%20undefined%20%7C%7C%20sound2%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20shouldBind%20%3D%20args.TYPE%20%3D%3D%3D%20%22bind%22%3B%0D%0A%20%20%20%20%20%20sound1.isBind%20%3D%20shouldBind%3B%20sound2.isBind%20%3D%20shouldBind%3B%0D%0A%20%20%20%20%20%20if%20(shouldBind)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(sound1.binds%5Bsound2.name%5D)%20this.typeOverlay(sound1.binds%5Bsound2.name%5D%2C%20%22stop%22)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(sound2.binds%5Bsound1.name%5D)%20this.typeOverlay(sound2.binds%5Bsound1.name%5D%2C%20%22stop%22)%3B%0D%0A%20%20%20%20%20%20%20%20sound1.binds%5Bsound2.name%5D%20%3D%20sound2%3B%20sound2.binds%5Bsound1.name%5D%20%3D%20sound1%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20delete%20sound1.binds%5Bsound2.name%5D%3B%20delete%20sound2.binds%5Bsound1.name%5D%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20startSound(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20!%3D%3D%20undefined)%20this.play(sound.context%2C%200%2C%20sound)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20startSoundAt(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20const%20time%20%3D%20Scratch.Cast.toNumber(args.TIME)%3B%0D%0A%20%20%20%20%20%20if%20(sound%20!%3D%3D%20undefined)%20this.play(sound.context%2C%20time%2C%20sound)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20async%20playAndStop(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20time%20%3D%20Scratch.Cast.toNumber(args.TIME)%3B%0D%0A%20%20%20%20%20%20const%20max%20%3D%20Scratch.Cast.toNumber(args.MAX)%3B%0D%0A%20%20%20%20%20%20this.play(sound.context%2C%20time%2C%20sound)%3B%0D%0A%20%20%20%20%20%20await%20new%20Promise((resolve)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20setTimeout(()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20this.typeOverlay(sound%2C%20%22stop%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20%7D%2C%20(max%20-%20time)%20*%201000)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20stopSound(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20!%3D%3D%20undefined)%20this.typeOverlay(sound%2C%20%22stop%22)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20pauseSound(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20if%20(args.UN_PAUSE%20%3D%3D%3D%20%22pause%22)%20this.typeOverlay(sound%2C%20%22pause%22)%3B%0D%0A%20%20%20%20%20%20else%20this.typeOverlay(sound%2C%20%22unpause%22)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20ctrlSounds(args)%20%7B%0D%0A%20%20%20%20%20%20if%20(args.CONTROL%20%3D%3D%3D%20%22start%22)%20Object.keys(soundBank).forEach(key%20%3D%3E%20%7B%20this.play(soundBank%5Bkey%5D.context%2C%200%2C%20soundBank%5Bkey%5D)%20%7D)%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.CONTROL%20%3D%3D%3D%20%22stop%22)%20Object.keys(soundBank).forEach(key%20%3D%3E%20%7B%20soundBank%5Bkey%5D.context.stop()%20%7D)%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.CONTROL%20%3D%3D%3D%20%22pause%22)%20Object.keys(soundBank).forEach(key%20%3D%3E%20%7B%20this.typeOverlay(soundBank%5Bkey%5D%2C%20%22pause%22)%20%7D)%3B%0D%0A%20%20%20%20%20%20else%20Object.keys(soundBank).forEach(key%20%3D%3E%20%7B%20this.typeOverlay(soundBank%5Bkey%5D%2C%20%22unpause%22)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20enableControl(args)%20%7B%20settings.flagCtrl%20%3D%20args.ON_OFF%20%3D%3D%3D%20%22on%22%20%7D%0D%0A%0D%0A%20%20%20%20toggleOverlap(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20sound.overlap%20%3D%20args.TYPE%20%3D%3D%3D%20%22on%22%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20toggleLoop(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20sound.context.loop%20%3D%20args.TYPE%20%3D%3D%3D%20%22on%22%3B%0D%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22off%22)%20this.typeOverlay(sound%2C%20%22stop%22)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20toggleReverse(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20if%20(sound.reversed%20%3D%3D%3D%20(args.TYPE%20%3D%3D%3D%20%22on%22))%20return%3B%0D%0A%20%20%20%20%20%20sound.reversed%20%3D%20args.TYPE%20%3D%3D%3D%20%22on%22%3B%0D%0A%20%20%20%20%20%20this.typeOverlay(sound%2C%20%22stop%22)%3B%0D%0A%20%20%20%20%20%20const%20node%20%3D%20sound.context.sourceNode%3B%0D%0A%20%20%20%20%20%20const%20reverseBuffer%20%3D%20(buffer)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20buffer.numberOfChannels%3B%20i%2B%2B)%20%7B%20buffer.getChannelData(i).reverse()%20%7D%0D%0A%20%20%20%20%20%20%20%20return%20buffer%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20bufferSource%20%3D%20node.context.createBufferSource()%3B%0D%0A%20%20%20%20%20%20bufferSource.buffer%20%3D%20reverseBuffer(node.buffer)%3B%0D%0A%20%20%20%20%20%20bufferSource.connect(node.context.destination)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20loopParams(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20sound.context.loop%20%3D%20true%3B%0D%0A%20%20%20%20%20%20const%20srcNode%20%3D%20sound.context.sourceNode%3B%0D%0A%20%20%20%20%20%20srcNode.loopStart%20%3D%20Scratch.Cast.toNumber(args.START)%3B%0D%0A%20%20%20%20%20%20srcNode.loopEnd%20%3D%20Scratch.Cast.toNumber(args.END)%3B%0D%0A%20%20%20%20%20%20sound.loopParm%20%3D%20%5BsrcNode.loopStart%2C%20srcNode.loopEnd%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20deleteSound(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20this.stopSound(args)%3B%0D%0A%20%20%20%20%20%20if%20(sound)%20%7B%0D%0A%20%20%20%20%20%20%20%20sound.vol%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20sound.context.volume%20%3D%200%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20delete%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20deleteAllSounds()%20%7B%0D%0A%20%20%20%20%20%20for%20(let%20name%20in%20soundBank)%20this.deleteSound(%7B%20NAME%3A%20name%20%7D)%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20allSounds()%20%7B%20return%20JSON.stringify(Object.keys(soundBank))%20%7D%0D%0A%0D%0A%20%20%20%20allPlaySounds()%20%7B%0D%0A%20%20%20%20%20%20const%20players%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20Object.entries(soundBank).forEach((%5Bkey%2C%20innerSrc%5D)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(innerSrc.context.playing)%20players.push(key)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20return%20JSON.stringify(players)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20soundCheck(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%20false%3B%0D%0A%20%20%20%20%20%20switch%20(args.CONTROL)%20%7B%0D%0A%20%20%20%20%20%20%20%20case%20%22exists%22%3A%20return%20sound.loaded%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22playing%22%3A%20return%20sound.context.playing%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22paused%22%3A%20return%20sound.context.paused%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22looped%22%3A%20return%20sound.context.loop%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22overlaped%22%3A%20return%20sound.overlap%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22reversed%22%3A%20return%20sound.reversed%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22binded%22%3A%20return%20sound.isBind%3B%0D%0A%20%20%20%20%20%20%20%20default%3A%20return%20false%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20soundProperty(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%200%3B%0D%0A%20%20%20%20%20%20const%20src%20%3D%20sound.context.sourceNode%3B%0D%0A%20%20%20%20%20%20switch%20(args.PROP)%20%7B%0D%0A%20%20%20%20%20%20%20%20case%20%22length%22%3A%20return%20this.modTime(src.buffer.duration%2C%20sound)%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22current%20time%22%3A%20return%20this.currentTime(sound%2C%20sound.context%2C%20src)%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22estimated%20bpm%22%3A%20return%20this.getBPM(src.buffer.getChannelData(0)%2C%20src.buffer.sampleRate)%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22source%22%3A%20return%20sound.src%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22binds%22%3A%20return%20JSON.stringify(Object.keys(sound.binds))%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22volume%22%3A%20return%20sound.vol%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22pitch%22%3A%20return%20Math.round((sound.pitch%20-%201)%20*%20100)%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22detune%22%3A%20return%20sound.detune%20%2F%2010%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22speed%22%3A%20return%20sound.speed%20*%20100%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22gain%22%3A%20return%20sound.gain%20*%20100%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22pan%22%3A%20return%20sound.effects%5Bargs.PROP.toUpperCase()%5D%3F.options.pan%20*%20100%20%7C%7C%200%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22distortion%22%3A%20return%20sound.effects%5Bargs.PROP.toUpperCase()%5D%3F.options.gain%20*%20100%20%7C%7C%200%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22attack%22%3A%20return%20sound.context.attack%20*%20100%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22release%22%3A%20return%20sound.context.release%20*%20100%3B%0D%0A%20%20%20%20%20%20%20%20default%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20effect%20%3D%20sound.effects%5Bargs.PROP.toUpperCase()%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(effect%20%3D%3D%3D%20undefined)%20return%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20return%20JSON.stringify(effect.arguments)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getLoudTime(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%200%3B%0D%0A%20%20%20%20%20%20const%20time%20%3D%20Scratch.Cast.toNumber(args.TIME)%3B%0D%0A%20%20%20%20%20%20const%20duration%20%3D%20sound.context.sourceNode.buffer.duration%3B%0D%0A%20%20%20%20%20%20if%20(time%20%3C%200%20%7C%7C%20time%20%3E%20duration)%20return%200%3B%0D%0A%20%20%20%20%20%20const%20audioBuffer%20%3D%20sound.context.sourceNode.buffer%3B%0D%0A%20%20%20%20%20%20const%20sampleRate%20%3D%20audioBuffer.sampleRate%3B%0D%0A%20%20%20%20%20%20const%20channelData%20%3D%20audioBuffer.getChannelData(0)%3B%0D%0A%20%20%20%20%20%20const%20sampleIndex%20%3D%20Math.floor(sampleRate%20*%20time)%3B%0D%0A%20%20%20%20%20%20const%20windowSize%20%3D%20sampleRate%20*%200.1%3B%0D%0A%20%20%20%20%20%20const%20startSample%20%3D%20Math.max(0%2C%20sampleIndex%20-%20windowSize%20%2F%202)%3B%0D%0A%20%20%20%20%20%20const%20endSample%20%3D%20Math.min(channelData.length%2C%20sampleIndex%20%2B%20windowSize%20%2F%202)%3B%0D%0A%20%20%20%20%20%20let%20sample%20%3D%200%3B%0D%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22raw%20noise%22)%20sample%20%3D%20channelData%5BendSample%5D%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22tone%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20data%20%3D%20channelData.slice(startSample%2C%20endSample)%3B%0D%0A%20%20%20%20%20%20%20%20const%20size%20%3D%20data.length%3B%0D%0A%20%20%20%20%20%20%20%20const%20tauArray%20%3D%20new%20Array(size).fill(0)%3B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20tau%20%3D%201%3B%20tau%20%3C%20size%3B%20tau%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20let%20sum%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20size%20-%20tau%3B%20i%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20diff%20%3D%20data%5Bi%5D%20-%20data%5Bi%20%2B%20tau%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sum%20%2B%3D%20diff%20*%20diff%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20tauArray%5Btau%5D%20%3D%20sum%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20for%20(let%20tau%20%3D%201%3B%20tau%20%3C%20size%3B%20tau%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20sample%20%2B%3D%20tauArray%5Btau%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20tauArray%5Btau%5D%20*%3D%20tau%20%2F%20sample%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20let%20bestTau%20%3D%20-1%3B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20tau%20%3D%201%3B%20tau%20%3C%20size%3B%20tau%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(tauArray%5Btau%5D%20%3C%200.1)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20bestTau%20%3D%20tau%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20if%20(bestTau%20%3E%200)%20return%20sampleRate%20%2F%20bestTau%3B%0D%0A%20%20%20%20%20%20%20%20return%200%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%20startSample%3B%20i%20%3C%20endSample%3B%20i%2B%2B)%20%7B%20sample%20%2B%3D%20channelData%5Bi%5D%20*%20channelData%5Bi%5D%20%7D%0D%0A%20%20%20%20%20%20%20%20const%20rms%20%3D%20Math.sqrt(sample%20%2F%20(endSample%20-%20startSample))%3B%0D%0A%20%20%20%20%20%20%20%20const%20dB%20%3D%2020%20*%20Math.log10(rms)%3B%0D%0A%20%20%20%20%20%20%20%20sample%20%3D%20Math.min(Math.max((dB%20%2B%2050)%20%2F%2050%2C%200)%2C%201)%20*%20100%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20isNaN(sample)%20%3F%200%20%3A%20sample%20*%20sound.gain%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setVol(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20sound.vol%20%3D%20Math.max(0%2C%20Scratch.Cast.toNumber(args.NUM))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20resetEffect(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20effects%20%3D%20sound.effects%3B%0D%0A%20%20%20%20%20%20%20%20Object.keys(effects).forEach(key%20%3D%3E%20%7B%20sound.context.removeEffect(effects%5Bkey%5D)%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20sound.effects%20%3D%20%7B%7D%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22%20%7C%7C%20args.EFFECT%20%3D%3D%3D%20%22pitch%22)%20sound.pitch%20%3D%201%3B%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22%20%7C%7C%20args.EFFECT%20%3D%3D%3D%20%22detune%22)%20sound.detune%20%3D%200%3B%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22%20%7C%7C%20args.EFFECT%20%3D%3D%3D%20%22speed%22)%20sound.speed%20%3D%201%3B%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22%20%7C%7C%20args.EFFECT%20%3D%3D%3D%20%22gain%22)%20sound.gain%20%3D%201%3B%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22%20%7C%7C%20args.EFFECT%20%3D%3D%3D%20%22attack%22)%20sound.context.attack%20%3D%200%3B%0D%0A%20%20%20%20%20%20if%20(args.EFFECT%20%3D%3D%3D%20%22all%20effects%22%20%7C%7C%20args.EFFECT%20%3D%3D%3D%20%22release%22)%20sound.context.release%20%3D%200%3B%0D%0A%20%20%20%20%20%20const%20name%20%3D%20args.EFFECT.toUpperCase()%3B%0D%0A%20%20%20%20%20%20if%20(sound.effects%5Bname%5D%20!%3D%3D%20undefined)%20%7B%0D%0A%20%20%20%20%20%20%20%20sound.context.removeEffect(sound.effects%5Bname%5D)%3B%0D%0A%20%20%20%20%20%20%20%20delete%20sound.effects%5Bname%5D%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20this.patchLinks(sound.context.sourceNode%2C%20sound)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setThing(args)%20%7B%20this.setThingNew(args)%20%7D%0D%0A%20%20%20%20setThingNew(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20value%20%3D%20Scratch.Cast.toNumber(args.VALUE)%20%2F%20100%3B%0D%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22pitch%22)%20sound.pitch%20%3D%20Math.max(0%2C%20value%20%2B%201)%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22detune%22)%20sound.detune%20%3D%20value%20*%201000%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22speed%22)%20sound.speed%20%3D%20Math.max(0%2C%20value)%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22gain%22)%20sound.gain%20%3D%20value%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22attack%22)%20sound.context.attack%20%3D%20Math.max(0%2C%20value)%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22release%22)%20sound.context.release%20%3D%20Math.max(0%2C%20value)%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22pan%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20pan%20%3D%20new%20Pizzicato.Effects.StereoPanner(%7B%20pan%3A%20Math.max(-1%2C%20Math.min(1%2C%20value))%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20return%20this.updateEffect(pan%2C%20sound%2C%20%22PAN%22%2C%20args)%3B%0D%0A%20%20%20%20%20%20%7D%20else%20if%20(args.TYPE%20%3D%3D%3D%20%22distortion%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20distort%20%3D%20new%20Pizzicato.Effects.Distortion(%7B%20gain%3A%20value%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20return%20this.updateEffect(distort%2C%20sound%2C%20%22DISTORTION%22%2C%20args)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20this.patchLinks(sound.context.sourceNode%2C%20sound)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setReverb(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20reverb%20%3D%20new%20Pizzicato.Effects.Reverb(%7B%0D%0A%20%20%20%20%20%20%20%20time%3A%20Scratch.Cast.toNumber(args.TIME)%20%2F%2010%2C%20decay%3A%20Scratch.Cast.toNumber(args.DECAY)%20%2F%2010%2C%0D%0A%20%20%20%20%20%20%20%20mix%3A%20Scratch.Cast.toNumber(args.MIX)%20%2F%20100%2C%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(reverb%2C%20sound%2C%20%22REVERB%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setDelay(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20delay%20%3D%20new%20Pizzicato.Effects.Delay(%7B%0D%0A%20%20%20%20%20%20%20%20time%3A%20Math.min(1%2C%20Math.max(0%2C%20Scratch.Cast.toNumber(args.TIME)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20decay%3A%20Scratch.Cast.toNumber(args.FEED)%20%2F%20100%2C%20mix%3A%20Scratch.Cast.toNumber(args.MIX)%20%2F%20100%2C%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(delay%2C%20sound%2C%20%22DELAY%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setFuzz(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20fuzz%20%3D%20new%20Pizzicato.Effects.Quadrafuzz(%7B%0D%0A%20%20%20%20%20%20%20%20lowGain%3A%20Math.min(1%2C%20Math.max(0%2C%20Scratch.Cast.toNumber(args.LOW)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20midLowGain%3A%20Math.min(1%2C%20Math.max(0%2C%20Scratch.Cast.toNumber(args.MED1)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20midHighGain%3A%20Math.min(1%2C%20Math.max(0%2C%20Scratch.Cast.toNumber(args.MED2)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20highGain%3A%20Math.min(1%2C%20Math.max(0%2C%20Scratch.Cast.toNumber(args.HIGH)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20mix%3A%20Scratch.Cast.toNumber(args.MIX)%20%2F%20100%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(fuzz%2C%20sound%2C%20%22FUZZ%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setBitcrush(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20%2F*%20NOTE%3A%20Bitcrusher%20uses%20%22ScriptProcessorNode%22%20wich%20is%20deprecated.%0D%0A%20%20%20%20%20%20%20%20From%20what%20Ive%20tested%20and%20read%20online%2C%20ending%20support%20for%20this%20doesnt%20seem%20to%20be%20%0D%0A%20%20%20%20%20%20%20%20going%20anywhere.%20If%20a%20problem%20emerges%20we%20need%20to%20try%20and%20find%20a%20way%20to%0D%0A%20%20%20%20%20%20%20%20use%20%22AudioWorkletNodes%22%20instead%20which%20is%20more%20complicated%20to%20use.%0D%0A%20%20%20%20%20%20*%2F%0D%0A%20%20%20%20%20%20const%20bitcrush%20%3D%20new%20Pizzicato.Effects.Bitcrusher(%7B%0D%0A%20%20%20%20%20%20%20%20bits%3A%20Math.max(10%2C%20Scratch.Cast.toNumber(args.BITS))%20%2F%2010%2C%0D%0A%20%20%20%20%20%20%20%20frequency%20%3A%20Math.max(30000%2C%20Scratch.Cast.toNumber(args.FREQ))%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(bitcrush%2C%20sound%2C%20%22BITCRUSH%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setTremolo(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20distort%20%3D%20new%20Pizzicato.Effects.Tremolo(%7B%0D%0A%20%20%20%20%20%20%20%20speed%3A%20Scratch.Cast.toNumber(args.SPEED)%20%2F%205%2C%0D%0A%20%20%20%20%20%20%20%20depth%3A%20Scratch.Cast.toNumber(args.DEPTH)%20%2F%20100%2C%0D%0A%20%20%20%20%20%20%20%20mix%3A%20Scratch.Cast.toNumber(args.MIX)%20%2F%20100%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(distort%2C%20sound%2C%20%22TREMOLO%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setPass(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20json%20%3D%20%7B%20frequency%3A%20Scratch.Cast.toNumber(args.FREQ)%2C%20peak%3AScratch.Cast.toNumber(args.PEAK)%20%2F%205%20%7D%3B%0D%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22highpass%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20highpass%20%3D%20new%20Pizzicato.Effects.HighPassFilter(json)%3B%0D%0A%20%20%20%20%20%20%20%20this.updateEffect(highpass%2C%20sound%2C%20%22HIGHPASS%22%2C%20args)%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20lowpass%20%3D%20new%20Pizzicato.Effects.LowPassFilter(json)%3B%0D%0A%20%20%20%20%20%20%20%20this.updateEffect(lowpass%2C%20sound%2C%20%22LOWPASS%22%2C%20args)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setFlanger(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20flang%20%3D%20new%20Pizzicato.Effects.Flanger(%7B%0D%0A%20%20%20%20%20%20%20%20time%3A%20Scratch.Cast.toNumber(args.TIME)%20%2F%20100%2C%20speed%3A%20Scratch.Cast.toNumber(args.SPEED)%20%2F%20100%2C%0D%0A%20%20%20%20%20%20%20%20depth%3A%20Scratch.Cast.toNumber(args.DEPTH)%20%2F%20100%2C%20feedback%3A%20Scratch.Cast.toNumber(args.FEED)%20%2F%20100%2C%0D%0A%20%20%20%20%20%20%20%20mix%3A%20Scratch.Cast.toNumber(args.MIX)%20%2F%20100%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(flang%2C%20sound%2C%20%22FLANGER%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setCompress(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20compress%20%3D%20new%20Pizzicato.Effects.Compressor(%7B%0D%0A%20%20%20%20%20%20%20%20threshold%3A%20Math.min(0%2C%20Math.max(-100%2C%20Scratch.Cast.toNumber(args.THRESH)%20*%20-1))%2C%0D%0A%20%20%20%20%20%20%20%20ratio%3A%20Scratch.Cast.toNumber(args.RATIO)%20%2F%205%2C%20attack%3A%20Math.min(0%2C%20Math.max(1%2C%20Scratch.Cast.toNumber(args.ATTACK)%20%2F%20100))%2C%0D%0A%20%20%20%20%20%20%20%20release%3A%20Math.min(0%2C%20Math.max(1%2C%20Scratch.Cast.toNumber(args.RELEASE)%20%2F%20100))%2C%20knee%3A%20Scratch.Cast.toNumber(args.KNEE)%20%2F%202.5%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(compress%2C%20sound%2C%20%22COMPRESSOR%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setEqualize(args)%20%7B%0D%0A%20%20%20%20%20%20const%20sound%20%3D%20soundBank%5Bargs.NAME%5D%3B%0D%0A%20%20%20%20%20%20if%20(sound%20%3D%3D%3D%20undefined)%20return%3B%0D%0A%20%20%20%20%20%20const%20equalizer%20%3D%20new%20Pizzicato.Effects.ThreeBandEqualizer(%7B%0D%0A%20%20%20%20%20%20%20%20cutoff_frequency_high%3A%2012000%20%2B%20(Scratch.Cast.toNumber(args.CUT_HIGH)%20*%20120)%2C%0D%0A%20%20%20%20%20%20%20%20cutoff_frequency_low%3A%2012000%20%2B%20(Scratch.Cast.toNumber(args.CUT_LOW)%20*%20120)%2C%0D%0A%20%20%20%20%20%20%20%20low_band_gain%3A%20Scratch.Cast.toNumber(args.LOW)%20%2F%2010%2C%0D%0A%20%20%20%20%20%20%20%20mid_band_gain%3A%20Scratch.Cast.toNumber(args.MID)%20%2F%2010%2C%0D%0A%20%20%20%20%20%20%20%20high_band_gain%3A%20Scratch.Cast.toNumber(args.HIGH)%20%2F%2010%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.updateEffect(equalizer%2C%20sound%2C%20%22EQUALIZER%22%2C%20args)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20save2Project(args)%20%7B%0D%0A%20%20%20%20%20%20settings.canSave%20%3D%20args.SAVE%20%3D%3D%3D%20%22save%22%3B%0D%0A%20%20%20%20%20%20if%20(!Scratch.extensions.isPenguinMod)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(settings.canSave)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20convertBank%20%3D%20JSON.parse(JSON.stringify(soundBank))%3B%0D%0A%20%20%20%20%20%20%20%20%20%20Object.values(convertBank).forEach(item%20%3D%3E%20delete%20item.context)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20runtime.extensionStorage%5B%22SPtuneShark3%22%5D%20%3D%20%7B%20bank%20%3A%20convertBank%2C%20settings%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%20runtime.extensionStorage%5B%22SPtuneShark3%22%5D%20%3D%20undefined%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20PenguinMod%20Storage%0D%0A%20%20%20%20serialize()%20%7B%0D%0A%20%20%20%20%20%20if%20(settings.canSave)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20convertBank%20%3D%20JSON.parse(JSON.stringify(soundBank))%3B%0D%0A%20%20%20%20%20%20%20%20Object.values(convertBank).forEach(item%20%3D%3E%20delete%20item.context)%3B%0D%0A%20%20%20%20%20%20%20%20return%20%7B%20SPtuneShark3%20%3A%20%7B%20bank%20%3A%20convertBank%2C%20settings%20%7D%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20deserialize(data)%20%7B%20load(data.SPtuneShark3)%20%7D%0D%0A%20%20%7D%0D%0A%0D%0A%20%20Scratch.extensions.register(new%20SPtuneShark3())%3B%0D%0A%7D)(Scratch)%3B%0D%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Hyper%20Sense%0D%0A%2F%2F%20ID%3A%20HyperSenseSP%0D%0A%2F%2F%20Description%3A%20Cool%20New%20Sensing%20Blocks%0D%0A%2F%2F%20By%3A%20SharkPool%0D%0A%0D%0A%2F%2F%20Version%203.0.1%0D%0A%0D%0A(function%20(Scratch)%20%7B%0D%0A%20%20%22use%20strict%22%3B%0D%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22Hyper%20Sense%20must%20run%20unsandboxed%22)%3B%0D%0A%0D%0A%20%20const%20menuIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDUuMjkzIiBoZWlnaHQ9IjE0NS4yOTMiIHZpZXdCb3g9IjAgMCAxNDUuMjkzIDE0NS4yOTMiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCI%2BPHBhdGggZD0iTTAgNzIuNjQ3QzAgMzIuNTI1IDMyLjUyNSAwIDcyLjY0NyAwczcyLjY0NyAzMi41MjUgNzIuNjQ3IDcyLjY0Ny0zMi41MjUgNzIuNjQ3LTcyLjY0NyA3Mi42NDdTMCAxMTIuNzY5IDAgNzIuNjQ3IiBmaWxsPSIjNDI3Zjk5Ii8%2BPHBhdGggZD0iTTguMDkxIDcyLjY0N2MwLTM1LjY1MyAyOC45MDMtNjQuNTU2IDY0LjU1Ni02NC41NTZzNjQuNTU2IDI4LjkwMyA2NC41NTYgNjQuNTU2LTI4LjkwMyA2NC41NTYtNjQuNTU2IDY0LjU1NlM4LjA5MSAxMDguMyA4LjA5MSA3Mi42NDciIGZpbGw9IiM1Y2IxZDYiLz48cGF0aCBkPSJNMTA2LjIxNSAxMDguODg0YTIuNjcgMi42NyAwIDAgMS0xLjg4Ni0uNzhMMzcuNzUgNDEuNTIyYTIuNjcgMi42NyAwIDAgMSAwLTMuNzcyIDIuNjcgMi42NyAwIDAgMSAzLjc3MiAwbDY2LjU4IDY2LjU4YTIuNjY5IDIuNjY5IDAgMCAxLTEuODg3IDQuNTU0IiBmaWxsPSIjZmZmIi8%2BPHBhdGggZD0iTTY1Ljc1NCA1MS4wODNjMCA4LjEwMy02LjU2OCAxNC42NzEtMTQuNjcxIDE0LjY3MXMtMTQuNjcxLTYuNTY4LTE0LjY3MS0xNC42N2MwLTguMTA0IDYuNTY4LTE0LjY3MiAxNC42Ny0xNC42NzIgOC4xMDQgMCAxNC42NzIgNi41NjggMTQuNjcyIDE0LjY3MSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik02My43MiA4MS4zNzFjLTcuODg1LTEuODYyLTEyLjc2OS05Ljc2NC0xMC45MDYtMTcuNjVzOS43NjQtMTIuNzY5IDE3LjY1LTEwLjkwNyAxMi43NjkgOS43NjUgMTAuOTA3IDE3LjY1Yy0xLjg2MiA3Ljg4Ni05Ljc2NSAxMi43Ny0xNy42NSAxMC45MDciIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNOTcuNzY3IDgzLjA5NGMwIDguMTAyLTYuNTcgMTQuNjczLTE0LjY3MyAxNC42NzNzLTE0LjY3Mi02LjU3LTE0LjY3Mi0xNC42NzMgNi41NjktMTQuNjcxIDE0LjY3Mi0xNC42NzFjOC4xMDIgMCAxNC42NzMgNi41NyAxNC42NzMgMTQuNjciIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNMTA2LjIxNSAxMDguODg0YTIuNjcgMi42NyAwIDAgMS0xLjg4Ni0uNzhsLTE2LjM0LTE2LjM0YTIuNjY1IDIuNjY1IDAgMCAxIDAtMy43NzMgMi42NyAyLjY3IDAgMCAxIDMuNzcyIDBsMTYuMzQgMTYuMzRhMi42NyAyLjY3IDAgMCAxIDAgMy43NzMgMi42OCAyLjY4IDAgMCAxLTEuODg2Ljc4IiBmaWxsPSIjZmZmIi8%2BPHBhdGggZD0iTTE1LjMxNSA3Mi42NDcgMjguMTIyIDU5Ljg0djI1LjYxNHptNzAuMTM5LTQ0LjUyNUg1OS44NGwxMi44MDctMTIuODA3em00NC41MjUgNDQuNTI1LTEyLjgwNyAxMi44MDdWNTkuODR6TTU5Ljg0IDExNy4xNzJoMjUuNjE0bC0xMi44MDcgMTIuODA3eiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIvPjwvZz48L3N2Zz4%3D%22%3B%0D%0A%0D%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0D%0A%20%20const%20runtime%20%3D%20vm.runtime%3B%0D%0A%20%20const%20render%20%3D%20vm.renderer%3B%0D%0A%0D%0A%20%20let%20curPressKey%20%3D%20null%2C%20pressedKeys%20%3D%20%7B%7D%3B%0D%0A%20%20let%20mousePos%20%3D%20%5B0%2C%200%2C%200%2C%200%5D%2C%20scrollDist%20%3D%200%2C%20oldScroll%20%3D%20%5B0%2C%200%2C%200%5D%3B%0D%0A%20%20let%20publicVars%20%3D%20%7B%7D%2C%20askAs%20%3D%20%22sprite%22%2C%20loudnessArray%20%3D%20%5B%5D%3B%0D%0A%0D%0A%20%20class%20HyperSenseSP%20%7B%0D%0A%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20runtime.on(%22BEFORE_EXECUTE%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20runtime.startHats(%22HyperSenseSP_whenKeyPressed%22)%3B%0D%0A%20%20%20%20%20%20%20%20oldScroll%5B2%5D%20%2B%3D%20(0%20-%20oldScroll%5B2%5D)%20%2F%204%3B%0D%0A%20%20%20%20%20%20%20%20mousePos%5B2%5D%20%2B%3D%20(0%20-%20mousePos%5B2%5D)%20%2F%203%3B%0D%0A%20%20%20%20%20%20%20%20mousePos%5B3%5D%20%2B%3D%20(0%20-%20mousePos%5B3%5D)%20%2F%203%3B%0D%0A%20%20%20%20%20%20%20%20Object.keys(pressedKeys).forEach(key%20%3D%3E%20%7B%20pressedKeys%5Bkey%5D%20%2B%3D%200.1%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20document.addEventListener(%22wheel%22%2C%20this.handleScroll)%3B%0D%0A%20%20%20%20%20%20document.addEventListener(%22mousemove%22%2C%20(e)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20mousePos%20%3D%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20e.clientX%2C%20e.clientY%2C%20runtime.ioDevices.mouse.getScratchX()%2C%20runtime.ioDevices.mouse.getScratchY()%0D%0A%20%20%20%20%20%20%20%20%5D%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20window.addEventListener(%22keydown%22%2C%20(event)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20name%20%3D%20event.key.toUpperCase()%3B%0D%0A%20%20%20%20%20%20%20%20if%20(pressedKeys%5Bname%5D%20%3D%3D%3D%20undefined)%20pressedKeys%5Bname%5D%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20curPressKey%20%3D%20name%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20window.addEventListener(%22keyup%22%2C%20(event)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20delete%20pressedKeys%5Bevent.key.toUpperCase()%5D%3B%0D%0A%20%20%20%20%20%20%20%20curPressKey%20%3D%20Object.keys(pressedKeys).pop()%20%7C%7C%20null%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20getInfo()%20%7B%0D%0A%20%20%20%20%20%20return%20%7B%0D%0A%20%20%20%20%20%20%20%20id%3A%20%22HyperSenseSP%22%2C%0D%0A%20%20%20%20%20%20%20%20name%3A%20%22Hyper%20Sense%22%2C%0D%0A%20%20%20%20%20%20%20%20color1%3A%20%22%235cb1d6%22%2C%0D%0A%20%20%20%20%20%20%20%20color2%3A%20%22%2347a8d1%22%2C%0D%0A%20%20%20%20%20%20%20%20color3%3A%20%22%232e8eb8%22%2C%0D%0A%20%20%20%20%20%20%20%20menuIconURI%2C%0D%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Scrolling%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22monitorScrollWheel%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22scroll%20distance%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22scrollVel%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22scroll%20velocity%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setScrollDistance%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20scroll%20distance%20to%20%5BDISTANCE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DISTANCE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changeScrollDistance%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20scroll%20distance%20by%20%5BDISTANCE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DISTANCE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22scrollWheelHat%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.EVENT%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20scrolled%20up%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20isEdgeActivated%3A%20false%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EVENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22SCROLL_EVENTS%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22scrollWheelHat2%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.EVENT%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20scrolled%20down%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20isEdgeActivated%3A%20false%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22scrollWheelBool%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20scrolling%20%5BEVENT%5D%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EVENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22SCROLL_EVENTS%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Mouse%20Detection%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22mouseClick%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20mouse%20%5BBUTTON%5D%20down%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20menu%3A%20%22mouseButtons%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22realX%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22real%20mouse%20x%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22realY%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22real%20mouse%20y%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22velX%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22mouse%20velocity%20x%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22velY%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22mouse%20velocity%20y%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Key%20Detection%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22whenKeyHit%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.HAT%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20%5BKEY%5D%20hit%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22keys%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isKeyHit%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22key%20%5BKEY%5D%20hit%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22keys%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22whenKeyPressed%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.HAT%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20%5BKEY%5D%20pressed%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20isEdgeActivated%3A%20false%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22keys%22%2C%20defaultValue%3A%20%22Tab%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isKeyPressed%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22key%20%5BKEY%5D%20pressed%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22keys%22%2C%20defaultValue%3A%20%22Tab%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22currentKey%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22current%20key%20pressed%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22currentKeys%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22current%20keys%20pressed%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22timeKeyPressed%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22seconds%20%5BKEY%5D%20key%20pressed%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22keys%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Touching%20Expanded%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22spritePointing%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20%5BSPRITE1%5D%20pointing%20towards%20%5BSPRITE2%5D%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE1%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS3%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE2%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22spriteTouchingSprite%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20%5BSPRITE1%5D%20touching%20%5BSPRITE2%5D%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE1%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE2%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS3%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22spriteTouchingClone%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20%5BSPRITE1%5D%20touching%20clone%20of%20%5BSPRITE2%5D%20with%20%5BVAR%5D%20set%20to%20%5BVAL%5D%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE1%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS3%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE2%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS4%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VAR%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20variable%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VAL%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%200%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22spriteCurrentTouching%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22sprites%20touching%20%5BSPRITE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS2%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getNeighbors%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22neighbors%20of%20%5BSPRITE%5D%20in%20range%20%5BDIAMETER%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS2%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DIAMETER%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20200%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22colorTouchingSprite%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22color%20touching%20%5BSPRITE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS2%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22colorAtPosition%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22color%20at%20x%20%5Bx%5D%20y%20%5By%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Strings%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22boolean%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20%5BSTRING%5D%20real%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20STRING%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getAllString%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22get%20%5BTEXT%5D%20in%20%5BSTRING%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%20%22rotating%20a%206%20makes%20a%209!%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22string_types%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Asking%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22advancedAsk%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22ask%20%5BQUESTION%5D%20as%20%5BTHING%5D%20and%20%5BWAIT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20THING%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22Asking%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20QUESTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22what%20is%20your%20name%3F%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WAIT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22shouldWait%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22advancedAskReporter%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22ask%20%5BQUESTION%5D%20as%20%5BTHING%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20THING%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22Asking%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20QUESTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22what%20is%20your%20name%3F%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22stopAsking%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22stop%20asking%20question%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22currentTyped%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22typed%20answer%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isAsking%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20asking%3F%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAtt%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20ask%20monitor%20x%3A%20%5Bx%5D%20y%3A%20%5By%5D%20width%3A%20%5Bwidth%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%0D%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%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAskType%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20ask%20box%20input%20to%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22INPUTS%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAskType2%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20ask%20box%20input%20to%20dropdown%20with%20items%20in%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22LISTS%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAskType3%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20ask%20box%20input%20to%20dropdown%20with%20items%20in%20array%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22%5B%5C%22option%201%5C%22%2C%20%5C%22option%202%5C%22%5D%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Miscellaneous%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isScreen%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20%5BSCREEN%5D%20%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20disableMonitor%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SCREEN%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22SCREENS%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22screenOff%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22stage%20size%20offset%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22averageMicrophoneLoudness%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22average%20loudness%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getSpriteName%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22my%20sprite%20name%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22allLayers%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22max%20sprite%20layers%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22spriteDragMode%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20drag%20mode%20of%20%5BSPRITE%5D%20to%20%5BDRAG%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS3%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DRAG%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22DRAG_MODES%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22spriteDragging%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20%5BSPRITE%5D%20%5BDRAG%5D%20%3F%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SPRITE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22TARGETS3%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DRAG%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22DRAG_TYPE%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Depreciated%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22toggleMicrophone%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20microphone%20to%20%5BSTATE%5D%22%2C%20hideFromPalette%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%20STATE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%20%7D%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22monitorScrollWheelLimited%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22scroll%20wheel%20distance%20limited%20from%20%5BMIN%5D%20to%20%5BMAX%5D%22%2C%20hideFromPalette%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%20MIN%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%20MAX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20TARGETS%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20this._getTargets(true%2C%20false)%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20TARGETS2%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20this._getTargets(true%2C%20true)%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20TARGETS3%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20this._getTargets(false%2C%20true)%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20TARGETS4%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20this._getTargets(false%2C%20false)%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20LISTS%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%22getLists%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20SCREENS%3A%20%5B%22fullscreen%22%2C%20%22smallscreen%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20INPUTS%3A%20%5B%22text%22%2C%20%22password%22%2C%20%22number%22%2C%20%22color%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20Asking%3A%20%5B%22stage%22%2C%20%22sprite%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20shouldWait%3A%20%5B%22wait%22%2C%20%22continue%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20SCROLL_EVENTS%3A%20%5B%22up%22%2C%20%22down%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20DRAG_TYPE%3A%20%5B%22draggable%22%2C%20%22being%20dragged%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20DRAG_MODES%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22draggable%22%2C%20%22not%20draggable%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20string_types%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22numbers%22%2C%20%22letters%22%2C%20%22special%20characters%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20keys%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Any%22%2C%20%22A%22%2C%20%22B%22%2C%20%22C%22%2C%20%22D%22%2C%20%22E%22%2C%20%22F%22%2C%20%22G%22%2C%20%22H%22%2C%20%22I%22%2C%20%22J%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22K%22%2C%20%22L%22%2C%20%22M%22%2C%20%22N%22%2C%20%22O%22%2C%20%22P%22%2C%20%22Q%22%2C%20%22R%22%2C%20%22S%22%2C%20%22T%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22U%22%2C%20%22V%22%2C%20%22W%22%2C%20%22X%22%2C%20%22Y%22%2C%20%22Z%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%220%22%2C%20%221%22%2C%20%222%22%2C%20%223%22%2C%20%224%22%2C%20%225%22%2C%20%226%22%2C%20%227%22%2C%20%228%22%2C%20%229%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Up%20Arrow%22%2C%20%22Down%20Arrow%22%2C%20%22Left%20Arrow%22%2C%20%22Right%20Arrow%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Space%22%2C%20%22Enter%22%2C%20%22Shift%22%2C%20%22Control%22%2C%20%22Alt%22%2C%20%22Escape%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Backspace%22%2C%20%22Tab%22%2C%20%22Caps%20Lock%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Insert%22%2C%20%22Page%20Up%22%2C%20%22Page%20Down%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20mouseButtons%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22left%22%2C%20value%3A%20%220%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22scroll%20wheel%22%2C%20value%3A%20%221%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22right%22%2C%20value%3A%20%222%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22back%22%2C%20value%3A%20%223%22%20%7D%2C%20%7B%20text%3A%20%22foward%22%2C%20value%3A%20%224%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20Helper%20Funcs%0D%0A%20%20%20%20_getTargets(mouse%2C%20myself)%20%7B%0D%0A%20%20%20%20%20%20const%20spriteNames%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20if%20(mouse)%20%7B%20spriteNames.push(%7B%20text%3A%20%22mouse-pointer%22%2C%20value%3A%20%22_mouse_%22%20%7D)%20%7D%0D%0A%20%20%20%20%20%20if%20(myself)%20%7B%20spriteNames.push(%7B%20text%3A%20%22myself%22%2C%20value%3A%20%22_myself_%22%20%7D)%20%7D%0D%0A%20%20%20%20%20%20const%20targets%20%3D%20runtime.targets%3B%0D%0A%20%20%20%20%20%20for%20(let%20index%20%3D%201%3B%20index%20%3C%20targets.length%3B%20index%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20target%20%3D%20targets%5Bindex%5D%3B%0D%0A%20%20%20%20%20%20%20%20if%20(target.isOriginal)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20targetName%20%3D%20target.getName()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20spriteNames.push(%7B%20text%3A%20targetName%2C%20value%3A%20targetName%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20spriteNames.length%20%3E%200%20%3F%20spriteNames%20%3A%20%5B%22%22%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getLists()%20%7B%0D%0A%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20globalLists%20%3D%20Object.values(runtime.getTargetForStage().variables).filter((x)%20%3D%3E%20x.type%20%3D%3D%20%22list%22)%3B%0D%0A%20%20%20%20%20%20%20%20const%20localLists%20%3D%20Object.values(vm.editingTarget.variables).filter((x)%20%3D%3E%20x.type%20%3D%3D%20%22list%22)%3B%0D%0A%20%20%20%20%20%20%20%20const%20listMenu%20%3D%20%5B...new%20Set(%5B...globalLists%2C%20...localLists%5D)%5D%3B%0D%0A%20%20%20%20%20%20%20%20if%20(listMenu.length%20%3D%3D%3D%200)%20return%20%5B%7B%20text%3A%20%22make%20a%20list%22%2C%20value%3A%20%22make%20a%20list%22%20%7D%5D%3B%0D%0A%20%20%20%20%20%20%20%20return%20listMenu.map((i)%20%3D%3E%20(%7B%20text%3A%20i.name%2C%20value%3A%20i.id%20%7D))%3B%0D%0A%20%20%20%20%20%20%7D%20catch%20%7B%20return%20%5B%22make%20a%20list%22%5D%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20look4List(list%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20id%20%3D%20util.target.lookupVariableById(list)%3B%0D%0A%20%20%20%20%20%20if%20(id%20%26%26%20id.type%20%3D%3D%3D%20%22list%22)%20return%20id.value%3B%0D%0A%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20name%20%3D%20util.target.lookupVariableByNameAndType(list%2C%20%22list%22)%3B%0D%0A%20%20%20%20%20%20%20%20return%20name%20%3F%20name.value%20%3A%20%5B%22undefined%20list%22%5D%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20handleScroll%20%3D%20(event)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20scrollDist%20%2B%3D%20event.deltaY%3B%0D%0A%20%20%20%20%20%20oldScroll%5B2%5D%20%3D%20event.deltaY%3B%0D%0A%20%20%20%20%20%20if%20(this.scrollWheelBool(%7B%20EVENT%3A%22up%22%2C%20SECRET%3A%20true%20%7D))%20runtime.startHats(%22HyperSenseSP_scrollWheelHat%22)%3B%0D%0A%20%20%20%20%20%20if%20(this.scrollWheelBool(%7B%20EVENT%3A%22down%22%2C%20SECRET%3A%20true%20%7D))%20runtime.startHats(%22HyperSenseSP_scrollWheelHat2%22)%3B%0D%0A%20%20%20%20%7D%3B%0D%0A%0D%0A%20%20%20%20keyHandler(key%2C%20loop)%20%7B%0D%0A%20%20%20%20%20%20if%20(key%20%3D%3D%3D%20%22Any%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(curPressKey%20%3D%3D%3D%20null)%20return%20false%3B%0D%0A%20%20%20%20%20%20%20%20key%20%3D%20curPressKey%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20if%20(isNaN(parseFloat(key)))%20key%20%3D%20key.toUpperCase()%3B%0D%0A%20%20%20%20%20%20let%20pressedKey%20%3D%20this.currentKey().toUpperCase()%3B%0D%0A%20%20%20%20%20%20if%20(pressedKey%20!%3D%3D%20%22%20%22)%20pressedKey%20%3D%20pressedKey.replaceAll(%22%20%22%2C%20%22%22)%3B%0D%0A%20%20%20%20%20%20if%20(%0D%0A%20%20%20%20%20%20%20%20((key%20%3D%3D%3D%20%22SPACE%22%20%26%26%20pressedKey%20%3D%3D%3D%20%22%20%22)%20%7C%7C%20key%20%3D%3D%3D%20pressedKey%20%7C%7C%0D%0A%20%20%20%20%20%20%20%20(key.startsWith(%22DIGIT%22)%20%26%26%20key.slice(5)%20%3D%3D%3D%20pressedKey))%0D%0A%20%20%20%20%20%20)%20%7B%0D%0A%20%20%20%20%20%20%20%20key%20%3D%20(key%20%3D%3D%3D%20%22SPACE%22)%20%3F%20%22%20%22%20%3A%20key%3B%0D%0A%20%20%20%20%20%20%20%20return%20loop%20%3F%20true%20%3A%20pressedKeys%5Bkey%5D%20%3C%3D%200.1%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20false%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20colorTouching(x%2C%20y)%20%7B%0D%0A%20%20%20%20%20%20const%20clientX%20%3D%20Math.round((((runtime.stageWidth%20%2F%202)%20%2B%20x)%20%2F%20runtime.stageWidth)%20*%20render._gl.canvas.clientWidth)%3B%0D%0A%20%20%20%20%20%20const%20clientY%20%3D%20Math.round((((runtime.stageHeight%20%2F%202)%20-%20y)%20%2F%20runtime.stageHeight)%20*%20render._gl.canvas.clientHeight)%3B%0D%0A%20%20%20%20%20%20const%20rgb%20%3D%20render.extractColor(clientX%2C%20clientY%2C%2020).color%3B%0D%0A%20%20%20%20%20%20return%20%60%23%24%7Brgb.r.toString(16).padStart(2%2C%20%220%22)%7D%24%7Brgb.g.toString(16).padStart(2%2C%20%220%22)%7D%24%7Brgb.b.toString(16).padStart(2%2C%20%220%22)%7D%60%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20Block%20Funcs%0D%0A%20%20%20%20monitorScrollWheel()%20%7B%20return%20scrollDist%20%7D%0D%0A%20%20%20%20scrollVel()%20%7B%20return%20oldScroll%5B2%5D%20*%20-1%20%7D%0D%0A%0D%0A%20%20%20%20setScrollDistance(args)%20%7B%20scrollDist%20%3D%20Scratch.Cast.toNumber(args.DISTANCE)%20%7D%0D%0A%20%20%20%20changeScrollDistance(args)%20%7B%20scrollDist%20%2B%3D%20Scratch.Cast.toNumber(args.DISTANCE)%20%7D%0D%0A%0D%0A%20%20%20%20scrollWheelBool(args)%20%7B%0D%0A%20%20%20%20%20%20const%20i%20%3D%20args.SECRET%20%3F%200%20%3A%201%3B%0D%0A%20%20%20%20%20%20const%20status%20%3D%20args.EVENT%20%3D%3D%3D%20%22down%22%20%3F%20scrollDist%20%3E%20oldScroll%5Bi%5D%20%3A%20scrollDist%20%3C%20oldScroll%5Bi%5D%3B%0D%0A%20%20%20%20%20%20if%20(status)%20oldScroll%5Bi%5D%20%3D%20scrollDist%3B%0D%0A%20%20%20%20%20%20return%20Scratch.Cast.toBoolean(status)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20mouseClick(args%2C%20util)%20%7B%20return%20util.ioQuery(%22mouse%22%2C%20%22getButtonIsDown%22%2C%20%5BScratch.Cast.toNumber(args.BUTTON)%5D)%20%7D%0D%0A%20%20%20%20realX()%20%7B%20return%20mousePos%5B0%5D%20%7D%0D%0A%20%20%20%20realY()%20%7B%20return%20mousePos%5B1%5D%20%7D%0D%0A%20%20%20%20velX()%20%7B%20return%20mousePos%5B2%5D%20%7D%0D%0A%20%20%20%20velY()%20%7B%20return%20mousePos%5B3%5D%20%7D%0D%0A%0D%0A%20%20%20%20isKeyHit(args)%20%7B%20return%20this.keyHandler(Scratch.Cast.toString(args.KEY).replace(%22%20%22%2C%20%22%22)%2C%20false)%20%7D%0D%0A%20%20%20%20whenKeyHit(args)%20%7B%20return%20this.keyHandler(Scratch.Cast.toString(args.KEY).replace(%22%20%22%2C%20%22%22)%2C%20false)%20%7D%0D%0A%0D%0A%20%20%20%20whenKeyPressed(args)%20%7B%20return%20this.keyHandler(Scratch.Cast.toString(args.KEY).replace(%22%20%22%2C%20%22%22)%2C%20true)%20%7D%0D%0A%20%20%20%20isKeyPressed(args)%20%7B%20return%20this.keyHandler(Scratch.Cast.toString(args.KEY).replace(%22%20%22%2C%20%22%22)%2C%20true)%20%7D%0D%0A%0D%0A%20%20%20%20currentKey()%20%7B%0D%0A%20%20%20%20%20%20if%20(curPressKey%20%3D%3D%3D%20null)%20return%20%22No%20Keys%20Pressed%22%3B%0D%0A%20%20%20%20%20%20else%20if%20(curPressKey.includes(%22ARROW%22)%20%7C%7C%20curPressKey%20%3D%3D%3D%20%22CAPSLOCK%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20(curPressKey%20%3D%3D%3D%20%22CAPSLOCK%22)%20%3F%20%22Caps%20Lock%22%20%3A%20%60%24%7B%20curPressKey.charAt(5).toUpperCase()%20%2B%20curPressKey.slice(6).toLowerCase()%20%7D%20Arrow%60%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20curPressKey.charAt(0).toUpperCase()%20%2B%20curPressKey.slice(1).toLowerCase()%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20currentKeys()%20%7B%0D%0A%20%20%20%20%20%20return%20JSON.stringify(Object.keys(pressedKeys).map((key)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(key.includes(%22ARROW%22)%20%7C%7C%20key%20%3D%3D%3D%20%22CAPSLOCK%22)%20return%20(key%20%3D%3D%3D%20%22CAPSLOCK%22)%20%3F%20%22Caps%20Lock%22%20%3A%20%60%24%7Bkey.charAt(5).toUpperCase()%20%2B%20key.slice(6).toLowerCase()%7D%20Arrow%60%3B%0D%0A%20%20%20%20%20%20%20%20return%20key.charAt(0).toUpperCase()%20%2B%20key.slice(1).toLowerCase()%3B%0D%0A%20%20%20%20%20%20%7D))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20timeKeyPressed(args)%20%7B%0D%0A%20%20%20%20%20%20let%20key%20%3D%20Scratch.Cast.toString(args.KEY).replace(%22%20%22%2C%20%22%22)%3B%0D%0A%20%20%20%20%20%20if%20(isNaN(parseFloat(key)))%20key%20%3D%20key.toUpperCase()%3B%0D%0A%20%20%20%20%20%20if%20(key%20%3D%3D%3D%20%22SPACE%22)%20key%20%3D%20%22%20%22%3B%0D%0A%20%20%20%20%20%20if%20(args.KEY%20%3D%3D%3D%20%22Any%22)%20return%20Math.max(0%2C%20...Object.values(pressedKeys))%3B%0D%0A%20%20%20%20%20%20else%20return%20pressedKeys%5Bkey%5D%20%3F%3F%200%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20spritePointing(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20target%20%3D%20args.SPRITE1%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target%20%3A%20runtime.getSpriteTargetByName(args.SPRITE1)%3B%0D%0A%20%20%20%20%20%20if%20(!target)%20return%20false%3B%0D%0A%20%20%20%20%20%20const%20oldDir%20%3D%20target.direction%3B%0D%0A%20%20%20%20%20%20runtime.ext_scratch3_motion.pointTowards(%7B%20TOWARDS%20%3A%20args.SPRITE2%20%7D%2C%20%7B%20...util%2C%20target%2C%20ioQuery%20%3A%20util.ioQuery%20%7D)%3B%0D%0A%20%20%20%20%20%20const%20newDir%20%3D%20target.direction%3B%0D%0A%20%20%20%20%20%20target.setDirection(oldDir)%3B%0D%0A%20%20%20%20%20%20return%20Math.round(newDir)%20%3D%3D%3D%20Math.round(oldDir)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20spriteTouchingSprite(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20sprite2%20%3D%20args.SPRITE2%3B%0D%0A%20%20%20%20%20%20const%20target%20%3D%20sprite2%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target%20%3A%20runtime.getSpriteTargetByName(sprite2)%3B%0D%0A%20%20%20%20%20%20if%20(!target)%20return%20false%3B%0D%0A%20%20%20%20%20%20return%20target.isTouchingObject(args.SPRITE1)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20spriteTouchingClone(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20target1%20%3D%20args.SPRITE1%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target%20%3A%20runtime.getSpriteTargetByName(args.SPRITE1)%3B%0D%0A%20%20%20%20%20%20const%20target2%20%3D%20runtime.getSpriteTargetByName(args.SPRITE2)%3B%0D%0A%20%20%20%20%20%20if%20(!target1%20%7C%7C%20!target2)%20return%20false%3B%0D%0A%20%20%20%20%20%20const%20clones%20%3D%20target2.sprite.clones%3B%0D%0A%20%20%20%20%20%20for%20(var%20i%20%3D%201%3B%20i%20%3C%20clones.length%3B%20i%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(clones%5Bi%5D)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20variable%20%3D%20clones%5Bi%5D.lookupVariableByNameAndType(args.VAR%2C%20%22%22%2C%20clones%5Bi%5D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(variable%20%26%26%20Scratch.Cast.toString(variable.value)%20%3D%3D%3D%20Scratch.Cast.toString(args.VAL))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(render.isTouchingDrawables(target1.drawableID%2C%20%5Bclones%5Bi%5D.drawableID%5D))%20return%20true%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20false%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20spriteCurrentTouching(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20list%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20const%20thisSprite%20%3D%20args.SPRITE%20%3D%3D%3D%20%22_mouse_%22%20%3F%20%22_mouse_%22%20%3A%20args.SPRITE%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target.getName()%20%3A%20args.SPRITE%3B%0D%0A%20%20%20%20%20%20const%20targets%20%3D%20runtime.targets%3B%0D%0A%20%20%20%20%20%20for%20(let%20index%20%3D%201%3B%20index%20%3C%20targets.length%3B%20index%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20target%20%3D%20targets%5Bindex%5D%3B%0D%0A%20%20%20%20%20%20%20%20const%20name%20%3D%20%60%24%7Btarget.getName()%7D%24%7Btarget.isOriginal%20%3F%20%22%22%20%3A%20%22%20(Clone)%22%7D%60%3B%0D%0A%20%20%20%20%20%20%20%20if%20(target.isTouchingObject(thisSprite)%20%26%26%20name%20!%3D%3D%20thisSprite)%20list.push(name)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20JSON.stringify(list)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getNeighbors(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20circ%20%3D%20Scratch.Cast.toNumber(args.DIAMETER)%3B%0D%0A%20%20%20%20%20%20let%20list%20%3D%20%5B%5D%2C%20pos%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20if%20(args.SPRITE%20%3D%3D%3D%20%22_mouse_%22)%20pos%20%3D%20%5Butil.ioQuery(%22mouse%22%2C%20%22getScratchX%22)%2C%20util.ioQuery(%22mouse%22%2C%20%22getScratchY%22)%2C%20%22%22%5D%3B%0D%0A%20%20%20%20%20%20else%20if%20(args.SPRITE%20%3D%3D%3D%20%22_myself_%22)%20pos%20%3D%20%5Butil.target.x%2C%20util.target.y%2C%20util.target.id%5D%3B%0D%0A%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20nameTarget%20%3D%20runtime.getSpriteTargetByName(args.SPRITE)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(!nameTarget)%20return%20%22%5B%5D%22%3B%0D%0A%20%20%20%20%20%20%20%20pos%20%3D%20%5BnameTarget.x%2C%20nameTarget.y%2C%20nameTarget.id%5D%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20targets%20%3D%20runtime.targets%3B%0D%0A%20%20%20%20%20%20for%20(let%20index%20%3D%201%3B%20index%20%3C%20targets.length%3B%20index%2B%2B)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20target%20%3D%20targets%5Bindex%5D%3B%0D%0A%20%20%20%20%20%20%20%20const%20dx%20%3D%20pos%5B0%5D%20-%20target.x%3B%0D%0A%20%20%20%20%20%20%20%20const%20dy%20%3D%20pos%5B1%5D%20-%20target.y%3B%0D%0A%20%20%20%20%20%20%20%20if%20(Math.sqrt((dx%20*%20dx)%20%2B%20(dy%20*%20dy))%20%3C%3D%20circ%20%26%26%20target.id%20!%3D%3D%20pos%5B2%5D)%20list.push(%60%24%7Btarget.getName()%7D%24%7Btarget.isOriginal%20%3F%20%22%22%20%3A%20%22%20(Clone)%22%7D%60)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20JSON.stringify(list)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20colorAtPosition(args)%20%7B%20return%20this.colorTouching(Scratch.Cast.toNumber(args.x)%2C%20Scratch.Cast.toNumber(args.y))%20%7D%0D%0A%20%20%20%20colorTouchingSprite(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20if%20(args.SPRITE%20%3D%3D%3D%20%22_mouse_%22)%20return%20this.colorTouching(util.ioQuery(%22mouse%22%2C%20%22getScratchX%22)%2C%20util.ioQuery(%22mouse%22%2C%20%22getScratchY%22))%3B%0D%0A%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20target%20%3D%20args.SPRITE%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target%20%3A%20runtime.getSpriteTargetByName(args.SPRITE)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(!target)%20return%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20const%20wasVisible%20%3D%20target.visible%3B%0D%0A%20%20%20%20%20%20%20%20target.setVisible(false)%3B%0D%0A%20%20%20%20%20%20%20%20const%20hex%20%3D%20this.colorTouching(target.x%2C%20target.y)%3B%0D%0A%20%20%20%20%20%20%20%20target.setVisible(wasVisible)%3B%0D%0A%20%20%20%20%20%20%20%20return%20hex%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20boolean(args)%20%7B%20return%20(Scratch.Cast.toBoolean(args.STRING)%20%26%26%20args.STRING%20!%3D%3D%20undefined)%20%7D%0D%0A%0D%0A%20%20%20%20getAllString(args)%20%7B%0D%0A%20%20%20%20%20%20let%20regex%3B%0D%0A%20%20%20%20%20%20switch%20(args.TEXT)%20%7B%0D%0A%20%20%20%20%20%20%20%20case%20%22numbers%22%3A%20%7Bregex%20%3D%20%2F%5B%5E0-9%5D%2Fg%3B%20break%20%7D%0D%0A%20%20%20%20%20%20%20%20case%20%22special%20characters%22%3A%20%7Bregex%20%3D%20%2F%5BA-Za-z0-9%5D%2Fg%3B%20break%20%7D%0D%0A%20%20%20%20%20%20%20%20default%3A%20regex%20%3D%20%2F%5B%5EA-Za-z%5D%2Fg%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20return%20args.STRING.replace(regex%2C%20%22%22)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20advancedAsk(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20wasVisible%20%3D%20util.target.visible%3B%0D%0A%20%20%20%20%20%20if%20(!util.target.isStage%20%26%26%20args.THING%20%3D%3D%3D%20%22stage%22)%20util.target.setVisible(false)%3B%0D%0A%20%20%20%20%20%20askAs%20%3D%20args.THING%3B%0D%0A%20%20%20%20%20%20return%20new%20Promise(resolve%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20runtime.ext_scratch3_sensing.askAndWait(args%2C%20util)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(!util.target.isStage%20%26%26%20wasVisible)%20util.target.setVisible(true)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(publicVars.askStuff)%20this.setAtt(publicVars.askStuff)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(publicVars.askType)%20this.setAskType(publicVars.askType)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(args.WAIT%20%3D%3D%3D%20%22continue%22)%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20else%20runtime.once(%22ANSWER%22%2C%20()%20%3D%3E%20%7B%20resolve()%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20advancedAskReporter(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20return%20this.advancedAsk(args%2C%20util).then(()%20%3D%3E%20%7B%20return%20runtime.ext_scratch3_sensing.getAnswer()%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20stopAsking()%20%7B%0D%0A%20%20%20%20%20%20runtime.emit(%22ANSWER%22%2C%20this.currentTyped())%3B%0D%0A%20%20%20%20%20%20runtime.emit(%22QUESTION%22%2C%20null)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20currentTyped()%20%7B%0D%0A%20%20%20%20%20%20let%20box%20%3D%20document.querySelector(typeof%20scaffolding%20!%3D%3D%20%22undefined%22%20%3F%20%60input%5Bclass%3D%22sc-question-input%22%5D%60%20%3A%20%60div%5Bclass*%3D%22question%22%5D%20%5Bclass%5E%3D%22input_input-form%22%5D%60)%3B%0D%0A%20%20%20%20%20%20return%20box%20%3F%20box.value%20%3A%20%22%22%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20isAsking()%20%7B%20return%20Scratch.Cast.toBoolean(document.querySelector(%60div%5Bclass*%3D%22question-input%22%5D%60))%20%7D%0D%0A%0D%0A%20%20%20%20setAtt(args)%20%7B%0D%0A%20%20%20%20%20%20let%20box%20%3D%20document.querySelector(%60div%5Bclass*%3D%22question%22%5D%60)%3B%0D%0A%20%20%20%20%20%20if%20(!box)%20return%20publicVars.askStuff%20%3D%20args%3B%0D%0A%20%20%20%20%20%20const%20canvas%20%3D%20getComputedStyle(render.canvas)%3B%0D%0A%20%20%20%20%20%20if%20(args.width)%20box.style.width%20%3D%20%60%24%7Bargs.width%20*%20(parseInt(canvas.width)%20%2F%20480)%7Dpx%60%3B%0D%0A%20%20%20%20%20%20const%20x%20%3D%20Scratch.Cast.toNumber(args.x)%20%2B%20(parseInt(canvas.width)%20%2F%202)%20-%20(args.width%20*%20(parseInt(canvas.width)%20%2F%20480)%20%2F%202)%3B%0D%0A%20%20%20%20%20%20const%20y%20%3D%20Scratch.Cast.toNumber(args.y)%20%2B%20(parseInt(canvas.height)%20%2F%202)%20-%20(askAs%20%3D%3D%3D%20%22stage%22%20%3F%2053%20%3A%2039)%3B%0D%0A%20%20%20%20%20%20box.style.transform%20%3D%20%60translate(%24%7Bx%7Dpx%2C%20%24%7By%20*%20-1%7Dpx)%60%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setAskType(args)%20%7B%0D%0A%20%20%20%20%20%20let%20box%20%3D%20document.querySelector(typeof%20scaffolding%20!%3D%3D%20%22undefined%22%20%3F%20%60input%5Bclass%3D%22sc-question-input%22%5D%60%20%3A%20%60div%5Bclass*%3D%22question%22%5D%20%5Bclass%5E%3D%22input_input-form%22%5D%60)%3B%0D%0A%20%20%20%20%20%20if%20(!box)%20return%20publicVars.askType%20%3D%20args%3B%0D%0A%20%20%20%20%20%20const%20element%20%3D%20document.getElementById(%22SP-input_select%22)%3B%0D%0A%20%20%20%20%20%20if%20(element)%20box.parentNode.removeChild(element)%3B%0D%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22dropdown%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20width%20%3D%20box.parentNode.getBoundingClientRect().width%3B%0D%0A%20%20%20%20%20%20%20%20let%20dropdown%20%3D%20document.createElement(%22select%22)%3B%0D%0A%20%20%20%20%20%20%20%20dropdown.id%20%3D%20%22SP-input_select%22%3B%0D%0A%20%20%20%20%20%20%20%20dropdown.setAttribute(%22style%22%2C%20%60background%3A%20%23fff%3B%20color%3A%20%23505050%3B%20width%3A%20%24%7Bwidth%20-%2040%7Dpx%3B%20display%3A%20block%3B%20border-width%3A%202px%3B%20border-color%3A%20%23D9D9D9%3B%20transform%3A%20translate(0px%2C3px)%3B%60)%3B%0D%0A%20%20%20%20%20%20%20%20args.LIST.forEach(item%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20let%20option%20%3D%20document.createElement(%22option%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20option.value%20%3D%20item%3B%20option.text%20%3D%20item%3B%0D%0A%20%20%20%20%20%20%20%20%20%20dropdown.appendChild(option)%3B%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20box.parentNode.appendChild(dropdown)%3B%0D%0A%20%20%20%20%20%20%20%20box.style.display%20%3D%20%22none%22%3B%0D%0A%20%20%20%20%20%20%20%20box.value%20%3D%20dropdown.value%3B%0D%0A%20%20%20%20%20%20%20%20dropdown.addEventListener(%22change%22%2C%20()%20%3D%3E%20%7B%20box.value%20%3D%20dropdown.value%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20const%20button%20%3D%20document.querySelector(%60button%5Bclass*%3D%22question-submit-button%22%5D%60)%3B%0D%0A%20%20%20%20%20%20%20%20button.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20setTimeout(()%20%3D%3E%20%7B%20runtime.ext_scratch3_sensing._answer%20%3D%20box.value%20%7D%2C%2010)%3B%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20box.type%20%3D%20args.TYPE%3B%0D%0A%20%20%20%20%20%20%20%20box.pattern%20%3D%20args.TYPE%20%3D%3D%3D%20%22number%22%20%3F%20%22%5B0-9%5D*%22%20%3A%20%22none%22%3B%0D%0A%20%20%20%20%20%20%20%20box.style.display%20%3D%20%22block%22%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20setAskType2(args%2C%20util)%20%7B%20this.setAskType(%7B...args%2C%20TYPE%20%3A%20%22dropdown%22%2C%20LIST%20%3A%20this.look4List(args.TYPE%2C%20util)%20%7D)%20%7D%0D%0A%20%20%20%20setAskType3(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20array%20%3D%20JSON.parse(args.TYPE)%3B%0D%0A%20%20%20%20%20%20%20%20if%20(array.length%20%3E%200)%20this.setAskType(%7B...args%2C%20TYPE%20%3A%20%22dropdown%22%2C%20LIST%20%3A%20array%20%7D)%0D%0A%20%20%20%20%20%20%7D%20catch%20%7B%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20isScreen(args)%20%7B%0D%0A%20%20%20%20%20%20const%20values%20%3D%20%5Brender.canvas.getBoundingClientRect().width%2C%20runtime.stageWidth%5D%3B%0D%0A%20%20%20%20%20%20return%20args.SCREEN%20%3D%3D%3D%20%22fullscreen%22%20%3F%20values%5B0%5D%20%3E%20values%5B1%5D%20%3A%20values%5B0%5D%20%3C%20values%5B1%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20screenOff()%20%7B%20return%20render.canvas.getBoundingClientRect().width%20%2F%20runtime.stageWidth%20%7D%0D%0A%0D%0A%20%20%20%20averageMicrophoneLoudness()%20%7B%0D%0A%20%20%20%20%20%20if%20(loudnessArray.length%20%3E%3D%2030)%20loudnessArray%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20loudnessArray.push(runtime.ext_scratch3_sensing.getLoudness())%3B%0D%0A%20%20%20%20%20%20let%20sum%20%3D%20loudnessArray.reduce((accumulator%2C%20curValue)%20%3D%3E%20accumulator%20%2B%20curValue%2C%200)%3B%0D%0A%20%20%20%20%20%20return%20Math.round((sum%20%2F%20loudnessArray.length)%20*%20100)%20%2F%20100%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getSpriteName(_%2C%20util)%20%7B%20return%20util.target.getName()%20%7D%0D%0A%0D%0A%20%20%20%20allLayers()%20%7B%20return%20render._drawList.length%20-%201%20%7D%0D%0A%0D%0A%20%20%20%20spriteDragMode(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20target%20%3D%20args.SPRITE%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target%20%3A%20runtime.getSpriteTargetByName(args.SPRITE)%3B%0D%0A%20%20%20%20%20%20if%20(target)%20target.setDraggable(args.DRAG%20%3D%3D%3D%20%22draggable%22)%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20spriteDragging(args%2C%20util)%20%7B%0D%0A%20%20%20%20%20%20const%20target%20%3D%20args.SPRITE%20%3D%3D%3D%20%22_myself_%22%20%3F%20util.target%20%3A%20runtime.getSpriteTargetByName(args.SPRITE)%3B%0D%0A%20%20%20%20%20%20if%20(target)%20return%20target%5Bargs.DRAG%20%3D%3D%3D%20%22draggable%22%20%3F%20%22draggable%22%20%3A%20%22dragging%22%5D%3B%0D%0A%20%20%20%20%20%20return%20false%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20Depreciated%0D%0A%20%20%20%20toggleMicrophone()%20%7B%20console.warn(%22Depreciated%20Block%22)%20%7D%0D%0A%20%20%20%20monitorScrollWheelLimited(args)%20%7B%20return%20Math.max(Math.min(scrollDist%2C%20Scratch.Cast.toNumber(args.MAX))%2C%20Scratch.Cast.toNumber(args.MIN))%20%7D%0D%0A%20%20%7D%0D%0A%0D%0A%20%20Scratch.extensions.register(new%20HyperSenseSP())%3B%0D%0A%7D)(Scratch)%3B%0D%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Files%20Expanded%0A%2F%2F%20ID%3A%20filesExpanded%0A%2F%2F%20Description%3A%20Read%2C%20upload%2C%20and%20download%20files.%0A%2F%2F%20By%3A%20SharkPool%2C%20GarboMuffin%2C%20Drago%20Cuven%2C%200znzw%2C%20and%20FurryR%0A%0A%2F%2F%20Version%201.6.0%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22Files%20Expanded%20must%20be%20run%20unsandboxed%22)%3B%0A%0A%20%20const%20menuIconURI%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMzMuMTY0IiBoZWlnaHQ9IjEzMy4xNjQiIHZpZXdCb3g9IjAgMCAxMzMuMTY0IDEzMy4xNjQiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCI%2BPHBhdGggZD0iTTMgNjYuNTgyQzMgMzEuNDY3IDMxLjQ2NyAzIDY2LjU4MiAzczYzLjU4MiAyOC40NjcgNjMuNTgyIDYzLjU4Mi0yOC40NjcgNjMuNTgyLTYzLjU4MiA2My41ODJTMyAxMDEuNjk3IDMgNjYuNTgyeiIgZmlsbD0iI2ZjYjEwMyIgc3Ryb2tlPSIjYmY4YjExIiBzdHJva2Utd2lkdGg9IjYiLz48cGF0aCBkPSJNOTkuODkyIDQ5LjkyN3Y0OS45NjRjMCA0LjU4LTMuNzQ4IDguMzI4LTguMzI4IDguMzI4SDQxLjU1OGMtNC41OCAwLTguMjg1LTMuNzQ4LTguMjg1LTguMzI4bC4wNDEtNjYuNjE4YzAtNC41OCAzLjcwNi04LjMyOCA4LjI4Ni04LjMyOGgzMy4zMXoiIGZpbGw9Im5vbmUiIHN0cm9rZS1vcGFjaXR5PSIuMTQ5IiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNOTkuODkyIDQ5LjkyN3Y0OS45NjRjMCA0LjU4LTMuNzQ4IDguMzI4LTguMzI4IDguMzI4SDQxLjU1OGMtNC41OCAwLTguMjg1LTMuNzQ4LTguMjg1LTguMzI4bC4wNDEtNjYuNjE4YzAtNC41OCAzLjcwNi04LjMyOCA4LjI4Ni04LjMyOGgzMy4zMXoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNzAuNzIyIDU0LjExNVYzMS4xNjdsMjIuOTQ3IDIyLjk0OHoiIGZpbGw9IiNmY2IxMDMiLz48cGF0aCBkPSJNODQuNjY4IDY5LjkxNGMtLjAyLjA4OC0uMDM2LjE3NS0uMDYyLjI2Mi0uMDc3LjMyNC0uMjM2IDEuMDktLjM5NiAyLjU4N3EuMDAxLjAzOC0uMDA1LjA2MWMuODggMy41MzgtLjYwMiA1LjY5Mi0xLjU4NCA2LjY3NGEyIDIgMCAwIDEtLjIuMTljLS45NjIuODc1LTIuNjQzIDEuOTE4LTUuMTUyIDEuOTE4YTcuNjUgNy42NSAwIDAgMS0zLjQzNS0uNzg2Yy4wMjYgMS40MDMuMDQxIDMuMzM3LjA0MSA2LjAyYTYuOSA2LjkgMCAwIDEgMi40OTQgMS41MzggNy4xIDcuMSAwIDAgMSAyLjIxIDUuMTY3YzAgMi45MS0xLjY3NSA1LjQ0LTQuMzc1IDYuNTk3cS0uMTAzLjA0OC0uMjA1LjA4OGMtLjkwNS4zNDQtMS45MjMuNTE0LTMuMTE2LjUxNC0uNDMyIDAtLjg5NS0uMDItMS4zOTktLjA2N2ExOCAxOCAwIDAgMC0xLjI5NS4wMDVjLS45NzIuMTA4LTIuMzQuMjE2LTQuMTcuMzE5LS4wMzYgMC0uMDcyLjAwNS0uMTE0LjAwNXEtLjM2LjAxNS0uNjk5LjAxNWMtMy4yNzUgMC01LjY2Ni0xLjAzOC03LjExLTMuMDhxLS4wNDYtLjA2LS4wODMtLjEyM2MtMS40Ny0yLjE5NS0xLjUxMi00Ljk3Mi0uMTEzLTcuMjRxLjAxNy0uMDM1LjA0MS0uMDcxYy44OS0xLjM5OSAyLjE5LTIuMzk2IDMuODc3LTIuOTgzLjAyLS45OTIuMDE1LTIuMjM2LS4wMTYtMy43MTJhNy41IDcuNSAwIDAgMS0yLjg5LjU1NWMtMi44NjMgMC01LjIyOC0xLjcwMS02LjA1MS00LjI4OC0uMTctLjUyNC0uMzMtMS4yOS0uNy0zLjAxOGEyIDIgMCAwIDEtLjAzNS0uMTg1bC0uNzYxLTQuMjUyYTcgNyAwIDAgMC0uMTAzLS4zMjRjLS4zOTYtMS4xMjYtLjU4MS0yLjA4My0uNTgxLTMuMDA4IDAtMS4xNDcuMzM0LTIuODggMS45MTgtNC42MDcuNzk3LS44NzQgMi4yNDctMi4wMDUgNC41ODEtMi4zN3EuNDMzLS4wNzEuODc0LS4wNzJoNS42ODdxLjE5MiAwIC4zODUuMDE1YTcyIDcyIDAgMCAwIDUuNzgtLjAwNSA4MyA4MyAwIDAgMCA2LjkzLS41OTZjLjI1OC0uMDgzLjUzNi0uMTY1LjgzNC0uMjM3LjI4My0uMDcyLjU3LS4xMTguODU4LS4xNSAyLjE5LS4yIDQuMjMyLjQzMyA1LjgyIDEuNzkgMS45NyAxLjY5MiAyLjg0IDQuMjUyIDIuMzIgNi44NTQiIGZpbGw9IiNiZjhiMTEiLz48cGF0aCBkPSJNNzkuMTIxIDY4LjgwNnEtLjMxNiAxLjI2Ni0uNTQzIDMuNDM3LS4wOSAxLjA4Ni4wOSAxLjc2NC4zMTYgMS4xMzEtLjA0NCAxLjQ5My0uNDk5LjQ1MS0xLjM1Ny40NTItLjk5NiAwLTEuMzEyLS41OTJBNDEgNDEgMCAwIDEgNzYgNzEuOTQzcS4wOS0xLjk2LjA5LTIuMDUtLjA0NSAwLS4xMzUtLjA5Mi00LjIwNy4xODMtNy45MTUuNTQ1LS4wOS40NTMgMCAxLjQ1LjE4IDEuNDA0LjE4IDEuNjMtLjE4IDEuNDA2LS4xOCA0LjE3LjE4IDEuMTc5LjE4IDEwLjEwNnYzLjMwOXEwIC43Ny4yMjUgMS4wODdoMi43NzdxLjc2Mi0uMDkgMS4yMzIuMzYyLjQ3LjQ1My40NyAxLjA4NSAwIC45OTQtLjk1IDEuNDAzLS41ODguMjI1LTIuMDguMDktLjcyMy0uMDQ1LTIuMTI2IDAtMS4yNjUuMTU3LTQuMDcuMzE2LTIuNDQzLjA5LTIuOTg1LS42NzgtLjM2My0uNTQyIDAtMS4xMy42MzItLjk5NSAzLjMwMi0uOTk1Ljk0OCAwIDEuMTc1LS4xNTguMjI2LS4xNi4yMjYtLjYxVjg5LjAzcS4xMzUtMi4zMDIgMC02Ljg2MS0uMTgtNi41NDQuMTgxLTExLjUwOWwtLjEzNy0uMTM2cS0xLjYzNy4wOS01LjI3NS0uMDktLjQxIDAtMi43NzQuMTgxLjU4NyA0LjExNy43MjMgNi4xOTYgMCAuMjcyLS4wOSAxLjIyMS0uMDQ2LjY3OC0xLjEzMS42NzktLjU4OSAwLS42NzgtLjQwNC0uMDQ2LS4wOS0uNTQzLTIuNDIybC0uNzY5LTQuMzA2cTAtLjE3OS0uMzE2LTEuMTIxLS4yNy0uNzY0LS4yNy0xLjE2Ni0uMDAxLS4zMTUuNDMtLjc4NS40My0uNDcxIDEuMjg5LS42MDZoNS42MDhxMy42NjMuMTM1IDYuNTEyIDBhODggODggMCAwIDAgOC4wNS0uNzI0cS4yNzMtLjEzNS44MTQtLjI3Ljk5NS0uMDkgMS42MjkuNDUyLjYzMy41NC40NTIgMS40NDciIGZpbGw9IiNmZmYiLz48L2c%2BPC9zdmc%2B%22%3B%0A%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%20%20const%20runtime%20%3D%20vm.runtime%3B%0A%20%20let%20selectorOptions%20%3D%20%7B%0A%20%20%20%20border%3A%20%22%23888%22%2C%20text%3A%20%22%23000%22%2C%20outer%3A%20%22%23fff%22%2C%0A%20%20%20%20sizeFont%3A%201.5%2C%20borderRadius%3A%2016%2C%20borderType%3A%20%22dashed%22%2C%0A%20%20%20%20font%3A%20%22inherit%22%2C%20shadow%3A%200.5%2C%20image%3A%20%22%22%2C%20imageScale%3A%20100%2C%0A%20%20%20%20textV%3A%20%22Select%20or%20drop%20file%22%2C%20fontWeight%3A%2040%2C%20letterSpacing%3A%20%22normal%22%0A%20%20%7D%3B%0A%20%20const%20builtInFonts%20%3D%20%5B%0A%20%20%20%20%22Sans%20Serif%22%2C%20%22Serif%22%2C%20%22Handwriting%22%2C%0A%20%20%20%20%22Marker%22%2C%20%22Curly%22%2C%20%22Pixel%22%2C%20%22Scratch%22%2C%20%22inherit%22%0A%20%20%5D%3B%0A%20%20const%20AS_TEXT%20%3D%20%22text%22%2C%20AS_DATA_URL%20%3D%20%22url%22%2C%20AS_HEX%20%3D%20%22hex%22%3B%0A%20%20const%20AS_BASE64%20%3D%20%22base64%22%2C%20AS_BUFFER%20%3D%20%22arrayBuffer%22%3B%0A%0A%20%20const%20MODE_MODAL%20%3D%20%22modal%22%3B%0A%20%20const%20MODE_IMMEDIATELY_SHOW_SELECTOR%20%3D%20%22selector%22%3B%0A%20%20const%20MODE_ONLY_SELECTOR%20%3D%20%22only-selector%22%3B%0A%20%20const%20ALL_MODES%20%3D%20%5BMODE_MODAL%2C%20MODE_IMMEDIATELY_SHOW_SELECTOR%2C%20MODE_ONLY_SELECTOR%5D%3B%0A%20%20let%20openFileSelectorMode%20%3D%20MODE_MODAL%3B%0A%0A%20%20let%20storedFiles%20%3D%20%7B%7D%3B%0A%20%20let%20FileName%20%3D%20%22%22%2C%20FileSize%20%3D%20%220kb%22%2C%20RawFileSize%20%3D%20%220%22%2C%20fileDate%20%3D%20%22%22%2C%20lastData%20%3D%20%22%22%3B%0A%20%20let%20enableVis%20%3D%20true%2C%20openModals%20%3D%200%3B%0A%0A%20%20const%20isCancelEventSupported%20%3D%20(input)%20%3D%3E%20%7B%0A%20%20%20%20if%20(%22oncancel%22%20in%20input)%20return%20true%3B%0A%20%20%20%20return%20navigator.userAgent.includes(%22Firefox%22)%3B%0A%20%20%7D%3B%0A%0A%20%20const%20formatFileSize%20%3D%20(size)%20%3D%3E%20%7B%0A%20%20%20%20const%20units%20%3D%20%5B%22B%22%2C%20%22KB%22%2C%20%22MB%22%2C%20%22GB%22%2C%20%22TB%22%5D%3B%0A%20%20%20%20let%20i%20%3D%200%3B%0A%20%20%20%20while%20(size%20%3E%3D%201024%20%26%26%20i%20%3C%20units.length%20-%201)%20%7B%0A%20%20%20%20%20%20size%20%2F%3D%201024%3B%0A%20%20%20%20%20%20i%2B%2B%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20%60%24%7Bsize.toFixed(2)%7D%20%24%7Bunits%5Bi%5D%7D%60%3B%0A%20%20%7D%3B%0A%0A%20%20function%20base64ToHex(str%2C%20delim)%20%7B%0A%20%20%20%20const%20raw%20%3D%20atob(str)%3B%0A%20%20%20%20let%20result%20%3D%20%22%22%3B%0A%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%20raw.length%3B%20i%2B%2B)%20%7B%0A%20%20%20%20%20%20const%20hex%20%3D%20raw.charCodeAt(i).toString(16)%3B%0A%20%20%20%20%20%20result%20%2B%3D%20delim.toString()%20%2B%20(hex.length%20%3D%3D%3D%202%20%3F%20hex%20%3A%20%220%22%20%2B%20hex)%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20result.toUpperCase()%3B%0A%20%20%7D%0A%0A%20%20function%20bufferToBase64(buffer)%20%7B%0A%20%20%20%20var%20binary%20%3D%20%22%22%3B%0A%20%20%20%20var%20bytes%20%3D%20new%20Uint8Array(buffer)%3B%0A%20%20%20%20var%20len%20%3D%20bytes.byteLength%3B%0A%20%20%20%20for%20(var%20i%20%3D%200%3B%20i%20%3C%20len%3B%20i%2B%2B)%20%7B%20binary%20%2B%3D%20String.fromCharCode(%20bytes%5B%20i%20%5D%20)%20%7D%0A%20%20%20%20return%20btoa(binary)%3B%0A%20%20%7D%0A%0A%20%20const%20showFilePrompt%20%3D%20async%20(accept%2C%20as%2C%20override)%20%3D%3E%20new%20Promise(async%20(_resolve)%20%3D%3E%20%7B%0A%20%20%20%20openModals%2B%2B%3B%0A%20%20%20%20const%20callback%20%3D%20(text)%20%3D%3E%20%7B%0A%20%20%20%20%20%20let%20finalTxt%20%3D%20text%3B%0A%20%20%20%20%20%20if%20(override%20%3D%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20if%20(%5BAS_HEX%2C%20AS_BASE64%5D.includes(as))%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20uri%20%3D%20finalTxt.split(%22%2C%22)%3B%0A%20%20%20%20%20%20%20%20%20%20finalTxt%20%3D%20uri.splice(1%2C%20uri.length).join(%22%2C%22)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(as%20%3D%3D%3D%20AS_HEX)%20finalTxt%20%3D%20base64ToHex(finalTxt%2C%20%22%20%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20lastData%20%3D%20finalTxt%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20openModals--%3B%0A%20%20%20%20%20%20_resolve(finalTxt)%3B%0A%20%20%20%20%20%20vm.renderer.removeOverlay(outer)%3B%0A%20%20%20%20%20%20runtime.off(%22PROJECT_STOP_ALL%22%2C%20handleProjectStopped)%3B%0A%20%20%20%20%20%20document.body.removeEventListener(%22keydown%22%2C%20handleKeyDown)%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20let%20isReadingFile%20%3D%20false%3B%0A%20%20%20%20const%20readFile%20%3D%20(file)%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20(isReadingFile)%20return%3B%0A%20%20%20%20%20%20isReadingFile%20%3D%20true%3B%0A%20%20%20%20%20%20const%20reader%20%3D%20new%20FileReader()%3B%0A%20%20%20%20%20%20reader.onload%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20FileName%20%3D%20file.name%3B%0A%20%20%20%20%20%20%20%20FileSize%20%3D%20formatFileSize(file.size)%3B%0A%20%20%20%20%20%20%20%20RawFileSize%20%3D%20file.size%3B%0A%20%20%20%20%20%20%20%20const%20rawDate%20%3D%20new%20Date(file.lastModified)%3B%0A%20%20%20%20%20%20%20%20fileDate%20%3D%20rawDate.toLocaleString()%3B%0A%20%20%20%20%20%20%20%20callback(reader.result)%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20reader.onerror%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20console.error(%22Failed%20to%20read%20file%20as%20text%22%2C%20reader.error)%3B%0A%20%20%20%20%20%20%20%20callback(%22%22)%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20if%20(override%20!%3D%3D%20undefined)%20callback(file)%3B%0A%20%20%20%20%20%20else%20if%20(as%20%3D%3D%3D%20AS_TEXT)%20reader.readAsText(file)%3B%0A%20%20%20%20%20%20else%20if%20(as%20%3D%3D%3D%20AS_BUFFER)%20reader.readAsArrayBuffer(file)%3B%0A%20%20%20%20%20%20else%20reader.readAsDataURL(file)%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20const%20handleKeyDown%20%3D%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20(e.key%20%3D%3D%3D%20%22Escape%22)%20%7B%0A%20%20%20%20%20%20%20%20e.stopPropagation()%3B%0A%20%20%20%20%20%20%20%20e.preventDefault()%3B%0A%20%20%20%20%20%20%20%20callback(%22%22)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20document.body.removeEventListener(%22keydown%22%2C%20handleKeyDown)%3B%0A%20%20%20%20document.body.addEventListener(%22keydown%22%2C%20handleKeyDown%2C%20%7B%20capture%3A%20true%20%7D)%3B%0A%20%20%20%20const%20handleProjectStopped%20%3D%20()%20%3D%3E%20%7B%20callback(%22%22)%20%7D%3B%0A%20%20%20%20runtime.on(%22PROJECT_STOP_ALL%22%2C%20handleProjectStopped)%3B%0A%20%20%20%20const%20handleOverride%20%3D%20async%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20let%20fileInfo%3B%0A%20%20%20%20%20%20if%20(override%20%3D%3D%3D%20undefined)%20input.click()%3B%0A%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(override%20%3D%3D%3D%20%22folder%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20fileInfo%20%3D%20await%20window.showDirectoryPicker(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20multiple%3A%20false%2C%20types%3A%20%5B%7B%20accept%3A%20%7B%20%22*%2F*%22%20%3A%20%5B%5D%20%7D%7D%5D%0A%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%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20fileInfo%20%3D%20await%20window.showOpenFilePicker(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20multiple%3A%20false%2C%20types%3A%20%5B%7B%20accept%3A%20%7B%20%22*%2F*%22%20%3A%20accept%20%7D%7D%5D%0A%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%7D%0A%20%20%20%20%20%20%20%20%20%20callback(fileInfo)%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20%7B%20callback(%22%22)%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20const%20INITIAL_BORDER_COLOR%20%3D%20selectorOptions.border%3B%0A%20%20%20%20const%20DROPPING_BORDER_COLOR%20%3D%20%22%2303a9fc%22%3B%0A%20%20%20%20const%20outer%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20outer.style.pointerEvents%20%3D%20%22auto%22%3B%0A%20%20%20%20outer.style.width%20%3D%20%22100%25%22%3B%0A%20%20%20%20outer.style.height%20%3D%20%22100%25%22%3B%0A%20%20%20%20outer.style.display%20%3D%20%22flex%22%3B%0A%20%20%20%20outer.style.alignItems%20%3D%20%22center%22%3B%0A%20%20%20%20outer.style.justifyContent%20%3D%20%22center%22%3B%0A%20%20%20%20outer.style.background%20%3D%20%60rgba(0%2C%200%2C%200%2C%20%24%7BselectorOptions.shadow%7D)%60%3B%0A%20%20%20%20outer.style.color%20%3D%20selectorOptions.text%3B%0A%20%20%20%20outer.style.colorScheme%20%3D%20%22light%22%3B%0A%20%20%20%20if%20(override%20%3D%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20outer.addEventListener(%22dragover%22%2C%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(e.dataTransfer.types.includes(%22Files%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20e.preventDefault()%3B%0A%20%20%20%20%20%20%20%20%20%20e.dataTransfer.dropEffect%20%3D%20%22copy%22%3B%0A%20%20%20%20%20%20%20%20%20%20modal.style.borderColor%20%3D%20DROPPING_BORDER_COLOR%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20outer.addEventListener(%22dragleave%22%2C%20()%20%3D%3E%20%7B%20modal.style.borderColor%20%3D%20INITIAL_BORDER_COLOR%20%7D)%3B%0A%20%20%20%20%20%20outer.addEventListener(%22drop%22%2C%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20const%20file%20%3D%20e.dataTransfer.files%5B0%5D%3B%0A%20%20%20%20%20%20%20%20if%20(file)%20%7B%0A%20%20%20%20%20%20%20%20%20%20e.preventDefault()%3B%0A%20%20%20%20%20%20%20%20%20%20readFile(file)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20outer.addEventListener(%22click%22%2C%20(e)%20%3D%3E%20%7B%20if%20(e.target%20%3D%3D%3D%20outer)%20callback(%22%22)%20%7D)%3B%0A%0A%20%20%20%20const%20modal%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20modal.style.boxShadow%20%3D%20%220%200%2010px%20-5px%20currentColor%22%3B%0A%20%20%20%20modal.style.cursor%20%3D%20%22pointer%22%3B%0A%20%20%20%20modal.style.font%20%3D%20selectorOptions.font%3B%0A%20%20%20%20modal.style.fontFamily%20%3D%20selectorOptions.font%3B%0A%20%20%20%20modal.style.background%20%3D%20selectorOptions.image%20%3F%20selectorOptions.image%20%3A%20selectorOptions.outer%3B%0A%20%20%20%20modal.style.backgroundSize%20%3D%20selectorOptions.imageScale%20%2B%20%22%25%22%3B%0A%20%20%20%20modal.style.padding%20%3D%20%2216px%22%3B%0A%20%20%20%20modal.style.borderRadius%20%3D%20%60%24%7BselectorOptions.borderRadius%7Dpx%60%3B%0A%20%20%20%20modal.style.border%20%3D%20%608px%20%24%7BselectorOptions.borderType%7D%20%24%7BINITIAL_BORDER_COLOR%7D%60%3B%0A%20%20%20%20modal.style.position%20%3D%20%22relative%22%3B%0A%20%20%20%20modal.style.textAlign%20%3D%20%22center%22%3B%0A%20%20%20%20modal.addEventListener(%22click%22%2C%20async%20()%20%3D%3E%20%7B%20await%20handleOverride()%20%7D)%3B%0A%20%20%20%20modal.focus()%3B%0A%20%20%20%20outer.appendChild(modal)%3B%0A%0A%20%20%20%20const%20input%20%3D%20document.createElement(%22input%22)%3B%0A%20%20%20%20input.type%20%3D%20%22file%22%3B%0A%20%20%20%20input.accept%20%3D%20accept%3B%0A%20%20%20%20if%20(override%20%3D%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20input.addEventListener(%22change%22%2C%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20const%20file%20%3D%20e.target.files%5B0%5D%3B%0A%20%20%20%20%20%20%20%20if%20(file)%20readFile(file)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20title%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20title.textContent%20%3D%20selectorOptions.textV%3B%0A%20%20%20%20title.style.color%20%3D%20selectorOptions.text%3B%0A%20%20%20%20title.style.fontSize%20%3D%20%60%24%7BselectorOptions.sizeFont%7Dem%60%3B%0A%20%20%20%20title.style.fontWeight%20%3D%20%20selectorOptions.fontWeight%20*%209%3B%0A%20%20%20%20title.style.letterSpacing%20%3D%20%60%24%7BselectorOptions.letterSpacing%7Dpx%60%3B%0A%20%20%20%20title.style.marginBottom%20%3D%20%228px%22%3B%0A%20%20%20%20modal.appendChild(title)%3B%0A%0A%20%20%20%20const%20subtitle%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20subtitle.textContent%20%3D%20%60Accepted%20Formats%3A%20%24%7Baccept%20%7C%7C%20%22any%22%7D%60%3B%0A%20%20%20%20subtitle.style.fontSize%20%3D%20%60%24%7BselectorOptions.sizeFont%20-%200.5%7Dem%60%3B%0A%20%20%20%20subtitle.style.color%20%3D%20selectorOptions.text%3B%0A%20%20%20%20subtitle.style.fontWeight%20%3D%20%20selectorOptions.fontWeight%20*%209%3B%0A%20%20%20%20subtitle.style.letterSpacing%20%3D%20%60%24%7BselectorOptions.letterSpacing%7Dpx%60%3B%0A%20%20%20%20modal.appendChild(subtitle)%3B%0A%20%20%20%20if%20(openFileSelectorMode%20%3D%3D%3D%20MODE_ONLY_SELECTOR%20%26%26%20!isCancelEventSupported(input))%20%7B%0A%20%20%20%20%20%20openFileSelectorMode%20%3D%20MODE_IMMEDIATELY_SHOW_SELECTOR%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(openFileSelectorMode%20!%3D%3D%20MODE_ONLY_SELECTOR)%20%7B%0A%20%20%20%20%20%20const%20overlay%20%3D%20vm.renderer.addOverlay(outer%2C%20%22scale%22)%3B%0A%20%20%20%20%20%20overlay.container.style.zIndex%20%3D%20%22100%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(%0A%20%20%20%20%20%20openFileSelectorMode%20%3D%3D%3D%20MODE_IMMEDIATELY_SHOW_SELECTOR%20%7C%7C%20openFileSelectorMode%20%3D%3D%3D%20MODE_ONLY_SELECTOR%0A%20%20%20%20)%20%7B%0A%20%20%20%20%20%20await%20handleOverride()%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(openFileSelectorMode%20%3D%3D%3D%20MODE_ONLY_SELECTOR)%20input.addEventListener(%22cancel%22%2C%20()%20%3D%3E%20%7B%20callback(%22%22)%20%7D)%3B%0A%20%20%7D)%3B%0A%0A%20%20const%20downloadURL%20%3D%20(url%2C%20file)%20%3D%3E%20%7B%0A%20%20%20%20const%20link%20%3D%20document.createElement(%22a%22)%3B%0A%20%20%20%20link.href%20%3D%20url%3B%0A%20%20%20%20link.download%20%3D%20file%3B%0A%20%20%20%20document.body.appendChild(link)%3B%0A%20%20%20%20link.click()%3B%0A%20%20%20%20link.remove()%3B%0A%20%20%7D%3B%0A%0A%20%20const%20downloadBlob%20%3D%20(blob%2C%20file)%20%3D%3E%20%7B%0A%20%20%20%20const%20url%20%3D%20URL.createObjectURL(blob)%3B%0A%20%20%20%20downloadURL(url%2C%20file)%3B%0A%20%20%20%20(requestIdleCallback%20%3F%3F%20setTimeout)(()%20%3D%3E%20URL.revokeObjectURL(url))%3B%0A%20%20%7D%3B%0A%0A%20%20const%20isDataURL%20%3D%20(url)%20%3D%3E%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20parsed%20%3D%20new%20URL(url)%3B%0A%20%20%20%20%20%20return%20parsed.protocol%20%3D%3D%3D%20%22data%3A%22%3B%0A%20%20%20%20%7D%20catch%20%7B%20return%20false%20%7D%0A%20%20%7D%3B%0A%0A%20%20const%20downloadUntrustedURL%20%3D%20(url%2C%20file)%20%3D%3E%20%7B%0A%20%20%20%20if%20(isDataURL(url))%20downloadURL(url%2C%20file)%3B%0A%20%20%20%20else%20return%20Scratch.fetch(url).then((res)%20%3D%3E%20res.blob()).then((blob)%20%3D%3E%20%7B%20downloadBlob(blob%2C%20file)%20%7D)%3B%0A%20%20%7D%3B%0A%0A%20%20class%20filesExpanded%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20this._showUnsafeOptions%20%3D%20false%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%22filesExpanded%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Files%20Expanded%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23fcb103%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23db9a37%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%23db8937%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%22Uploading%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%22showPicker%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22open%20a%20file%22%2C%20hideFromPalette%3A%20true%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%22showPickerExtensions%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22open%20a%20%5Bextension%5D%20file%22%2C%20hideFromPalette%3A%20true%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%20extension%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22.txt%22%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%2F%2F%20Builder%20Functions%20%5E%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%22showPickerAs%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%22open%20a%20file%20as%20%5Bas%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%20as%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22encoding%22%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%22showPickerExtensionsAs%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%22open%20a%20%5Bextension%5D%20file%20as%20%5Bas%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%20extension%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22.txt%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20as%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22encoding%22%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%22Downloading%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%22download%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%22download%20%5Btext%5D%20as%20%5Bfile%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22Hello%2C%20world!%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20file%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22save.txt%22%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%22downloadURL%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%22download%20URL%20%5Burl%5D%20as%20%5Bfile%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%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22data%3Atext%2Fplain%3Bbase64%2CSGVsbG8sIHdvcmxkIQ%3D%3D%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20file%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22save.txt%22%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%22Extra%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%22setOpenMode%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%20open%20file%20selector%20mode%20to%20%5Bmode%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%20mode%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22automaticallyOpen%22%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%22fileInfo%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%22last%20opened%20file%20%5BFORMAT%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%20FORMAT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22FILE_INFO%22%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%22modalOpen%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%20modal%20open%3F%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%09%20%20%20%20opcode%3A%20%22findFileSize%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%09%20%20%20%20text%3A%20%22%5BTYPE%5D%20file%20size%20of%20%5BFILE%5D%22%2C%0A%09%20%20%20%20arguments%3A%20%7B%0A%09%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22FILE_SIZES%22%20%7D%2C%0A%09%20%20%20%20%20%20FILE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22Hello%2C%20world!%22%20%7D%0A%09%20%20%20%20%7D%0A%09%20%20%7D%2C%0A%09%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Stored%20Files%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22checkFileAPI%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%09%20%20%20%20text%3A%20%22is%20file%20writing%20supported%3F%22%0A%09%20%20%7D%2C%0A%09%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22allStored%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%09%20%20%20%20text%3A%20%22all%20stored%20files%22%0A%09%20%20%7D%2C%0A%09%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22setStoredFile%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%20%20%20%20text%3A%20%22open%20new%20stored%20%5BFILE%5D%20file%20named%20%5BNAME%5D%20as%20%5BTYPE%5D%22%2C%0A%09%20%20%20%20arguments%3A%20%7B%0A%09%20%20%20%20%20%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my-file-1%22%20%7D%2C%0A%09%20%20%20%20%20%20FILE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22.txt%22%20%7D%2C%0A%09%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22encoding%22%20%7D%0A%09%20%20%20%20%7D%0A%09%20%20%7D%2C%0A%09%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22storedFolder%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%20%20%20%20text%3A%20%22open%20folder%20and%20store%20files%20as%20%5BTYPE%5D%20with%20name%20%5BNAME%5D%22%2C%0A%09%20%20%20%20arguments%3A%20%7B%0A%09%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22encoding%22%20%7D%2C%0A%09%20%20%20%20%20%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my-folder-1%22%20%7D%0A%09%20%20%20%20%7D%0A%09%20%20%7D%2C%0A%09%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22deleteStoredFile%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%20%20%20%20text%3A%20%22delete%20file%20%5BNAME%5D%20from%20%5BOPTION%5D%22%2C%0A%09%20%20%20%20arguments%3A%20%7B%0A%09%20%20%20%20%20%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my-file-1%22%20%7D%2C%0A%09%20%20%20%20%20%20OPTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22DELETION%22%20%7D%2C%0A%09%20%20%20%20%7D%0A%09%20%20%7D%2C%0A%09%20%20%22---%22%2C%0A%09%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22updateFile%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%20%20%20%20text%3A%20%22write%20%5BTXT%5D%20to%20stored%20file%20%5BNAME%5D%22%2C%0A%09%20%20%20%20arguments%3A%20%7B%0A%09%20%20%20%20%20%20TXT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22new%20content%22%20%7D%2C%0A%09%20%20%20%20%20%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my-file-1%22%20%7D%0A%09%20%20%20%20%7D%0A%09%20%20%7D%2C%0A%09%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22storedInfo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BFORMAT%5D%20in%20stored%20file%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%20FORMAT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22FILE_INFO%22%20%7D%2C%0A%09%20%20%20%20%20%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my-file-1%22%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%09%20%20%7B%0A%09%20%20%20%20opcode%3A%20%22moveStorage%22%2C%0A%09%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%20%20%20%20text%3A%20%22migrate%20files%20to%20CST's%20Zip%20Extension%22%2C%0A%09%20%20%7D%2C%0A%09%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Visuals%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%20func%3A%20%22toggleVis%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%60%24%7BenableVis%20%3F%20%22En%22%20%3A%20%22Dis%22%7Dable%20Customization%60%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%22resetStyle%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%20selector%20style%20to%20default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%22imageSet%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%20selector%20image%20to%20%5BIMG%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%20IMG%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fdango.png%22%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%22scaleImage%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%22scale%20selector%20image%20to%20%5BSCALE%5D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%20SCALE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%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%22borderColors%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%20selector%20%5BOPTION%5D%20color%20to%20%5BCOLOR%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%20OPTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22visualColors%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%2C%20defaultValue%3A%20%22%23ff0000%22%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%22visualsSelect%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%20selector%20%5BOPTION%5D%20to%20%5BAMT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%20OPTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22visualOptions%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2015%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%22borderTypeSet%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%20selector%20border%20type%20to%20%5BTYPE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22borderTypes%22%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%22fontSet%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%20selector%20font%20to%20%5BFONT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%22font%22%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%22textSet%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%20file%20selector%20text%20to%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22Insert%20File%20Here%22%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%22currentX%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%20selector%20%5BTHING%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20enableVis%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%20THING%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22all%22%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%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20font%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%20encoding%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%22getEncodings%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20automaticallyOpen%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22show%20modal%22%2C%20value%3A%20MODE_MODAL%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22open%20selector%20immediately%22%2C%20value%3A%20MODE_IMMEDIATELY_SHOW_SELECTOR%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22only%20show%20selector%20(unreliable)%22%2C%20value%3A%20MODE_ONLY_SELECTOR%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20all%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22border%20color%22%2C%20value%3A%20%22border%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22text%20color%22%2C%20value%3A%20%22text%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22background%20color%22%2C%20value%3A%20%22outer%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22shadow%20intensity%22%2C%20value%3A%20%22shadow%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22font%22%2C%20value%3A%20%22font%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22font%20size%22%2C%20value%3A%20%22sizeFont%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22font%20thickness%22%2C%20value%3A%20%22fontWeight%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22letter%20spacing%22%2C%20value%3A%20%22letterSpacing%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22border%20radius%22%2C%20value%3A%20%22borderRadius%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22border%20type%22%2C%20value%3A%20%22borderType%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22background%20image%22%2C%20value%3A%20%22image%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22text%22%2C%20value%3A%20%22textV%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20FILE_SIZES%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%22formatted%22%2C%20%22unformatted%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20FILE_INFO%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%22data%22%2C%20%22name%22%2C%20%22modified%20date%22%2C%20%22size%20formatted%22%2C%20%22size%20unformatted%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20DELETION%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%22storage%22%2C%20%22this%20device%22%2C%20%22both%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20visualColors%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%22border%22%2C%20%22text%22%2C%20%22background%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20visualOptions%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%22font%20size%22%2C%20%22font%20thickness%22%2C%20%22letter%20spacing%22%2C%20%22border%20radius%22%2C%20%22shadow%20intensity%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20borderTypes%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%22dotted%22%2C%20%22dashed%22%2C%20%22solid%22%2C%20%22double%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22groove%22%2C%20%22ridge%22%2C%20%22inset%22%2C%20%22outset%22%2C%20%22none%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Helper%20Funcs%0A%20%20%20%20getFonts()%20%7B%0A%20%20%20%20%20%20const%20customFonts%20%3D%20runtime.fontManager%20%3F%20runtime.fontManager.getFonts().map((i)%20%3D%3E%20(%7B%20text%3A%20i.name%2C%20value%3A%20i.family%20%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%20getEncodings(onlySafe)%20%7B%0A%20%20%20%20%20%20const%20types%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%7B%20text%3A%20%22text%22%2C%20value%3A%20AS_TEXT%20%7D%2C%20%7B%20text%3A%20%22data%3A%20URL%22%2C%20value%3A%20AS_DATA_URL%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20text%3A%20%22base64%22%2C%20value%3A%20AS_BASE64%20%7D%2C%20%7B%20text%3A%20%22hex%22%2C%20value%3A%20AS_HEX%20%7D%0A%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20if%20(this._showUnsafeOptions)%20types.push(%7B%20text%3A%20%22arrayBuffer%22%2C%20value%3A%20AS_BUFFER%20%7D)%3B%0A%20%20%20%20%20%20return%20types%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20toggleVis()%20%7B%20enableVis%20%3D%20enableVis%20%3F%20false%20%3A%20true%2C%20vm.extensionManager.refreshBlocks()%20%7D%0A%0A%20%20%20%20showPicker()%20%7B%20return%20showFilePrompt(%22%22%2C%20AS_TEXT)%20%7D%0A%0A%20%20%20%20showPickerExtensions(args)%20%7B%20return%20showFilePrompt(args.extension%2C%20AS_TEXT)%20%7D%0A%0A%20%20%20%20updateStore(name%2C%20data%2C%20metaData)%20%7B%0A%20%20%20%20%20%20const%20rawDate%20%3D%20new%20Date(metaData.lastModified)%3B%0A%20%20%20%20%20%20storedFiles%5Bname%5D.data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20size%3A%20metaData.size%2C%20sizeFormat%3A%20formatFileSize(metaData.size)%2C%0A%20%20%20%20%20%20%20%20dateFormat%3A%20rawDate.toLocaleString()%2C%20data%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20encodeData(meta%2C%20format)%20%7B%0A%20%20%20%20%20%20const%20text%20%3D%20await%20meta.text()%3B%0A%20%20%20%20%20%20const%20buffer%20%3D%20await%20meta.arrayBuffer()%3B%0A%20%20%20%20%20%20if%20(format%20%3D%3D%3D%20AS_TEXT)%20return%20text%3B%0A%20%20%20%20%20%20else%20if%20(format%20%3D%3D%3D%20AS_BUFFER)%20return%20buffer%3B%0A%20%20%20%20%20%20const%20base64%20%3D%20bufferToBase64(buffer)%3B%0A%20%20%20%20%20%20if%20(format%20%3D%3D%3D%20AS_BASE64)%20return%20base64%3B%0A%20%20%20%20%20%20else%20if%20(format%20%3D%3D%3D%20AS_DATA_URL)%20return%20%60data%3A%24%7Bmeta.type%7D%3Bcharset%3Dutf-8%3Bbase64%2C%24%7Bbase64%7D%60%3B%0A%20%20%20%20%20%20else%20if%20(format%20%3D%3D%3D%20AS_HEX)%20return%20base64ToHex(base64%2C%20%22%20%22)%3B%0A%20%20%20%20%20%20return%20text%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Block%20Funcs%20(Upload%20%26%20Download)%0A%20%20%20%20showPickerAs(args)%20%7B%20return%20showFilePrompt(%22%22%2C%20args.as)%20%7D%0A%0A%20%20%20%20showPickerExtensionsAs(args)%20%7B%20return%20showFilePrompt(args.extension%2C%20args.as)%20%7D%0A%0A%20%20%20%20download(args)%20%7B%0A%20%20%20%20%20%20downloadBlob(new%20Blob(%5BScratch.Cast.toString(args.text)%5D)%2C%20Scratch.Cast.toString(args.file))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20downloadURL(args)%20%7B%0A%20%20%20%20%20%20return%20downloadUntrustedURL(Scratch.Cast.toString(args.url)%2C%20Scratch.Cast.toString(args.file))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setOpenMode(args)%20%7B%20if%20(ALL_MODES.includes(args.mode))%20openFileSelectorMode%20%3D%20args.mode%20%7D%0A%0A%20%20%20%20fileInfo(args)%20%7B%0A%20%20%20%20%20%20if%20(args.FORMAT%20%3D%3D%3D%20%22size%20formatted%22)%20return%20FileSize%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22size%20unformatted%22)%20return%20RawFileSize%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22modified%20date%22)%20return%20fileDate%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22data%22)%20return%20lastData%3B%0A%20%20%20%20%20%20return%20FileName%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20modalOpen()%20%7B%20return%20openModals%20!%3D%3D%200%20%7D%0A%0A%20%20%20%20%2F%2F%20File%20Writing%20%26%20Folders%0A%20%20%20%20checkFileAPI()%20%7B%20return%20%22showOpenFilePicker%22%20in%20window%20%7D%0A%0A%20%20%20%20allStored()%20%7B%20return%20JSON.stringify(Object.keys(storedFiles))%20%7D%0A%0A%20%20%20%20async%20setStoredFile(args)%20%7B%0A%20%20%20%20%20%20if%20(!this.checkFileAPI())%20return%3B%0A%20%20%20%20%20%20let%20fileTypes%20%3D%20args.FILE%20%3F%20args.FILE.split(%22%20%22)%20%3A%20%5B%5D%3B%0A%20%20%20%20%20%20try%20%7B%0A%09const%20picker%20%3D%20await%20showFilePrompt(fileTypes%2C%20%22%22%2C%20%22window%22)%3B%0A%09if%20(!picker)%20return%3B%0A%20%20%20%20%20%20%20%20storedFiles%5Bargs.NAME%5D%20%3D%20%7B%20file%3A%20picker%5B0%5D%2C%20data%3A%20%7B%7D%20%7D%3B%0A%09const%20metaData%20%3D%20await%20picker%5B0%5D.getFile()%3B%0A%09const%20encodedData%20%3D%20await%20this.encodeData(metaData%2C%20args.TYPE)%3B%0A%09this.updateStore(args.NAME%2C%20encodedData%2C%20metaData)%3B%0A%20%20%20%20%20%20%7D%20catch(e)%20%7B%20console.warn(e)%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20storedFolder(args)%20%7B%0A%20%20%20%20%20%20if%20(!this.checkFileAPI())%20return%3B%0A%20%20%20%20%20%20try%20%7B%0A%09const%20picker%20%3D%20await%20showFilePrompt(%22Folder%22%2C%20%22%22%2C%20%22folder%22)%3B%0A%20%20%20%20%20%20%20%20if%20(!picker)%20return%3B%0A%20%20%20%20%20%20%20%20const%20entries%20%3D%20picker.entries()%3B%0A%20%20%20%20%20%20%20%20const%20folderN%20%3D%20args.NAME%20%3F%20args.NAME%20%3A%20picker.name%3B%0A%20%20%20%20%20%20%20%20let%20thisFile%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20while%20(thisFile%20!%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20outerData%20%3D%20await%20entries.next()%3B%0A%20%20%20%20%20%20%20%20%20%20thisFile%20%3D%20outerData.value%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(thisFile%20!%3D%3D%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20innerData%20%3D%20thisFile%5B1%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20name%20%3D%20%60%24%7BfolderN%7D%2F%24%7BinnerData.name%7D%60%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20storedFiles%5Bname%5D%20%3D%20%7B%20file%3A%20innerData%2C%20data%3A%20%7B%7D%20%7D%3B%0A%09%20%20%20%20const%20metaData%20%3D%20await%20innerData.getFile()%3B%0A%09%20%20%20%20const%20encodedData%20%3D%20await%20this.encodeData(metaData%2C%20args.TYPE)%3B%0A%09%20%20%20%20this.updateStore(name%2C%20encodedData%2C%20metaData)%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%7D%20catch(e)%20%7B%20console.warn(e)%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteStoredFile(args)%20%7B%0A%20%20%20%20%20%20if%20(args.OPTION%20%3D%3D%3D%20%22this%20device%22%20%7C%7C%20args.OPTION%20%3D%3D%3D%20%22both%22)%20%7B%0A%20%20%20%20%20%20%20%20if%20(!this.checkFileAPI()%20%7C%7C%20storedFiles%5Bargs.NAME%5D%20%3D%3D%3D%20undefined)%20return%3B%0A%20%20%20%20%20%20%20%20storedFiles%5Bargs.NAME%5D.file.remove()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(args.OPTION%20%3D%3D%3D%20%22storage%22%20%7C%7C%20args.OPTION%20%3D%3D%3D%20%22both%22)%20delete%20storedFiles%5Bargs.NAME%5D%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20updateFile(args)%20%7B%0A%20%20%20%20%20%20if%20(!this.checkFileAPI()%20%7C%7C%20storedFiles%5Bargs.NAME%5D%20%3D%3D%3D%20undefined)%20return%3B%0A%20%20%20%20%20%20try%20%7B%0A%09const%20writable%20%3D%20await%20storedFiles%5Bargs.NAME%5D.file.createWritable()%3B%0A%09await%20writable.write(args.TXT)%3B%0A%09await%20writable.close()%3B%0A%09this.updateStore(args.NAME%2C%20args.TXT%2C%20%7B%20lastModified%3A%20Date.now()%2C%20size%3A%20args.TXT.length%20%7D)%3B%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%09console.warn(e)%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20storedInfo(args)%20%7B%0A%20%20%20%20%20%20const%20fileInfo%20%3D%20storedFiles%5Bargs.NAME%5D%3B%0A%20%20%20%20%20%20if%20(fileInfo%20%3D%3D%3D%20undefined)%20return%20%22%22%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22size%20formatted%22)%20return%20fileInfo.data.sizeFormat%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22size%20unformatted%22)%20return%20fileInfo.data.size%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22modified%20date%22)%20return%20fileInfo.data.dateFormat%3B%0A%20%20%20%20%20%20else%20if%20(args.FORMAT%20%3D%3D%3D%20%22data%22)%20return%20fileInfo.data.data%3B%0A%20%20%20%20%20%20return%20fileInfo.file.name%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20moveStorage()%20%7B%0A%20%20%20%20%20%20const%20ext%20%3D%20runtime.ext_cst1229zip%3B%0A%20%20%20%20%20%20if%20(ext%20%3D%3D%3D%20undefined)%20return%3B%0A%20%20%20%20%20%20ext.createEmptyAs(%7B%20NAME%3A%20%22filesExpanded_storedFiles%22%20%7D)%3B%0A%20%20%20%20%20%20if%20(ext.zipError)%20return%3B%0A%20%20%20%20%20%20const%20zip%20%3D%20ext.zips%5B%22filesExpanded_storedFiles%22%5D%3B%0A%20%20%20%20%20%20for%20(const%20%5Bname%2C%20file%5D%20of%20Object.entries(storedFiles))%20%7B%20zip.file(name%2C%20file.data.data)%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Extra%0A%20%20%20%20findFileSize(args)%20%7B%0A%20%20%20%20%20%20const%20size%20%3D%20args.FILE.length%3B%20%2F%2F%20bytes%0A%20%20%20%20%20%20if%20(args.TYPE%20%3D%3D%3D%20%22formatted%22)%20return%20formatFileSize(size)%3B%0A%20%20%20%20%20%20return%20size%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Visuals%0A%20%20%20%20resetStyle()%20%7B%0A%20%20%20%20%20%20selectorOptions%20%3D%20%7B%0A%20%20%20%20%20%20%20%20border%3A%20%22%23888%22%2C%20text%3A%20%22%23000000%22%2C%20outer%3A%20%22%23ffffff%22%2C%0A%20%20%20%20%20%20%20%20sizeFont%3A%201.5%2C%20borderRadius%3A%2016%2C%20borderType%3A%20%22dashed%22%2C%0A%20%20%20%20%20%20%20%20font%3A%20%22inherit%22%2C%20shadow%3A%200.5%2C%20image%3A%20%22%22%2C%20imageScale%3A%20100%2C%0A%20%20%20%20%20%20%20%20textV%3A%20%22Select%20or%20drop%20file%22%2C%20fontWeight%3A%2040%2C%20letterSpacing%3A%20%22normal%22%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20borderColors(args)%20%7B%0A%20%20%20%20%20%20switch%20(args.OPTION)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22text%22%3A%0A%20%20%20%20%20%20%20%20%20%20selectorOptions.text%20%3D%20args.COLOR%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%20%22background%22%3A%0A%20%20%20%20%20%20%20%20%20%20selectorOptions.outer%20%3D%20args.COLOR%3B%0A%20%20%20%20%20%20%20%20%20%20selectorOptions.image%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20default%3A%20selectorOptions.border%20%3D%20args.COLOR%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20visualsSelect(args)%20%7B%0A%20%20%20%20%20%20switch%20(args.OPTION)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22font%20size%22%3A%20%7B%20selectorOptions.sizeFont%20%3D%20args.AMT%20%2F%2010%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20case%20%22font%20thickness%22%3A%20%7B%20selectorOptions.fontWeight%20%3D%20args.AMT%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20case%20%22letter%20spacing%22%3A%20%7B%20selectorOptions.letterSpacing%20%3D%20args.AMT%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20case%20%22border%20radius%22%3A%20%7B%20selectorOptions.borderRadius%20%3D%20args.AMT%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20case%20%22shadow%20intensity%22%3A%20%7B%20selectorOptions.shadow%20%3D%20args.AMT%20%2F%20100%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20default%3A%20selectorOptions.border%20%3D%20args.AMT%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20borderTypeSet(args)%20%7B%20selectorOptions.borderType%20%3D%20args.TYPE%20%7D%0A%0A%20%20%20%20fontSet(args)%20%7B%20selectorOptions.font%20%3D%20args.FONT%20%7D%0A%0A%20%20%20%20currentX(args)%20%7B%0A%20%20%20%20%20%20if%20(args.THING%20%3D%3D%3D%20%22shadow%22%20%7C%7C%20args.THING%20%3D%3D%3D%20%22sizeFont%22)%20%7B%0A%20%20%20%20%20%20%20%20const%20multiplier%20%3D%20args.THING%20%3D%3D%3D%20%22shadow%22%20%3F%20100%20%3A%2010%3B%0A%20%20%20%20%20%20%20%20return%20selectorOptions%5Bargs.THING%5D%20*%20multiplier%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20selectorOptions%5Bargs.THING%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20imageSet(args)%20%7B%0A%20%20%20%20%20%20Scratch.canFetch(encodeURI(args.IMG)).then(canFetch%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(canFetch)%20selectorOptions.image%20%3D%20%60url(%24%7BencodeURI(args.IMG)%7D)%60%3B%0A%20%20%20%20%20%20%20%20else%20console.warn(%22Cannot%20fetch%20content%20from%20the%20URL.%22)%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20scaleImage(args)%20%7B%20selectorOptions.imageScale%20%3D%20args.SCALE%20%7D%0A%0A%20%20%20%20textSet(args)%20%7B%20selectorOptions.textV%20%3D%20args.TEXT%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(runtime.ext_filesexpanded%20%3D%20new%20filesExpanded())%3B%0A%7D)(Scratch)%3B%0A%20%7D)(Scratch)%3B","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Better%20Input%0D%0A%2F%2F%20ID%3A%20BetterInputSP%0D%0A%2F%2F%20Description%3A%20Expansion%20of%20the%20%22ask%20and%20wait%22%20Blocks.%0D%0A%2F%2F%20By%3A%20SharkPool%0D%0A%0D%0A%2F%2F%20Version%20V.4.2.1%0D%0A%0D%0A(function%20(Scratch)%20%7B%0D%0A%20%20%22use%20strict%22%3B%0D%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22Better%20Input%20must%20run%20unsandboxed%22)%3B%0D%0A%0D%0A%20%20const%20menuIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMzQuMTc2IiBoZWlnaHQ9IjEzNC4xNzYiIHZpZXdCb3g9IjAgMCAxMzQuMTc2IDEzNC4xNzYiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCI%2BPHBhdGggZD0iTTAgNjcuMDg4QzAgMzAuMDM2IDMwLjAzNiAwIDY3LjA4OCAwczY3LjA4OCAzMC4wMzYgNjcuMDg4IDY3LjA4OC0zMC4wMzYgNjcuMDg4LTY3LjA4OCA2Ny4wODhTMCAxMDQuMTQgMCA2Ny4wODgiIGZpbGw9IiM5NDAwZmYiLz48cGF0aCBkPSJtNzYuNzY3IDI4LjEzNCAxMC44MzQuMDRjMTAuNTE1LjA4IDEwLjgzNC4xMiAxMS41MS41OTcgMi40MyAxLjg3MiAyLjM5IDQuOTM5LS4xNTkgNi42NTItLjc1Ni41MTgtMS4xMTUuNTU3LTQuMzQxLjU1N2gtMy41MDV2NjIuMTc2aDMuNDY1YzMuOTQzIDAgNC45LjMxOCA1LjgxNSAxLjk1MSAxLjAzNiAxLjgzMy41MTggMy45NDQtMS4yNzQgNS4yNTgtLjY3Ny41MTgtLjk5Ni41MTgtMTEuNTExLjU5OGwtMTAuODM0LjA4LTEuMTE1LS41NThjLTEuMTU2LS42MzgtMi4xOTEtMi4xNTEtMi4xOTEtMy4zODYgMC0uODc2Ljk5Ni0yLjY2OSAxLjc5Mi0zLjI2Ni41OTgtLjQ3OCAxLjExNi0uNTE4IDQuMzQyLS41OThsMy42NjQtLjA4VjM2LjAybC0zLjY2NC0uMDhjLTMuMjI2LS4wOC0zLjc0NC0uMTE5LTQuMzQyLS41OTctLjc5Ni0uNTU4LTEuNzkyLTIuMzUtMS43OTItMy4yNjYgMC0xLjIzNS45OTYtMi43ODggMi4xOS0zLjM4NnoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik01MS43NTMgNDUuNTRoMjguMDR2NDMuMDU2bC0yOC40MzgtLjA0Yy0yOC4yLS4wNzktMjguNDM5LS4wNzktMjkuMzE1LS41OTctLjQ3OC0uMjc5LTEuMTE2LS45MTYtMS4zOTQtMS40NzRsLS41NTgtLjk1NVY2Ny4wODhjMC0xNy43MjUuMDQtMTguNDQyLjQ3OC0xOS4zNTguNTk3LTEuMDc1Ljk1Ni0xLjQzNCAyLjE1LTEuODcyLjc1OC0uMjM5IDYuMTc1LS4zMTggMjkuMDM3LS4zMTh6bS0xMC4wMzcgOS45OTdjLS42MzcuMzk4LTEuMzE0IDEuNzkzLTUuMDE5IDkuOTk4LTQuNjIgMTAuMjM2LTQuODU5IDEwLjkxMy0zLjgyMyAxMi4wMjggMS4xNTUgMS4yMzUgMi45NDcgMS4yNzUgMy45ODMuMDQuMzE4LS4zOTguNzk2LTEuMjc0IDEuMDM1LTEuOTUxbC40MzgtMS4yMzVoOS41NmwuNTU3IDEuNDM0Yy43MTcgMS45NTEgMS40NzQgMi42MjkgMi45MDggMi42MjkuOTE2IDAgMS4xOTUtLjEyIDEuNzkyLS43OTcuNTE4LS41NTguNzE3LTEuMDM2LjcxNy0xLjY3M3MtMS4xNTUtMy41ODUtMy43ODQtOS40NGMtNC45NzgtMTEuMTkyLTQuNzQtMTAuNzE0LTUuNTM2LTExLjExMi0uOTE2LS41MTgtMS45MTItLjQ3OC0yLjgyOC4wOHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik00My4xOSA2My4xODVjLjE1OS4xNTkgMi41ODkgNi4xMzQgMi41ODkgNi4zMzMgMCAuMTU5LTEuMTk1LjIzOS0yLjcwOS4yMzktMi4wNzEgMC0yLjY2OC0uMDgtMi41ODktLjMxOS4wOC0uMTYuNjc3LTEuNjMzIDEuMzk0LTMuMzA2LjcxNy0xLjYzMyAxLjMxNS0yLjk4NyAxLjMxNS0yLjk0N3ptNTEuNTQgMy45MDNWNDUuNWw4LjI4NS4wOGM3LjgwNy4wOCA4LjMyNS4xMTkgOS4xMjEuNTk3LjQ3OC4yNzkgMS4xMTYuOTE2IDEuMzk0IDEuNDc0bC41NTguOTU2Vjg1LjUzbC0uNTU4Ljk1NWMtLjI3OC41NTgtLjkxNiAxLjE5NS0xLjM5NCAxLjQ3NC0uODM2LjUxOC0xLjMxNC41MTgtOS4xMi41OThsLTguMjg2LjA4eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0ibTc2Ljc2NyAyOC4xMzQgMTAuODM0LjA0YzEwLjUxNS4wOCAxMC44MzQuMTIgMTEuNTEuNTk3IDIuNDMgMS44NzIgMi4zOSA0LjkzOS0uMTU5IDYuNjUyLS43NTYuNTE4LTEuMTE1LjU1Ny00LjM0MS41NTdoLTMuNTA1djYyLjE3NmgzLjQ2NWMzLjk0MyAwIDQuOS4zMTggNS44MTUgMS45NTEgMS4wMzYgMS44MzMuNTE4IDMuOTQ0LTEuMjc0IDUuMjU4LS42NzcuNTE4LS45OTYuNTE4LTExLjUxMS41OThsLTEwLjgzNC4wOC0xLjExNS0uNTU4Yy0xLjE1Ni0uNjM4LTIuMTkxLTIuMTUxLTIuMTkxLTMuMzg2IDAtLjg3Ni45OTYtMi42NjkgMS43OTItMy4yNjYuNTk4LS40NzggMS4xMTYtLjUxOCA0LjM0Mi0uNTk4bDMuNjY0LS4wOFYzNi4wMmwtMy42NjQtLjA4Yy0zLjIyNi0uMDgtMy43NDQtLjExOS00LjM0Mi0uNTk3LS43OTYtLjU1OC0xLjc5Mi0yLjM1LTEuNzkyLTMuMjY2IDAtMS4yMzUuOTk2LTIuNzg4IDIuMTktMy4zODZ6IiBmaWxsPSIjZmZmIi8%2BPHBhdGggZD0iTTc4LjQ2MSA0NS41NHY0My4wNTZzLTU1LjU0NS0uMTE5LTU2LjQyMS0uNjM3Yy0uNDc4LS4yNzktMS4xMTYtLjkxNi0xLjM5NC0xLjQ3NGwtLjU1OC0uOTU1VjY3LjA4OGMwLTE3LjcyNS4wNC0xOC40NDIuNDc4LTE5LjM1OC41OTctMS4wNzUuOTU2LTEuNDM0IDIuMTUtMS44NzIuNzU4LS4yMzkgNTUuNzQ1LS4zMTggNTUuNzQ1LS4zMThtLTM2Ljc0NSA5Ljk5N2MtLjYzNy4zOTgtMS4zMTQgMS43OTMtNS4wMTkgOS45OTgtNC42MiAxMC4yMzYtNC44NTkgMTAuOTEzLTMuODIzIDEyLjAyOCAxLjE1NSAxLjIzNSAyLjk0NyAxLjI3NSAzLjk4My4wNC4zMTgtLjM5OC43OTYtMS4yNzQgMS4wMzUtMS45NTFsLjQzOC0xLjIzNWg5LjU2bC41NTcgMS40MzRjLjcxNyAxLjk1MSAxLjQ3NCAyLjYyOSAyLjkwOCAyLjYyOS45MTYgMCAxLjE5NS0uMTIgMS43OTItLjc5Ny41MTgtLjU1OC43MTctMS4wMzYuNzE3LTEuNjczcy0xLjE1NS0zLjU4NS0zLjc4NC05LjQ0Yy00Ljk3OC0xMS4xOTItNC43NC0xMC43MTQtNS41MzYtMTEuMTEyLS45MTYtLjUxOC0xLjkxMi0uNDc4LTIuODI4LjA4IiBmaWxsPSIjZmZmIi8%2BPHBhdGggZD0iTTQzLjE5IDYzLjE4NWMuMTU5LjE1OSAyLjU4OSA2LjEzNCAyLjU4OSA2LjMzMyAwIC4xNTktMS4xOTUuMjM5LTIuNzA5LjIzOS0yLjA3MSAwLTIuNjY4LS4wOC0yLjU4OS0uMzE5LjA4LS4xNi42NzctMS42MzMgMS4zOTQtMy4zMDYuNzE3LTEuNjMzIDEuMzE1LTIuOTg3IDEuMzE1LTIuOTQ3TTk2LjA2NCA0NS41czE1LjI3Ni4xOTkgMTYuMDcyLjY3N2MuNDc4LjI3OSAxLjExNi45MTYgMS4zOTQgMS40NzRsLjU1OC45NTZWODUuNTNsLS41NTguOTU1Yy0uMjc4LjU1OC0uOTE2IDEuMTk1LTEuMzk0IDEuNDc0LS44MzYuNTE4LTE2LjA3Mi42NzctMTYuMDcyLjY3N3oiIGZpbGw9IiNmZmYiLz48L2c%2BPC9zdmc%2B%22%3B%0D%0A%20%20const%20blockIconURI%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3OS4zNjMiIGhlaWdodD0iODcuOTIxIiB2aWV3Qm94PSIwIDAgNzkuMzYzIDg3LjkyMSI%2BPGcgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIj48cGF0aCBkPSJNMzIuMzUzIDQzLjk1OXYyMS41NDhsLTExLjcwNi0uMDhjLTExLjAzMS0uMDc5LTExLjcwNy0uMDc5LTEyLjg4OS0uNTk3LS42NzUtLjI3OS0xLjU3Ni0uOTE2LTEuOTctMS40NzRMNSA2Mi40MDFWMjUuNDc4bC43ODgtLjk1NmMuMzk0LS41NTggMS4yOTUtMS4xOTUgMS45Ny0xLjQ3NCAxLjEyNi0uNDc4IDEuODU4LS41MTggMTIuODg5LS41OTdsMTEuNzA2LS4wOHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0zMC40NjkgNjUuNTA3cy0yMS41MjktLjE1OS0yMi43MS0uNjc3Yy0uNjc2LS4yNzktMS41NzctLjkxNi0xLjk3LTEuNDc0TDUgNjIuNDAxVjI1LjQ3OGwuNzg4LS45NTZjLjM5NC0uNTU4IDEuMjk1LTEuMTk1IDEuOTctMS40NzQgMS4xMjYtLjQ3OCAyMi43MTEtLjY3NyAyMi43MTEtLjY3N3oiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNDcuMDExIDQzLjk1OVYyMi4zNzFsMTEuNzA2LjA4YzExLjAzMS4wOCAxMS43NjMuMTE5IDEyLjg4OS41OTcuNjc1LjI3OSAxLjU3Ni45MTYgMS45NyAxLjQ3NGwuNzg4Ljk1NnYzNi45MjNsLS43ODguOTU1Yy0uMzk0LjU1OC0xLjI5NSAxLjE5NS0xLjk3IDEuNDc0LTEuMTgyLjUxOC0xLjg1OC41MTgtMTIuODg5LjU5OGwtMTEuNzA2LjA4eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTQ4Ljg5NSAyMi4zNzFzMjEuNTg1LjE5OSAyMi43MS42NzdjLjY3Ni4yNzkgMS41NzcuOTE2IDEuOTcgMS40NzRsLjc4OS45NTZ2MzYuOTIzbC0uNzg4Ljk1NWMtLjM5NC41NTgtMS4yOTUgMS4xOTUtMS45NyAxLjQ3NC0xLjE4Mi41MTgtMjIuNzExLjY3Ny0yMi43MTEuNjc3eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Im0yOS4yNzggNS4wMDUgMTAuODMzLjA0YzEwLjUxNi4wOCAxMC44MzQuMTIgMTEuNTExLjU5NyAyLjQzIDEuODcyIDIuMzkgNC45MzktLjE1OSA2LjY1Mi0uNzU3LjUxOC0xLjExNS41NTctNC4zNDEuNTU3aC0zLjUwNXY2Mi4xNzZoMy40NjVjMy45NDMgMCA0Ljg5OS4zMTggNS44MTUgMS45NTEgMS4wMzYgMS44MzMuNTE4IDMuOTQ0LTEuMjc1IDUuMjU4LS42NzcuNTE4LS45OTUuNTE4LTExLjUxLjU5OGwtMTAuODM0LjA4LTEuMTE2LS41NThjLTEuMTU1LS42MzgtMi4xOS0yLjE1MS0yLjE5LTMuMzg2IDAtLjg3Ni45OTUtMi42NjkgMS43OTItMy4yNjYuNTk3LS40NzggMS4xMTUtLjUxOCA0LjM0Mi0uNTk4bDMuNjY0LS4wOFYxMi44OTFsLTMuNjY0LS4wOGMtMy4yMjctLjA4LTMuNzQ1LS4xMTktNC4zNDItLjU5Ny0uNzk3LS41NTgtMS43OTItMi4zNS0xLjc5Mi0zLjI2NiAwLTEuMjM1Ljk5NS0yLjc4OCAyLjE5LTMuMzg2eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0ibTI5LjI3OCA1LjAwNSAxMC44MzMuMDRjMTAuNTE2LjA4IDEwLjgzNC4xMiAxMS41MTEuNTk3IDIuNDMgMS44NzIgMi4zOSA0LjkzOS0uMTU5IDYuNjUyLS43NTcuNTE4LTEuMTE1LjU1Ny00LjM0MS41NTdoLTMuNTA1djYyLjE3NmgzLjQ2NWMzLjk0MyAwIDQuODk5LjMxOCA1LjgxNSAxLjk1MSAxLjAzNiAxLjgzMy41MTggMy45NDQtMS4yNzUgNS4yNTgtLjY3Ny41MTgtLjk5NS41MTgtMTEuNTEuNTk4bC0xMC44MzQuMDgtMS4xMTYtLjU1OGMtMS4xNTUtLjYzOC0yLjE5LTIuMTUxLTIuMTktMy4zODYgMC0uODc2Ljk5NS0yLjY2OSAxLjc5Mi0zLjI2Ni41OTctLjQ3OCAxLjExNS0uNTE4IDQuMzQyLS41OThsMy42NjQtLjA4VjEyLjg5MWwtMy42NjQtLjA4Yy0zLjIyNy0uMDgtMy43NDUtLjExOS00LjM0Mi0uNTk3LS43OTctLjU1OC0xLjc5Mi0yLjM1LTEuNzkyLTMuMjY2IDAtMS4yMzUuOTk1LTIuNzg4IDIuMTktMy4zODZ6IiBmaWxsPSIjZmZmIi8%2BPC9nPjwvc3ZnPg%3D%3D%22%3B%0D%0A%0D%0A%20%20const%20formatIcon%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNTAuOTA0IiBoZWlnaHQ9Ijk1LjUiIHZpZXdCb3g9IjAgMCAxNTAuOTA0IDk1LjUiPjxnIHN0cm9rZS1taXRlcmxpbWl0PSIxMCI%2BPHBhdGggZD0iTTc1LjE5NCA2OS41NjhzLTQwLjI2Ny0uMTYtNDEuNTYtLjY3N2MtLjczOC0uMjc5LTEuNzIyLS45MTYtMi4xNTMtMS40NzRsLS44NjItLjk1NlYyOS41NGwuODYyLS45NTZjLjQzLS41NTggMS40MTUtMS4xOTUgMi4xNTQtMS40NzQgMS4yMy0uNDc4IDQxLjU1OS0uNjc3IDQxLjU1OS0uNjc3eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTY5LjU0MyAyNi40MzJzNDIuNjYyLjE5OSA0My44OTMuNjc3Yy43MzguMjc5IDEuNzIzLjkxNiAyLjE1NCAxLjQ3NGwuODYxLjk1NnYzNi45MjJsLS44NjEuOTU2Yy0uNDMuNTU4LTEuNDE2IDEuMTk1LTIuMTU0IDEuNDc0LTEuMjkyLjUxOC00My44OTMuNjc3LTQzLjg5My42Nzd6IiBmaWxsPSJub25lIiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNNzEuNjAzIDI2LjQzMnM0MC42MDIuMTk5IDQxLjgzMy42NzdjLjczOC4yNzkgMS43MjMuOTE2IDIuMTU0IDEuNDc0bC44NjEuOTU2djM2LjkyMmwtLjg2MS45NTZjLS40My41NTgtMS40MTYgMS4xOTUtMi4xNTQgMS40NzQtMS4yOTIuNTE4LTQxLjgzMy42NzctNDEuODMzLjY3N3oiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNzMuMTM0IDY5LjU2OHMtMzguMjA3LS4xNi0zOS41LS42NzdjLS43MzgtLjI3OS0xLjcyMi0uOTE2LTIuMTUzLTEuNDc0bC0uODYyLS45NTZWMjkuNTRsLjg2Mi0uOTU2Yy40My0uNTU4IDEuNDE1LTEuMTk1IDIuMTU0LTEuNDc0IDEuMjMtLjQ3OCAzOS40OTktLjY3NyAzOS40OTktLjY3N3oiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNSAyMi4xNThWNWgxNy4xNTh6IiBmaWxsPSJub25lIiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNMTQ1LjkwNCA3My4zNDJWOTAuNWgtMTcuMTU4eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTUgMjIuMTU4VjVoMTcuMTU4eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xNDUuOTA0IDczLjM0MlY5MC41aC0xNy4xNTh6IiBmaWxsPSIjZmZmIi8%2BPHBhdGggZD0iTTIyLjE1OCA5MC41SDVWNzMuMzQyek0xMjguNzQ2IDVoMTcuMTU4djE3LjE1OHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yMi4xNTggOTAuNUg1VjczLjM0MnpNMTI4Ljc0NiA1aDE3LjE1OHYxNy4xNTh6IiBmaWxsPSIjZmZmIi8%2BPHBhdGggZD0iTTcxLjcxOCAzMy40MmMxLjE4My0uNzIgMi40ODUtLjc3MSAzLjY2Ny0uMTAzIDEuMDI5LjUxNC43NzctLjA0IDcuMjA1IDE0LjQwOSAzLjM5NCA3LjU1OSA0Ljg3IDExLjQwOCA0Ljg3IDEyLjIzMXMtLjI2MyAxLjQ0NS0uOTMyIDIuMTY1Yy0uNzcuODc1LTEuMTM3IDEuMDM0LTIuMzIgMS4wMzQtMS44NTEgMC0yLjg5OC0uOTgyLTMuODI0LTMuNTAybC0uNjUzLTEuNzQxLTYuMjA1LjAxLTYuMjA1LS4wMS0uNDk4IDEuNDg0Yy0uMzA5Ljg3NC0uOTkxIDIuMTE3LTEuNDAzIDIuNjMtMS4zMzcgMS41OTUtMy42NjMgMS41MzQtNS4xNTQtLjA2LTEuMzM3LTEuNDQtMS4wNDctMi4zNzMgNC45MTgtMTUuNTg5IDQuNzgyLTEwLjU5MyA1LjcxMi0xMi40NDQgNi41MzQtMTIuOTU4IiBmaWxsPSIjNjkwMGI0Ii8%2BPHBhdGggZD0iTTczLjYyOSA0My4zNTdjLjIwNi4yMDYgMy4zNDMgNy45MiAzLjM0MyA4LjE3NiAwIC4yMDYtMS41NDMuMzA5LTMuNDk3LjMwOS0yLjY3NCAwLTMuNDQ2LS4xMDMtMy4zNDMtLjQxMi4xMDMtLjIwNS44NzQtMi4xMDggMS44LTQuMjY4LjkyNi0yLjEwOCAxLjY5Ny0zLjg1NiAxLjY5Ny0zLjgwNSIgZmlsbD0iI2ZmZiIvPjwvZz48L3N2Zz4%3D%22%3B%0D%0A%20%20const%20colorIcon%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3NS41MzUiIGhlaWdodD0iNzEuNDk3IiB2aWV3Qm94PSIwIDAgNzUuNTM1IDcxLjQ5NyI%2BPGcgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIj48cGF0aCBkPSJNMjEuMzA3IDIxLjQ2MkMyMS4zMDcgMTIuMzcgMjguNjc3IDUgMzcuNzY4IDVzMTYuNDYxIDcuMzcgMTYuNDYxIDE2LjQ2Mi03LjM3IDE2LjQ2MS0xNi40NjEgMTYuNDYxLTE2LjQ2MS03LjM3LTE2LjQ2MS0xNi40NjF6IiBmaWxsPSJub25lIiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNNSA1MC4wMzZjMC05LjA5MSA3LjM3LTE2LjQ2MSAxNi40NjItMTYuNDYxczE2LjQ2MSA3LjM3IDE2LjQ2MSAxNi40NjFjMCA5LjA5Mi03LjM3IDE2LjQ2Mi0xNi40NjEgMTYuNDYyQzEyLjM3IDY2LjQ5OCA1IDU5LjEyOCA1IDUwLjAzNnoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0zNy42MTMgNTAuMDM2YzAtOS4wOTEgNy4zNy0xNi40NjEgMTYuNDYxLTE2LjQ2MSA5LjA5MiAwIDE2LjQ2MiA3LjM3IDE2LjQ2MiAxNi40NjEgMCA5LjA5Mi03LjM3IDE2LjQ2Mi0xNi40NjIgMTYuNDYycy0xNi40NjEtNy4zNy0xNi40NjEtMTYuNDYyeiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTIxLjMwNyAyMS40NjJDMjEuMzA3IDEyLjM3IDI4LjY3NyA1IDM3Ljc2OCA1czE2LjQ2MSA3LjM3IDE2LjQ2MSAxNi40NjItNy4zNyAxNi40NjEtMTYuNDYxIDE2LjQ2MS0xNi40NjEtNy4zNy0xNi40NjEtMTYuNDYxIiBmaWxsPSJsaW1lIi8%2BPHBhdGggZD0iTTUgNTAuMDM2YzAtOS4wOTEgNy4zNy0xNi40NjEgMTYuNDYyLTE2LjQ2MXMxNi40NjEgNy4zNyAxNi40NjEgMTYuNDYxYzAgOS4wOTItNy4zNyAxNi40NjItMTYuNDYxIDE2LjQ2MkMxMi4zNyA2Ni40OTggNSA1OS4xMjggNSA1MC4wMzYiIGZpbGw9InJlZCIvPjxwYXRoIGQ9Ik0zNy42MTMgNTAuMDM2YzAtOS4wOTEgNy4zNy0xNi40NjEgMTYuNDYxLTE2LjQ2MSA5LjA5MiAwIDE2LjQ2MiA3LjM3IDE2LjQ2MiAxNi40NjEgMCA5LjA5Mi03LjM3IDE2LjQ2Mi0xNi40NjIgMTYuNDYycy0xNi40NjEtNy4zNy0xNi40NjEtMTYuNDYyIiBmaWxsPSJibHVlIi8%2BPC9nPjwvc3ZnPg%3D%3D%22%3B%0D%0A%20%20const%20effectIcon%20%3D%0D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1Ny40NDIiIGhlaWdodD0iNzAuNDUiIHZpZXdCb3g9IjAgMCA1Ny40NDIgNzAuNDUiPjxnIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIj48cGF0aCBkPSJNNSA0OS4wNDdjLTMuOTg4LTguMTE3LTMuOTk2LTE4LjI0My4xNTMtMjYuNDFDOS44NCAxMy4wNjIgMTcuNzMgOC44MTggMjAuOSA3LjQzOGEzMS40IDMxLjQgMCAwIDEgNi4wNzYtMi4wODNsMi4xMi0uNDU3YzEuNTU4LS4zMiAzLjExLjY0NiAzLjQ0NyAyLjE4Ny4zNCAxLjU0NS0uNjUxIDMuMDY2LTIuMjE2IDMuNDAybC0yLjA2My40NDVhMjUuNCAyNS40IDAgMCAwLTQuOTYgMS43MTZjLTIuMDgzLjkwMi04Ljk3NCA0LjM5Mi0xMi45NDkgMTIuNTE1LTMuMDE3IDUuOTMzLTMuOTE3IDE1LjM2Ni44MzIgMjMuMTUgNC4zMDMgNy40OTggMTMuMTEyIDEyLjA5NSAyMS40NjggMTEuMzIxIDcuOTAzLS41NjggMTUuMTU1LTUuODI4IDE3LjY5OC0xMi43OTUgMi41ODEtNi41NTIuODY2LTEzLjI2OS0xLjk2Ny0xNy4wNTItMy40MTMtNC42Ni03LjY2LTYuMDk0LTkuMzI4LTYuNDk1LS4yNDktLjA3NC02LjA4NS0xLjgyNy0xMS4yNC43NTQtMi4yMiAxLjA2NC01LjA5IDMuNDU2LTYuNjI4IDcuMDUtMS42NiAzLjcxMi0xLjIzIDguNDg0IDEuMDIgMTEuNjU1IDIuMjYzIDMuMzk5IDYuNTMyIDUuMzIzIDEwLjIwMyA0LjY3IDMuNjU1LS41NzUgNi4xMjctMy4yOTQgNi43MTMtNS42ODMuNjg5LTIuNTY4LS4zNjgtNC43MzktMS4xOTMtNS41Mi0xLjQwMS0xLjM4My0yLjYxMS0xLjQwNi0yLjY2My0xLjQxYTUgNSAwIDAgMC0xLjAyNi4wNTRjLS42NTQuMjQtMS41ODIuNzY0LTEuODU0IDEuMzE2LS4wNDguMDktLjE3LjM0LjA2NC45NjMuNTYzIDEuNDc3LS4xOTcgMy4xMy0xLjY5NCAzLjY4NS0xLjQ5LjU1OC0zLjE2Ny0uMTkyLTMuNzMzLTEuNjczLS45MzEtMi40NS0uNDE2LTQuMzY4LjE4LTUuNTQ2IDEuNTU4LTMuMDY2IDUuMTc2LTQuMTc2IDUuNTg1LTQuMjk0LjE4Ny0uMDU3LjM4NS0uMDkxLjU4LS4xMDguMzk4LS4wNiAxLjEtLjE1NSAyLjA1Mi0uMTE4IDIuMTc4LjAyNyA0LjY2IDEuMTY1IDYuNTYzIDMuMDQ2IDIuMjQ2IDIuMTIgNC4wMDYgNi4zOCAyLjc1OCAxMS4wMTEtMS4yMTcgNC45NTctNS44OTUgOS4wNTYtMTEuMzUzIDkuOTE0LTUuODcgMS4wNDctMTIuNDgyLTEuODQ3LTE1Ljk3My03LjA5NC0zLjM2NS00LjcyOC00LjAwOS0xMS42NDctMS41NDgtMTcuMTM2IDIuNy02LjMyIDcuODU5LTkuMTggOS4zNzMtOS45MDcgNy4yNzktMy42MzUgMTUuMDU5LTEuMjM1IDE1LjM4Ni0xLjEzNCAyLjA5My40OTQgNy45MTMgMi40NDMgMTIuNDM3IDguNjI1IDMuNDc3IDQuNjUgNi4yOTcgMTMuMzM3IDIuNzE0IDIyLjQzLTMuMjczIDguOTYyLTEyLjU5IDE1Ljc3LTIyLjYzOCAxNi40OTMtLjc4OC4wNzQtMS41ODUuMTE1LTIuMzguMTE1LTkuNzUgMC0xOS42MjctNS42Mi0yNC41OC0xNC4yNSAwIDAtLjgyMS0xLjQxOC0xLjE4My0yLjE1M3oiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik02LjE4MiA1MS4yMDFjLTUuMTM0LTguNDItNS41NTMtMTkuNjU3LTEuMDMtMjguNTY1QzkuODQgMTMuMDYyIDE3LjczIDguODE4IDIwLjkgNy40MzhhMzEuNCAzMS40IDAgMCAxIDYuMDc2LTIuMDgzbDIuMTItLjQ1N2MxLjU1OC0uMzIgMy4xMS42NDYgMy40NDcgMi4xODcuMzQgMS41NDUtLjY1MSAzLjA2Ni0yLjIxNiAzLjQwMmwtMi4wNjMuNDQ1YTI1LjQgMjUuNCAwIDAgMC00Ljk2IDEuNzE2Yy0yLjA4My45MDItOC45NzQgNC4zOTItMTIuOTQ5IDEyLjUxNS0zLjAxNyA1LjkzMy0zLjkxNyAxNS4zNjYuODMyIDIzLjE1IDQuMzAzIDcuNDk4IDEzLjExMiAxMi4wOTUgMjEuNDY4IDExLjMyMSA3LjkwMy0uNTY4IDE1LjE1NS01LjgyOCAxNy42OTgtMTIuNzk1IDIuNTgxLTYuNTUyLjg2Ni0xMy4yNjktMS45NjctMTcuMDUyLTMuNDEzLTQuNjYtNy42Ni02LjA5NC05LjMyOC02LjQ5NS0uMjQ5LS4wNzQtNi4wODUtMS44MjctMTEuMjQuNzU0LTIuMjIgMS4wNjQtNS4wOSAzLjQ1Ni02LjYyOCA3LjA1LTEuNjYgMy43MTItMS4yMyA4LjQ4NCAxLjAyIDExLjY1NSAyLjI2MyAzLjM5OSA2LjUzMiA1LjMyMyAxMC4yMDMgNC42NyAzLjY1NS0uNTc1IDYuMTI3LTMuMjk0IDYuNzEzLTUuNjgzLjY4OS0yLjU2OC0uMzY4LTQuNzM5LTEuMTkzLTUuNTItMS40MDEtMS4zODMtMi42MTEtMS40MDYtMi42NjMtMS40MWE1IDUgMCAwIDAtMS4wMjYuMDU0Yy0uNjU0LjI0LTEuNTgyLjc2NC0xLjg1NCAxLjMxNi0uMDQ4LjA5LS4xNy4zNC4wNjQuOTYzLjU2MyAxLjQ3Ny0uMTk3IDMuMTMtMS42OTQgMy42ODUtMS40OS41NTgtMy4xNjctLjE5Mi0zLjczMy0xLjY3My0uOTMxLTIuNDUtLjQxNi00LjM2OC4xOC01LjU0NiAxLjU1OC0zLjA2NiA1LjE3Ni00LjE3NiA1LjU4NS00LjI5NC4xODctLjA1Ny4zODUtLjA5MS41OC0uMTA4LjM5OC0uMDYgMS4xLS4xNTUgMi4wNTItLjExOCAyLjE3OC4wMjcgNC42NiAxLjE2NSA2LjU2MyAzLjA0NiAyLjI0NiAyLjEyIDQuMDA2IDYuMzggMi43NTggMTEuMDExLTEuMjE3IDQuOTU3LTUuODk1IDkuMDU2LTExLjM1MyA5LjkxNC01Ljg3IDEuMDQ3LTEyLjQ4Mi0xLjg0Ny0xNS45NzMtNy4wOTQtMy4zNjUtNC43MjgtNC4wMDktMTEuNjQ3LTEuNTQ4LTE3LjEzNiAyLjctNi4zMiA3Ljg1OS05LjE4IDkuMzczLTkuOTA3IDcuMjc5LTMuNjM1IDE1LjA1OS0xLjIzNSAxNS4zODYtMS4xMzQgMi4wOTMuNDk0IDcuOTEzIDIuNDQzIDEyLjQzNyA4LjYyNSAzLjQ3NyA0LjY1IDYuMjk3IDEzLjMzNyAyLjcxNCAyMi40My0zLjI3MyA4Ljk2Mi0xMi41OSAxNS43Ny0yMi42MzggMTYuNDkzLS43ODguMDc0LTEuNTg1LjExNS0yLjM4LjExNS05Ljc1IDAtMTkuNjI3LTUuNjItMjQuNTgtMTQuMjUiLz48L2c%2BPC9zdmc%2B%22%3B%0D%0A%0D%0A%20%20let%20laidImgContain%20%3D%20%22%22%3B%0D%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0D%0A%20%20const%20fontMenu%20%3D%20%5B%0D%0A%20%20%20%20%22Sans%20Serif%22%2C%20%22Serif%22%2C%20%22Handwriting%22%2C%0D%0A%20%20%20%20%22Marker%22%2C%20%22Curly%22%2C%20%22Pixel%22%2C%20%22Scratch%22%0D%0A%20%20%5D%3B%0D%0A%0D%0A%20%20const%20xmlEscape%20%3D%20function%20(unsafe)%20%7B%0D%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%0D%0A%20%20%20%20%20%20switch%20(c)%20%7B%0D%0A%20%20%20%20%20%20%20%20case%20%22%3C%22%3A%20return%20%22%26lt%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22%3E%22%3A%20return%20%22%26gt%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22%26%22%3A%20return%20%22%26amp%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22'%22%3A%20return%20%22%26apos%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20case%20%22%5C%22%22%3A%20return%20%22%26quot%3B%22%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D)%3B%0D%0A%20%20%7D%3B%0D%0A%0D%0A%20%20class%20BetterInputSP%20%7B%0D%0A%20%20%20%20constructor()%20%7B%0D%0A%20%20%20%20%20%20this.activeOverlays%20%3D%20%5B%5D%3B%20this.askBoxPromises%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20this.isDropdownOpen%20%3D%20false%3B%0D%0A%20%20%20%20%20%20this.userInput%20%3D%20%22%20%22%3B%20this.defaultValue%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20this.textBoxX%20%3D%200%3B%20this.textBoxY%20%3D%200%3B%0D%0A%20%20%20%20%20%20this.askBoxInfo%20%3D%20%5B0%2C%201%5D%3B%20this.appendTarget%20%3D%20%5B%22window%22%2C%20false%5D%3B%0D%0A%20%20%20%20%20%20this.forceInput%20%3D%20%22Disabled%22%3B%0D%0A%20%20%20%20%20%20this.overlayInput%20%3D%20null%3B%0D%0A%20%20%20%20%20%20this.uiOrder%20%3D%20%5B%22question%22%2C%20%22input%22%2C%20%22buttons%22%5D%3B%0D%0A%0D%0A%20%20%20%20%20%20this.optionList%20%3D%20%5B%22Option%201%22%2C%20%22Option%202%22%2C%20%22Option%203%22%5D%3B%0D%0A%20%20%20%20%20%20this.sliderInfo%20%3D%20%5B0%2C%20100%2C%2050%5D%3B%0D%0A%20%20%20%20%20%20this.Timeout%20%3D%200%3B%0D%0A%0D%0A%20%20%20%20%20%20this.inputType%20%3D%20%22Enabled%22%3B%0D%0A%20%20%20%20%20%20this.fontSize%20%3D%20%2214px%22%3B%20this.fontFamily%20%3D%20%22Sans%20Serif%22%3B%20this.textAlign%20%3D%20%22left%22%3B%0D%0A%20%20%20%20%20%20%20%2F%2F%20overlay%20%2B%20Image%2C%20input%2C%20dropdown%20button%20%0D%0A%20%20%20%20%20%20this.mainUIinfo%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Border%20Radius%0D%0A%20%20%20%20%20%20%20%20dimensions%3A%20%5B%22auto%22%2C%20%22auto%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20overlayRad%3A%205%2C%20%0D%0A%20%20%20%20%20%20%20%20inputRad%3A%204%2C%0D%0A%20%20%20%20%20%20%20%20dropBtnRad%3A%205%2C%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Border%20Information%0D%0A%20%20%20%20%20%20%20%20overlayBord%3A%20%221px%20none%20%23000000%22%2C%0D%0A%20%20%20%20%20%20%20%20inputBord%3A%20%221px%20solid%20%23000000%22%2C%0D%0A%20%20%20%20%20%20%20%20dropBtnBord%3A%20%221px%20none%20%23000000%22%2C%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Text%20Padding%0D%0A%20%20%20%20%20%20%20%20overlayPad%3A%20%2215px%22%2C%0D%0A%20%20%20%20%20%20%20%20inputPad%3A%20%225px%22%2C%0D%0A%20%20%20%20%20%20%20%20dropBtnPad%3A%20%225px%2010px%22%2C%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Text%20Shadow%0D%0A%20%20%20%20%20%20%20%20overlayTxtShad%3A%20%22none%22%2C%0D%0A%20%20%20%20%20%20%20%20inputTxtShad%3A%20%22none%22%2C%0D%0A%20%20%20%20%20%20%20%20dropBtnTxtShad%3A%20%22none%22%2C%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20Outline%3A%20Color%20%2B%20Thickness%0D%0A%20%20%20%20%20%20%20%20overlayOutline%3A%20%5B%22%22%2C%200%5D%2C%0D%0A%20%20%20%20%20%20%20%20inputOutline%3A%20%5B%22%22%2C%200%5D%2C%0D%0A%20%20%20%20%20%20%20%20dropBtnOutline%3A%20%5B%22%22%2C%200%5D%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20this.DropdownText%20%3D%20%22Dropdown%22%3B%0D%0A%20%20%20%20%20%20this.lastPressBtn%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20this.buttonJSON%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%22Submit%22%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%22%230074D9%22%2C%20textColor%3A%20%22%23ffffff%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20name%3A%20%22Submit%22%2C%20image%3A%20%22%22%2C%20imgScale%3A%20100%2C%0D%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%205%2C%20border%3A%20%221px%20none%20%23000000%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20padding%3A%20%225px%2010px%22%2C%20dropShadow%3A%20%22none%22%2C%20outline%3A%20%5B%22%22%2C%200%5D%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%22Cancel%22%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%22%23d9534f%22%2C%20textColor%3A%20%22%23ffffff%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20name%3A%20%22Cancel%22%2C%20image%3A%20%22%22%2C%20imgScale%3A%20100%2C%0D%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%205%2C%20border%3A%20%221px%20none%20%23000000%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20padding%3A%20%225px%2010px%22%2C%20dropShadow%3A%20%22none%22%2C%20outline%3A%20%5B%22%22%2C%200%5D%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%0D%0A%20%20%20%20%20%20this.questionColor%20%3D%20%22%23000000%22%3B%20this.inputColor%20%3D%20%22%23000000%22%3B%0D%0A%20%20%20%20%20%20this.textBoxColor%20%3D%20%5B%22%23ffffff%22%5D%3B%20this.inputFieldColor%20%3D%20%22%23a5aec3%22%3B%0D%0A%20%20%20%20%20%20this.dropdwnBtnColor%20%3D%20%5B%22%235f5f5f%22%2C%20%22%23ffffff%22%5D%3B%0D%0A%20%20%20%20%20%20this.overlayImage%20%3D%20%5B%22%20%22%2C%20%22%20%22%2C%20%22%20%22%5D%3B%0D%0A%0D%0A%20%20%20%20%20%20this.Blur%20%3D%200%3B%20this.Brightness%20%3D%200%3B%20this.Opacity%20%3D%20100%3B%0D%0A%20%20%20%20%20%20this.Invert%20%3D%200%3B%20this.Saturation%20%3D%20100%3B%20this.Hue%20%3D%200%3B%0D%0A%20%20%20%20%20%20this.Sepia%20%3D%200%3B%20this.Contrast%20%3D%20100%3B%20this.Scale%20%3D%20100%3B%20%0D%0A%20%20%20%20%20%20this.SkewX%20%3D%200%3B%20this.SkewY%20%3D%200%3B%20this.Rotation%20%3D%2090%3B%0D%0A%20%20%20%20%20%20this.imgScale%20%3D%20%5B100%2C%20100%2C%20100%5D%3B%0D%0A%20%20%20%20%20%20this.shadowEnabled%20%3D%20true%3B%0D%0A%20%20%20%20%20%20this.shadowS%20%3D%20%5B0%2C%200%2C%205%2C%20%22%23000000%22%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getInfo()%20%7B%0D%0A%20%20%20%20%20%20return%20%7B%0D%0A%20%20%20%20%20%20%20%20id%3A%20%22BetterInputSP%22%2C%0D%0A%20%20%20%20%20%20%20%20name%3A%20%22Better%20Input%22%2C%0D%0A%20%20%20%20%20%20%20%20color1%3A%20%22%239400ff%22%2C%0D%0A%20%20%20%20%20%20%20%20color2%3A%20%22%237800cd%22%2C%0D%0A%20%20%20%20%20%20%20%20color3%3A%20%22%236900b3%22%2C%0D%0A%20%20%20%20%20%20%20%20menuIconURI%2C%0D%0A%20%20%20%20%20%20%20%20blockIconURI%2C%0D%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22askAndWait%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22ask%20%5Bquestion%5D%20and%20wait%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20question%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22What%20is%20your%20name%3F%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22askAndWaitForInput%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22ask%20%5Bquestion%5D%20and%20wait%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20question%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22What%20is%20your%20name%3F%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getUserInput%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22user%20input%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDefaultV%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20default%20value%20to%20%5BdefaultV%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultV%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22My%20Name%20Is...%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22removeAskBoxes%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22remove%20all%20ask%20boxes%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetInput%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20user%20input%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Formatting%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFontSize%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20font%20size%20to%20%5BSIZE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SIZE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2014%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setTextAlignment%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20alignment%20to%20%5BALIGNMENT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ALIGNMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22alignmentMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFontFamily%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20font%20to%20%5BFONT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22fontMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setInputType%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20input%20type%20to%20%5BACTION%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ACTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22inputActionMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDropdown%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20dropdown%20options%20to%20array%3A%20%5BDROPDOWN%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DROPDOWN%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22%5B%5C%22Option%201%5C%22%2C%20%5C%22Option%202%5C%22%2C%20%5C%22Option%203%5C%22%5D%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setSlider%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20slider%20to%20min%3A%20%5BMIN%5D%20max%3A%20%5BMAX%5D%20default%3A%20%5BDEFAULT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%200%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DEFAULT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setButton%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BBUTTON%5D%20button%20named%20%5BNAME%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonType%22%20%7D%2C%0D%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%22Submit%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteAllButtons%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22remove%20all%20buttons%22%2C%20blockIconURI%3A%20formatIcon%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setButtonText%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BBUTTON_MENU%5D%20button%20name%20to%20%5BTEXT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON_MENU%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20dropdown%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22lastButton%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22last%20pressed%20button%22%2C%20blockIconURI%3A%20formatIcon%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPrePosition%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22preset%20textbox%20position%20to%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPosition%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20textbox%20position%20to%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changePosition%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20textbox%20position%20by%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%205%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getXpos%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%20text%3A%20%22x%20position%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getYpos%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%20text%3A%20%22y%20position%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDirection%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20direction%20to%20%5BROTATE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ROTATE%3A%20%7B%20type%3A%20Scratch.ArgumentType.ANGLE%2C%20defaultValue%3A%2090%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changeDirection%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20direction%20by%20%5BROTATE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ROTATE%3A%20%7B%20type%3A%20Scratch.ArgumentType.ANGLE%2C%20defaultValue%3A%2015%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22reportDirection%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22direction%22%2C%20blockIconURI%3A%20formatIcon%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Visual%20Settings%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setColorSettings%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BCOLOR_TYPE%5D%20color%20to%20%5BCOLOR%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR_TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22colorSettingsMenu%22%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setImage%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20image%20to%20%5BIMAGE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20IMAGE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22input-url-here%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22scaleImage%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22scale%20%5BELEMENT%5D%20image%20to%20%5BSCALE%5D%25%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SCALE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22enableShadow%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20box%20shadow%20to%20%5BACTION%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ACTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonActionMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setShadow%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20box%20shadow%20%5BSHADOW%5D%20to%20%5BAMT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SHADOW%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22shadowStuff%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDropShadow%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20shadow%20to%20x%20%5Bx%5D%20y%20%5By%5D%20z%20%5Bz%5D%20color%20%5BCOLOR%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22textsMenu%22%20%7D%2C%0D%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%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20z%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%202%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setOutline%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20outline%20to%20%5BCOLOR%5D%20thickness%20%5BTHICK%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22textsMenu%22%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20THICK%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBorder%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20border%20to%20%5BTYPE%5D%20color%20%5BCOLOR%5D%20width%20%5BWIDTH%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0D%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%22borderTypes%22%20%7D%2C%0D%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%0D%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%205%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBorderRadius%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20border%20radius%20to%20%5BVALUE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPadding%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20padding%20to%20T%3A%20%5BN1%5D%20B%3A%20%5BN3%5D%20L%3A%20%5BN4%5D%20R%3A%20%5BN2%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N1%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N2%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N3%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N4%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDimension%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20Textbox%20width%20%5BW%5D%20height%20%5BH%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20W%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20H%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%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%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetEffect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20effects%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setEffect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20effect%20%5BEFFECT%5D%20to%20%5BAMT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22effectMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changeEffect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20effect%20%5BEFFECT%5D%20by%20%5BAMT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22effectMenu%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22showEffect%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22effect%20%5BEFFECT%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22effectMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setTimeout%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20submitted%20delete%20textbox%20after%20%5BTIME%5D%20secs%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22reportTimeout%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22current%20textbox%20timeout%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Operations%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setUI%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20UI%20order%20to%20%5BARRAY%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ARRAY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22%5B%5C%22question%5C%22%2C%20%5C%22input%5C%22%2C%20%5C%22buttons%5C%22%5D%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getUIOrder%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22UI%20order%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAppend%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22append%20next%20textbox%20to%20%5BTARGET%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TARGET%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22appendMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFocus%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20focus%20mode%20to%20%5BTYPE%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%22buttonActionMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isWaitingInput%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20waiting%3F%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isDropdown%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20dropdown%20open%3F%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setSubmitEvent%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20force%20input%20to%20%5BENTER%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENTER%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22enterMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setMaxBoxCount%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20max%20box%20count%20to%3A%20%5BMAX%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%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%201%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getBoxInfo%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22textbox%20%5BINFO%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20INFO%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22boxInfo%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2Fdeprecated%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setGradient%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BCOLOR_TYPE%5D%20color%20to%20gradient%20with%20%5BCOLOR1%5D%20and%20%5BCOLOR2%5D%20with%20direction%20%5BDIR%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR_TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%20COLOR1%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%20COLOR2%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%20DIR%3A%20%7B%20type%3A%20Scratch.ArgumentType.ANGLE%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCircleGradient%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BCOLOR_TYPE%5D%20color%20to%20radial%20gradient%20with%20%5BCOLOR1%5D%20and%20%5BCOLOR2%5D%20at%20x%20%5BX%5D%20y%20%5BY%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR_TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%20COLOR1%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%20COLOR2%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%20X%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%20%7D%2C%20Y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setEnable%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%20text%3A%20%22set%20%5BENABLE_MENU%5D%20to%20be%20%5BACTION%5D%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENABLE_MENU%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22enableMenu%22%20%7D%2C%20ACTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22inputActionMenu%22%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getBoxCount%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%20hideFromPalette%3A%20true%2C%20text%3A%20%22box%20count%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getMaxCount%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%20hideFromPalette%3A%20true%2C%20text%3A%20%22box%20limit%22%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20enableMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22Button%202%22%2C%20%22Button%203%22%2C%20%22Button%204%22%2C%20%22Textbox%20Shadow%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20%5E%20Old%20Menu%20%5E%20(Needed%20for%20V2%20Support)%0D%0A%20%20%20%20%20%20%20%20%20%20fontMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%22allFonts%22%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20buttonMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%22Dropdown%22%5D%2C%20false)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20elementMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%22Textbox%22%2C%20%22Input%20Box%22%2C%20%22Dropdown%20Button%22%5D%2C%20false)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20colorSettingsMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Textbox%22%2C%20%22Question%20Text%22%2C%20%22Textbox%20Shadow%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Input%20Text%22%2C%20%22Input%20Box%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Dropdown%20Button%22%2C%20%22Dropdown%20Text%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20true)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20textsMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%22Question%20Text%22%2C%20%22Input%20Text%22%2C%20%22Dropdown%20Text%22%5D%2C%20true%2C%20true)%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20appendMenu%3A%20%5B%22window%22%2C%20%22canvas%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20buttonType%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22add%22%2C%20%22remove%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20buttonActionMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22Enabled%22%2C%20%22Disabled%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20alignmentMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22left%22%2C%20%22right%22%2C%20%22center%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20shadowStuff%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22Size%22%2C%20%22X%22%2C%20%22Y%22%5D%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20boxInfo%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22count%22%2C%20%22limit%22%2C%20%22button%20count%22%2C%20%22button%20names%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20inputActionMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22None%22%2C%20%22Text%22%2C%20%22Password%22%2C%20%22Number%22%2C%20%22Color%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Dropdown%22%2C%20%22Single%20Dropdown%22%2C%20%22Multi-Select%20Dropdown%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Horizontal%20Slider%22%2C%20%22Vertical%20Slider%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20effectMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Blur%22%2C%20%22Brightness%22%2C%20%22Opacity%22%2C%20%22Invert%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Saturation%22%2C%20%22Hue%22%2C%20%22Sepia%22%2C%20%22Contrast%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Scale%22%2C%20%22SkewX%22%2C%20%22SkewY%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20enterMenu%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22Disabled%22%2C%20%22Enter%20Key%22%2C%20%22Shift%20%2B%20Enter%20Key%22%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20borderTypes%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22none%22%2C%20%22solid%22%2C%20%22dotted%22%2C%20%22dashed%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22double%22%2C%20%22groove%22%2C%20%22ridge%22%2C%20%22inset%22%2C%20%22outset%22%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20allFonts()%20%7B%0D%0A%20%20%20%20%20%20const%20custFonts%20%3D%20vm.runtime.fontManager%20%3F%20vm.runtime.fontManager.getFonts().map((i)%20%3D%3E%20(%7B%20text%3A%20i.name%2C%20value%3A%20i.family%20%7D))%20%3A%20%5B%5D%3B%0D%0A%20%20%20%20%20%20return%20%5B%20...fontMenu%2C%20...custFonts%20%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20allButtons(array%2C%20enableTxt%2C%20justTxt)%20%7B%0D%0A%20%20%20%20%20%20let%20customBtn%20%3D%20Object.keys(this.buttonJSON)%3B%0D%0A%20%20%20%20%20%20if%20(justTxt)%20customBtn%20%3D%20customBtn.map(btn%20%3D%3E%20btn%20%2B%20%22%20Text%22)%3B%0D%0A%20%20%20%20%20%20else%20if%20(enableTxt)%20customBtn.forEach((btn)%20%3D%3E%20%7B%20customBtn.push(btn%20%2B%20%22%20Text%22)%20%7D)%3B%0D%0A%20%20%20%20%20%20return%20%5B%20...array%2C%20...customBtn%20%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20updateOverlayPos(overlay)%20%7B%0D%0A%20%20%20%20%20%20if%20(this.Rotation%20%3E%20359)%20this.Rotation%20%3D%200%3B%0D%0A%20%20%20%20%20%20else%20if%20(this.Rotation%20%3C%201)%20this.Rotation%20%3D%20360%3B%0D%0A%20%20%20%20%20%20if%20(this.textBoxX%20!%3D%3D%20null%20%26%26%20this.textBoxY%20!%3D%3D%20null)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20%60%24%7B50%20%2B%20this.textBoxX%7D%25%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20%60%24%7B50%20%2B%20this.textBoxY%7D%25%60%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20overlay.style.transform%20%3D%20%60%0D%0A%20%20%20%20%20%20%20%20%20%20translate%24%7Bthis.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%22(-50%25%2C%20-50%25)%22%20%3A%20%60(%24%7B-50%20%2B%20this.textBoxX%7D%25%2C%20%24%7B-50%20%2B%20this.textBoxY%7D%25)%60%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20SkewX(%24%7Bthis.SkewX%7Ddeg)%20SkewY(%24%7Bthis.SkewY%7Ddeg)%0D%0A%20%20%20%20%20%20%20%20%20%20rotate(%24%7Bthis.Rotation%20-%2090%7Ddeg)%20scale(%24%7Bthis.Scale%20%2F%20100%7D)%0D%0A%20%20%20%20%20%20%20%20%60%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20%2250%25%22%3B%0D%0A%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20%2250%25%22%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20updateOverlay(overlay)%20%7B%0D%0A%20%20%20%20%20%20const%20newOpacity%20%3D%20%20this.Opacity%20%2F%20100%3B%0D%0A%20%20%20%20%20%20const%20newBrightness%20%3D%20this.Brightness%20%2B%20100%3B%0D%0A%20%20%20%20%20%20overlay.style.backgroundImage%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20overlay.style%5Bthis.textBoxColor%5B0%5D.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22backgroundColor%22%5D%20%3D%20this.textBoxColor%5B0%5D%3B%0D%0A%20%20%20%20%20%20overlay.style.boxShadow%20%3D%20this.shadowEnabled%20%3F%20%60%24%7Bthis.shadowS%5B0%5D%7Dpx%20%24%7Bthis.shadowS%5B1%5D%7Dpx%20%24%7Bthis.shadowS%5B2%5D%7Dpx%20%24%7Bthis.shadowS%5B3%5D%7D%60%20%3A%20%22none%22%3B%0D%0A%20%20%20%20%20%20overlay.style.transform%20%3D%20%60%0D%0A%20%20%20%20%20%20%20%20translate%24%7Bthis.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%22(-50%25%2C%20-50%25)%22%20%3A%20%60(%24%7B-50%20%2B%20this.textBoxX%7D%25%2C%20%24%7B-50%20%2B%20this.textBoxY%7D%25)%60%20%7D%0D%0A%20%20%20%20%20%20%20%20SkewX(%24%7Bthis.SkewX%7Ddeg)%20SkewY(%24%7Bthis.SkewY%7Ddeg)%0D%0A%20%20%20%20%20%20%20%20rotate(%24%7Bthis.Rotation%20-%2090%7Ddeg)%20scale(%24%7Bthis.Scale%20%2F%20100%7D)%0D%0A%20%20%20%20%20%20%60%3B%0D%0A%20%20%20%20%20%20overlay.style.filter%20%3D%20%60%0D%0A%20%20%20%20%20%20%20%20blur(%24%7Bthis.Blur%7Dpx)%20brightness(%24%7BnewBrightness%7D%25)%0D%0A%20%20%20%20%20%20%20%20invert(%24%7Bthis.Invert%7D%25)%20saturate(%24%7Bthis.Saturation%7D%25)%0D%0A%20%20%20%20%20%20%20%20hue-rotate(%24%7Bthis.Hue%7Ddeg)%20sepia(%24%7Bthis.Sepia%7D%25)%0D%0A%20%20%20%20%20%20%20%20contrast(%24%7Bthis.Contrast%7D%25)%0D%0A%20%20%20%20%20%20%60%3B%0D%0A%20%20%20%20%20%20overlay.style.opacity%20%3D%20newOpacity%3B%0D%0A%20%20%20%20%20%20overlay.style.border%20%3D%20this.mainUIinfo.overlayBord%3B%0D%0A%20%20%20%20%20%20overlay.style.padding%20%3D%20this.mainUIinfo.overlayPad%3B%0D%0A%20%20%20%20%20%20overlay.style.fontFamily%20%3D%20this.fontFamily%3B%0D%0A%20%20%20%20%20%20overlay.style.textAlign%20%3D%20this.textAlign%3B%0D%0A%20%20%20%20%20%20overlay.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.overlayRad%7Dpx%60%3B%0D%0A%20%20%20%20%20%20overlay.style.width%20%3D%20this.mainUIinfo.dimensions%5B0%5D%3B%0D%0A%20%20%20%20%20%20overlay.style.height%20%3D%20this.mainUIinfo.dimensions%5B1%5D%3B%0D%0A%20%20%20%20%20%20laidImgContain.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.overlayRad%7Dpx%60%3B%0D%0A%20%20%20%20%20%20laidImgContain.style.background%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20this.setImageStyles(laidImgContain%2C%20this.overlayImage%5B0%5D%2C%20this.imgScale%5B0%5D)%3B%0D%0A%20%20%20%20%20%20this.updateButtonImages(overlay)%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20updateButtonImages(overlay)%20%7B%0D%0A%20%20%20%20%20%20let%20text%20%3D%20overlay.querySelector(%22.question%22)%3B%0D%0A%20%20%20%20%20%20if%20(text)%20%7B%0D%0A%20%20%20%20%20%20%20%20text.style.color%20%3D%20this.questionColor%3B%0D%0A%20%20%20%20%20%20%20%20text.style.textShadow%20%3D%20this.mainUIinfo.overlayTxtShad%3B%0D%0A%20%20%20%20%20%20%20%20this.tryOutline(text%2C%20this.mainUIinfo.overlayOutline%5B0%5D%2C%20this.mainUIinfo.overlayOutline%5B1%5D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20inputField%20%3D%20overlay.querySelector(this.inputType.includes(%22Single%22)%20%3F%20%22select%22%20%3A%20%22input%22)%3B%0D%0A%20%20%20%20%20%20if%20(inputField)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20inpWidth%20%3D%20parseInt(this.mainUIinfo.dimensions%5B0%5D)%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.width%20%3D%20this.inputType%20%3D%3D%3D%20%22Color%22%20%7C%7C%20this.inputType.includes(%22Single%22)%20%3F%20%22100%25%22%20%3A%0D%0A%20%20%20%20%20%20%20%20%20%20this.inputType%20%3D%3D%3D%20%22Horizontal%20Slider%22%20%3F%20%2295%25%22%20%3A%20isNaN(inpWidth)%20%7C%7C%20this.inputType.includes(%22Dropdown%22)%20%3F%20%22auto%22%20%3A%20%60%24%7BinpWidth%20-%2010%7Dpx%60%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.background%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.fontFamily%20%3D%20this.fontFamily%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style%5Bthis.inputFieldColor.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22backgroundColor%22%5D%20%3D%20this.inputFieldColor%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.color%20%3D%20this.inputColor%3B%20inputField.style.accentColor%20%3D%20this.inputFieldColor%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.textShadow%20%3D%20this.mainUIinfo.inputTxtShad%3B%0D%0A%20%20%20%20%20%20%20%20this.tryOutline(inputField%2C%20this.mainUIinfo.inputOutline%5B0%5D%2C%20this.mainUIinfo.inputOutline%5B1%5D)%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.border%20%3D%20this.mainUIinfo.inputBord%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.inputRad%7Dpx%60%3B%0D%0A%20%20%20%20%20%20%20%20inputField.style.padding%20%3D%20this.mainUIinfo.inputPad%3B%0D%0A%20%20%20%20%20%20%20%20this.setImageStyles(inputField%2C%20this.overlayImage%5B1%5D%2C%20this.imgScale%5B1%5D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20const%20dropBtn%20%3D%20overlay.querySelector(%22button.dropbtn%22)%3B%0D%0A%20%20%20%20%20%20if%20(dropBtn)%20%7B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.backgroundImage%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.fontFamily%20%3D%20this.fontFamily%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.color%20%3D%20this.dropdwnBtnColor%5B1%5D%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.dropBtnRad%7Dpx%60%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.border%20%3D%20this.mainUIinfo.dropBtnBord%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.padding%20%3D%20this.mainUIinfo.dropBtnPad%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style.textShadow%20%3D%20this.mainUIinfo.dropBtnTxtShad%3B%0D%0A%20%20%20%20%20%20%20%20this.tryOutline(dropBtn%2C%20this.mainUIinfo.dropBtnOutline%5B0%5D%2C%20this.mainUIinfo.dropBtnOutline%5B1%5D)%3B%0D%0A%20%20%20%20%20%20%20%20dropBtn.style%5Bthis.dropdwnBtnColor%5B0%5D.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22backgroundColor%22%5D%20%3D%20this.dropdwnBtnColor%5B0%5D%3B%0D%0A%20%20%20%20%20%20%20%20this.setImageStyles(dropBtn%2C%20this.overlayImage%5B2%5D%2C%20this.imgScale%5B2%5D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20btnContain%20%3D%20overlay.querySelector(%22.button-container%22)%3B%0D%0A%20%20%20%20%20%20if%20(btnContain)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20buttons%20%3D%20btnContain.querySelectorAll(%22button%22)%3B%0D%0A%20%20%20%20%20%20%20%20buttons.forEach((button%2C%20index)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20buttonName%20%3D%20Object.keys(this.buttonJSON)%5Bindex%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20buttonInfo%20%3D%20this.buttonJSON%5BbuttonName%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(buttonInfo)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.color%20%3D%20buttonInfo.textColor%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.fontFamily%20%3D%20this.fontFamily%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.fontSize%20%3D%20this.fontSize%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.borderRadius%20%3D%20%60%24%7BbuttonInfo.borderRadius%7Dpx%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.border%20%3D%20buttonInfo.border%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.padding%20%3D%20buttonInfo.padding%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.textShadow%20%3D%20buttonInfo.dropShadow%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20this.tryOutline(button%2C%20buttonInfo.outline%5B0%5D%2C%20buttonInfo.outline%5B1%5D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.background%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style%5BbuttonInfo.color.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22background%22%5D%20%3D%20buttonInfo.color%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20this.setImageStyles(button%2C%20buttonInfo.image%2C%20buttonInfo.imgScale)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20tryOutline(element%2C%20color%2C%20thick)%20%7B%0D%0A%20%20%20%20%20%20element.style.webkitTextStrokeColor%20%3D%20color%3B%0D%0A%20%20%20%20%20%20element.style.webkitTextStrokeWidth%20%3D%20%60%24%7Bthick%7Dpx%60%3B%0D%0A%20%20%20%20%20%20%2F%2Fmulti-platform%20support%20cuz%20we%20cant%20have%20nice%20things%0D%0A%20%20%20%20%20%20element.style.textStrokeColor%20%3D%20color%3B%0D%0A%20%20%20%20%20%20element.style.textStrokeWidth%20%3D%20%60%24%7Bthick%7Dpx%60%3B%0D%0A%20%20%20%20%20%20element.style.mozTextStrokeColor%20%3D%20color%3B%0D%0A%20%20%20%20%20%20element.style.mozTextStrokeWidth%20%3D%20%60%24%7Bthick%7Dpx%60%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setImageStyles(element%2C%20url%2C%20scale)%20%7B%0D%0A%20%20%20%20%20%20if%20(Scratch.Cast.toString(url).length%20%3E%205)%20%7B%0D%0A%20%20%20%20%20%20%20%20Scratch.canFetch(encodeURI(url)).then((canFetch)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(canFetch)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20element.style.background%20%3D%20%60url(%24%7BencodeURI(url)%7D)%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20element.style.backgroundSize%20%3D%20%60%24%7Bscale%7D%25%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%20console.warn(%22Cannot%20fetch%20content%20from%20the%20URL%22)%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20showEffect(args)%20%7B%20return%20this%5Bargs.EFFECT%5D%20%7D%0D%0A%0D%0A%20%20%20%20setEffect(args)%20%7B%0D%0A%20%20%20%20%20%20this%5Bargs.EFFECT%5D%20%3D%20args.AMT%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20changeEffect(args)%20%7B%0D%0A%20%20%20%20%20%20const%20effect%20%3D%20args.EFFECT%3B%0D%0A%20%20%20%20%20%20this%5Beffect%5D%20%3D%20this%5Beffect%5D%20%2B%20args.AMT%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20resetEffect()%20%7B%0D%0A%20%20%20%20%20%20this.Blur%20%3D%200%3B%20this.Brightness%20%3D%200%3B%20this.Opacity%20%3D%20100%3B%20this.Invert%20%3D%200%3B%0D%0A%20%20%20%20%20%20this.Saturation%20%3D%20100%3B%20this.Hue%20%3D%200%3B%20this.Sepia%20%3D%200%3B%20this.Contrast%20%3D%20100%3B%0D%0A%20%20%20%20%20%20this.Scale%20%3D%20100%3B%20this.SkewX%20%3D%200%3B%20this.SkewY%20%3D%200%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setColorSettings(args)%20%7B%0D%0A%20%20%20%20%20%20const%20colorType%20%3D%20args.COLOR_TYPE%3B%0D%0A%20%20%20%20%20%20const%20colorValue%20%3D%20args.COLOR%3B%0D%0A%20%20%20%20%20%20const%20colorTypeMap%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%22Question%20Text%22%3A%20()%20%3D%3E%20this.questionColor%20%3D%20colorValue%2C%0D%0A%20%20%20%20%20%20%20%20%22Input%20Text%22%3A%20()%20%3D%3E%20this.inputColor%20%3D%20colorValue%2C%0D%0A%20%20%20%20%20%20%20%20%22Textbox%22%3A%20()%20%3D%3E%20%7B%20this.textBoxColor%5B0%5D%20%3D%20colorValue%3B%20this.overlayImage%5B0%5D%20%3D%20%22%20%22%3B%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%22Textbox%20Shadow%22%3A%20()%20%3D%3E%20%7B%20this.shadowS%5B3%5D%20%3D%20colorValue%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%22Input%20Box%22%3A%20()%20%3D%3E%20%7B%20this.inputFieldColor%20%3D%20colorValue%3B%20this.overlayImage%5B1%5D%20%3D%20%22%20%22%3B%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%22Dropdown%20Button%22%3A%20()%20%3D%3E%20%7B%20this.dropdwnBtnColor%5B0%5D%20%3D%20colorValue%3B%20this.overlayImage%5B2%5D%20%3D%20%22%20%22%3B%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%22Dropdown%20Text%22%3A%20()%20%3D%3E%20this.dropdwnBtnColor%5B1%5D%20%3D%20colorValue%2C%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20const%20buttonInfo%20%3D%20this.buttonJSON%5BcolorType%5D%20%7C%7C%20this.buttonJSON%5BcolorType.replace(%22%20Text%22%2C%20%22%22)%5D%3B%0D%0A%20%20%20%20%20%20if%20(buttonInfo)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(colorType.includes(%22%20Text%22))%20buttonInfo.textColor%20%3D%20colorValue%3B%0D%0A%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20buttonInfo.color%20%3D%20colorValue%3B%0D%0A%20%20%20%20%20%20%20%20%20%20buttonInfo.image%20%3D%20%22%20%22%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20const%20applyColor%20%3D%20colorTypeMap%5BcolorType%5D%3B%0D%0A%20%20%20%20%20%20if%20(applyColor)%20applyColor()%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20findGradientType(menu)%20%7B%0D%0A%20%20%20%20%20%20const%20colorTypeMap%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20Textbox%3A%20%7B%20newColorType%3A%20%22textBoxColor%22%2C%20ind%3A%200%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%22Dropdown%20Button%22%3A%20%7B%20newColorType%3A%20%22dropdwnBtnColor%22%2C%20ind%3A%202%20%7D%0D%0A%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20if%20(colorTypeMap%5Bmenu%5D)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20%7B%20newColorType%2C%20ind%20%7D%20%3D%20colorTypeMap%5Bmenu%5D%3B%0D%0A%20%20%20%20%20%20%20%20this.overlayImage%5Bind%5D%20%3D%20%22%20%22%3B%0D%0A%20%20%20%20%20%20%20%20return%20newColorType%3B%0D%0A%20%20%20%20%20%20%7D%20else%20if%20(this.buttonJSON%5Bmenu%5D)%20%7B%20return%20%5B%22button%22%2C%20menu%5D%20%7D%0D%0A%20%20%20%20%20%20return%20menu%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20callStyling(element%2C%20value%2C%20type%2C%20elements)%20%7B%0D%0A%20%20%20%20%20%20const%20elementID%20%3D%20elements%5Belement%5D%3B%0D%0A%20%20%20%20%20%20if%20(elementID%20!%3D%3D%20undefined)%20this.mainUIinfo%5BelementID%5D%20%3D%20value%3B%0D%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5Belement%5D)%20this.buttonJSON%5Belement%5D%5Btype%5D%20%3D%20value%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setBorder(args)%20%7B%0D%0A%20%20%20%20%20%20const%20width%20%3D%20Scratch.Cast.toNumber(args.WIDTH)%3B%0D%0A%20%20%20%20%20%20const%20string%20%3D%20%60%24%7Bwidth%7Dpx%20%24%7Bargs.TYPE%7D%20%24%7Bargs.COLOR%7D%60%3B%0D%0A%20%20%20%20%20%20this.callStyling(%0D%0A%20%20%20%20%20%20%20%20args.ELEMENT%2C%20string%2C%20%22border%22%2C%0D%0A%20%20%20%20%20%20%20%20%7B%20Textbox%3A%20%22overlayBord%22%2C%20%22Input%20Box%22%3A%20%22inputBord%22%2C%20%22Dropdown%20Button%22%3A%20%22dropBtnBord%22%20%7D%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setBorderRadius(args)%20%7B%0D%0A%20%20%20%20%20%20this.callStyling(%0D%0A%20%20%20%20%20%20%20%20args.ELEMENT%2C%20Math.max(args.VALUE%2C%200)%2C%20%22borderRadius%22%2C%0D%0A%20%20%20%20%20%20%20%20%7B%20Textbox%3A%20%22overlayRad%22%2C%20%22Input%20Box%22%3A%20%22inputRad%22%2C%20%22Dropdown%20Button%22%3A%20%22dropBtnRad%22%20%7D%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setPadding(args)%20%7B%0D%0A%20%20%20%20%20%20const%20casted%20%3D%20%5B%0D%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.N1)%2C%20Scratch.Cast.toNumber(args.N2)%2C%0D%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.N3)%2C%20Scratch.Cast.toNumber(args.N4)%0D%0A%20%20%20%20%20%20%5D%3B%0D%0A%20%20%20%20%20%20let%20pad%20%3D%20%60%24%7Bcasted%5B0%5D%7Dpx%20%24%7Bcasted%5B1%5D%7Dpx%20%24%7Bcasted%5B2%5D%7Dpx%20%24%7Bcasted%5B3%5D%7Dpx%60%3B%0D%0A%20%20%20%20%20%20this.callStyling(%0D%0A%20%20%20%20%20%20%20%20args.ELEMENT%2C%20pad%2C%20%22padding%22%2C%0D%0A%20%20%20%20%20%20%20%20%7B%20Textbox%3A%20%22overlayPad%22%2C%20%22Input%20Box%22%3A%20%22inputPad%22%2C%20%22Dropdown%20Button%22%3A%20%22dropBtnPad%22%20%7D%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setDropShadow(args)%20%7B%0D%0A%20%20%20%20%20%20const%20casted%20%3D%20%5B%0D%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.x)%2C%20Scratch.Cast.toNumber(args.y)%2C%20Scratch.Cast.toNumber(args.z)%0D%0A%20%20%20%20%20%20%5D%3B%0D%0A%20%20%20%20%20%20let%20shadow%20%3D%20args.z%20%3D%3D%3D%200%20%3F%20%22none%22%20%3A%20%60%24%7Bcasted%5B0%5D%7Dpx%20%24%7Bcasted%5B1%5D%20*%20-1%7Dpx%20%24%7Bcasted%5B2%5D%7Dpx%20%24%7Bargs.COLOR%7D%60%3B%0D%0A%20%20%20%20%20%20this.callStyling(%0D%0A%20%20%20%20%20%20%20%20args.ELEMENT.slice(0%2C%20-5)%2C%20shadow%2C%20%22dropShadow%22%2C%0D%0A%20%20%20%20%20%20%20%20%7B%20%22Question%22%3A%20%22overlayTxtShad%22%2C%20%22Input%22%3A%20%22inputTxtShad%22%2C%20%22Dropdown%22%3A%20%22dropBtnTxtShad%22%20%7D%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setOutline(args)%20%7B%0D%0A%20%20%20%20%20%20const%20thick%20%3D%20Scratch.Cast.toNumber(args.THICK)%3B%0D%0A%20%20%20%20%20%20this.callStyling(%0D%0A%20%20%20%20%20%20%20%20args.ELEMENT.slice(0%2C%20-5)%2C%20%5Bargs.COLOR%2C%20thick%5D%2C%20%22outline%22%2C%0D%0A%20%20%20%20%20%20%20%20%7B%20%22Question%22%3A%20%22overlayOutline%22%2C%20%22Input%22%3A%20%22inputOutline%22%2C%20%22Dropdown%22%3A%20%22dropBtnOutline%22%20%7D%0D%0A%20%20%20%20%20%20)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setShadow(args)%20%7B%0D%0A%20%20%20%20%20%20const%20shadowMap%20%3D%20%7B%20Size%3A%202%2C%20X%3A%200%2C%20Y%3A%201%20%7D%3B%0D%0A%20%20%20%20%20%20const%20propertyIndex%20%3D%20shadowMap%5Bargs.SHADOW%5D%3B%0D%0A%20%20%20%20%20%20if%20(propertyIndex%20!%3D%3D%20undefined)%20this.shadowS%5BpropertyIndex%5D%20%3D%20args.AMT%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setImage(args)%20%7B%0D%0A%20%20%20%20%20%20const%20elementMap%20%3D%20%7B%20Textbox%3A%200%2C%20%22Input%20Box%22%3A%201%2C%20%22Dropdown%20Button%22%3A%202%20%7D%3B%0D%0A%20%20%20%20%20%20const%20elementIndex%20%3D%20elementMap%5Bargs.ELEMENT%5D%3B%0D%0A%20%20%20%20%20%20if%20(elementIndex%20!%3D%3D%20undefined)%20this.overlayImage%5BelementIndex%5D%20%3D%20args.IMAGE%3B%0D%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5Bargs.ELEMENT%5D)%20this.buttonJSON%5Bargs.ELEMENT%5D.image%20%3D%20args.IMAGE%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20scaleImage(args)%20%7B%0D%0A%20%20%20%20%20%20const%20elementMap%20%3D%20%7B%20Textbox%3A%200%2C%20%22Input%20Box%22%3A%201%2C%20%22Dropdown%20Button%22%3A%202%20%7D%3B%0D%0A%20%20%20%20%20%20const%20elementIndex%20%3D%20elementMap%5Bargs.ELEMENT%5D%3B%0D%0A%20%20%20%20%20%20if%20(elementIndex%20!%3D%3D%20undefined)%20this.imgScale%5BelementIndex%5D%20%3D%20args.SCALE%3B%0D%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5Bargs.ELEMENT%5D)%20this.buttonJSON%5Bargs.ELEMENT%5D.imgScale%20%3D%20args.SCALE%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setDimension(args)%20%7B%0D%0A%20%20%20%20%20%20const%20w%20%3D%20%60%24%7BScratch.Cast.toNumber(args.W)%7Dpx%60%3B%0D%0A%20%20%20%20%20%20const%20h%20%3D%20%60%24%7BScratch.Cast.toNumber(args.H)%7Dpx%60%3B%0D%0A%20%20%20%20%20%20%2F%2F%20Negative%20numbers%20result%20in%20auto-dimensions%0D%0A%20%20%20%20%20%20this.mainUIinfo.dimensions%20%3D%20%5Bw.includes(%22-%22)%20%3F%20%22auto%22%20%3A%20w%2C%20h.includes(%22-%22)%20%3F%20%22auto%22%20%3A%20h%5D%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setDirection(args)%20%7B%0D%0A%20%20%20%20%20%20this.Rotation%20%3D%20Scratch.Cast.toNumber(args.ROTATE)%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20changeDirection(args)%20%7B%0D%0A%20%20%20%20%20%20this.Rotation%20%3D%20this.Rotation%20%2B%20Scratch.Cast.toNumber(args.ROTATE)%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20reportDirection()%20%7B%20return%20this.Rotation%20%7D%0D%0A%0D%0A%20%20%20%20setPrePosition(args)%20%7B%0D%0A%20%20%20%20%20%20this.textBoxX%20%3D%20Scratch.Cast.toNumber(args.X)%20%2F%20(screen.width%20%2F%20400)%3B%0D%0A%20%20%20%20%20%20this.textBoxY%20%3D%20Scratch.Cast.toNumber(args.Y)%20%2F%20(screen.height%20%2F%20-300)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setPosition(args)%20%7B%0D%0A%20%20%20%20%20%20this.textBoxX%20%3D%20Scratch.Cast.toNumber(args.X)%20%2F%20(screen.width%20%2F%20400)%3B%0D%0A%20%20%20%20%20%20this.textBoxY%20%3D%20Scratch.Cast.toNumber(args.Y)%20%2F%20(screen.height%20%2F%20-300)%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlayPos(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20changePosition(args)%20%7B%0D%0A%20%20%20%20%20%20this.textBoxX%20%3D%20this.textBoxX%20%2B%20Scratch.Cast.toNumber(args.X)%20%2F%20(screen.width%20%2F%20400)%3B%0D%0A%20%20%20%20%20%20this.textBoxY%20%3D%20this.textBoxY%20%2B%20Scratch.Cast.toNumber(args.Y)%20%2F%20(screen.height%20%2F%20-300)%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlayPos(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getXpos()%20%7B%20return%20this.textBoxX%20*%20(screen.width%20%2F%20400)%20%7D%0D%0A%20%20%20%20getYpos()%20%7B%20return%20this.textBoxY%20*%20(screen.height%20%2F%20-300)%20%7D%0D%0A%0D%0A%20%20%20%20setFontSize(args)%20%7B%20this.fontSize%20%3D%20args.SIZE%20%2B%20%22px%22%20%7D%0D%0A%0D%0A%20%20%20%20setTextAlignment(args)%20%7B%0D%0A%20%20%20%20%20%20this.textAlign%20%3D%20args.ALIGNMENT%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setFontFamily(args)%20%7B%0D%0A%20%20%20%20%20%20this.fontFamily%20%3D%20args.FONT%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setSlider(args)%20%7B%20this.sliderInfo%20%3D%20%5Bargs.MIN%2C%20args.MAX%2C%20args.DEFAULT%5D%20%7D%0D%0A%0D%0A%20%20%20%20setInputType(args)%20%7B%0D%0A%20%20%20%20%20%20if%20(args.ACTION%20%3D%3D%3D%20%22Text%22%20%7C%7C%20args.ACTION%20%3D%3D%3D%20%20%22None%22)%20this.inputType%20%3D%20args.ACTION%20%3D%3D%3D%20%22Text%22%20%3F%20%22Enabled%22%20%3A%20%22Disabled%22%3B%0D%0A%20%20%20%20%20%20else%20this.inputType%20%3D%20args.ACTION%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20enableShadow(args)%20%7B%20this.shadowEnabled%20%3D%20args.ACTION%20%3D%3D%3D%20%22Enabled%22%20%7D%0D%0A%0D%0A%20%20%20%20setButtonText(args)%20%7B%0D%0A%20%20%20%20%20%20const%20buttonMenu%20%3D%20args.BUTTON_MENU%3B%0D%0A%20%20%20%20%20%20const%20text%20%3D%20args.TEXT%3B%0D%0A%20%20%20%20%20%20if%20(buttonMenu%20%3D%3D%3D%20%22Dropdown%22)%20this.DropdownText%20%3D%20text%3B%0D%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5BbuttonMenu%5D)%20%7B%0D%0A%20%20%20%20%20%20%20%20this.buttonJSON%5BbuttonMenu%5D.name%20%3D%20text%3B%0D%0A%20%20%20%20%20%20%20%20vm.extensionManager.refreshBlocks()%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setDropdown(args)%20%7B%0D%0A%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20this.optionList%20%3D%20JSON.parse(args.DROPDOWN)%3B%0D%0A%20%20%20%20%20%20%7D%20catch%20%7B%20this.optionList%20%3D%20%5B%22Invalid%20Array%22%5D%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20removeAskBoxes()%20%7B%0D%0A%20%20%20%20%20%20const%20overlaysToRemove%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(overlay)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%26%26%20overlay.parentNode)%20overlay.parentNode.removeChild(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20else%20if%20(overlay.parentNode.parentNode%20!%3D%3D%20document.documentElement)%20overlay.parentNode.parentNode.removeChild(overlay.parentNode)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlaysToRemove.push(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20if%20(this.askBoxPromises)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20index%20%3D%20this.activeOverlays.indexOf(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(index%20!%3D%3D%20-1)%20this.askBoxPromises%5Bindex%5D.resolve(%22removed%22)%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.askBoxPromises%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20this.activeOverlays%20%3D%20this.activeOverlays.filter((overlay)%20%3D%3E%20!overlaysToRemove.includes(overlay))%3B%0D%0A%20%20%20%20%20%20this.askBoxInfo%5B0%5D%20%3D%200%3B%0D%0A%20%20%20%20%20%20this.isDropdownOpen%20%3D%20false%3B%0D%0A%20%20%20%20%20%20const%20bugged%20%3D%20document.querySelectorAll(%60div%5Bclass%5E%3D%22SP-ask-box%22%5D%60)%3B%0D%0A%20%20%20%20%20%20bugged.forEach((box)%20%3D%3E%20%7B%20box.parentNode.removeChild(box)%20%7D)%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20resetInput()%20%7B%20this.userInput%20%3D%20this.askBoxInfo%5B1%5D%20%3E%201%20%3F%20%5B%5D%20%3A%20%22%22%20%7D%0D%0A%0D%0A%20%20%20%20askAndWaitForInput(args)%20%7B%0D%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B0%5D%20%3C%20this.askBoxInfo%5B1%5D%20)%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20this.askAndWait(args).then(()%20%3D%3E%20%7B%20return%20this.getUserInput()%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20askAndWait(args)%20%7B%0D%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B0%5D%20%3C%20this.askBoxInfo%5B1%5D)%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20question%20%3D%20args.question%3B%0D%0A%20%20%20%20%20%20%20%20let%20hasDecreased%20%3D%20false%3B%20%2F%2F%20for%20the%20box%20counter%0D%0A%20%20%20%20%20%20%20%20const%20index%20%3D%20this.askBoxInfo%5B0%5D%3B%0D%0A%20%20%20%20%20%20%20%20this.lastPressBtn%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20this.askBoxInfo%5B0%5D%2B%2B%3B%0D%0A%20%20%20%20%20%20%20%20let%20selectOpts%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20%20%20return%20new%20Promise((resolve)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20this.askBoxPromises.push(%7B%20resolve%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20overlay%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.classList.add(%22SP-ask-box%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.pointerEvents%20%3D%20%22auto%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.position%20%3D%20%22fixed%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.fontSize%20%3D%20this.fontSize%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%60%24%7B50%20%2B%20this.textBoxX%7D%25%60%20%3A%20%220%25%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%60%24%7B50%20%2B%20this.textBoxY%7D%25%60%20%3A%20%220%25%22%3B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20const%20focusBG%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20focusBG.style.cssText%20%3D%20%22pointer-events%3A%20auto%3B%20position%3A%20fixed%3B%20width%3A%20100%25%3B%20height%3A%20100%25%3B%20background-color%3A%20rgba(0%2C%200%2C%200%2C%200.5)%3B%20z-index%3A%209998%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20focusBG.className%20%3D%20%22SP-ask-boxBG%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20focusBG.id%20%3D%20this.appendTarget%5B0%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20focusBG.style.left%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%220%25%22%20%3A%20%22-50%25%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20focusBG.style.top%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%220%25%22%20%3A%20%22-50%25%22%3B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain.style.width%20%3D%20%22100%25%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain.style.height%20%3D%20%22100%25%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain.style.position%20%3D%20%22absolute%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain.style.top%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain.style.left%20%3D%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20laidImgContain.style.zIndex%20%3D%20%22-1%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.forceInput%20!%3D%3D%20%22Disabled%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20overlayInput%20%3D%20this.forceInput%20%3D%3D%3D%20%22Enter%20Key%22%20%3F%20%22Enter%22%20%3A%20this.forceInput%20%3D%3D%3D%20%22Shift%20%2B%20Enter%20Key%22%20%3F%20%22ShiftEnter%22%20%3A%20this.forceInput%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20handleKeydown%20%3D%20(event)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20((overlayInput%20%3D%3D%3D%20%22ShiftEnter%22%20%26%26%20event.shiftKey%20%26%26%20event.key%20%3D%3D%3D%20%22Enter%22)%20%7C%7C%20event.key%20%3D%3D%3D%20overlayInput)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(inputField.value)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.closeOverlay(overlay%2C%20hasDecreased)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hasDecreased%20%3D%20true%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20observer%20%3D%20new%20MutationObserver((mutationsList)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20mutation%20of%20mutationsList)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(mutation.type%20%3D%3D%3D%20%22childList%22%20%26%26%20!document.contains(overlay))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22keydown%22%2C%20handleKeydown)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20observer.disconnect()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20observer.observe(document.body%2C%20%7B%20childList%3A%20true%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22keydown%22%2C%20handleKeydown)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20const%20questionText%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20questionText.classList.add(%22question%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20questionText.style.fontSize%20%3D%20this.fontSize%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B0%5D%20!%3D%3D%20%22question%22)%20questionText.style.marginTop%20%3D%20%2210px%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B0%5D%20%3D%3D%3D%20%22question%22)%20questionText.style.marginBottom%20%3D%20%2210px%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20questionText.innerHTML%20%3D%20xmlEscape(question).replace(%2F%5Cn%2Fg%2C%20%22%3Cbr%3E%22)%3B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20const%20inputField%20%3D%20document.createElement(%22input%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.style.display%20%3D%20this.inputType%20%3F%20%22block%22%20%3A%20%22none%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.style.fontSize%20%3D%20this.fontSize%3B%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.style.margin%20%3D%20%220%20auto%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.type%20%3D%20this.inputType.toLowerCase()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20setInpValue%20%3D%20(val)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20inputField.value%20%3D%20val%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.askBoxInfo%5B1%5D%20%3D%3D%201)%20this.userInput%20%3D%20inputField.value%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20newInput%20%3D%20%5B...this.userInput%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20newInput%5Bindex%5D%20%3D%20inputField.value%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.userInput%20%3D%20newInput%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.addEventListener(%22input%22%2C%20()%20%3D%3E%20%7B%20setInpValue(inputField.value)%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20const%20btnContain%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20btnContain.classList.add(%22button-container%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20buttonName%20in%20this.buttonJSON)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20btnInfo%20%3D%20this.buttonJSON%5BbuttonName%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(btnInfo.name.includes(%22%3Cnewline%3E%22))%20btnContain.appendChild(document.createElement(%22br%22))%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20btn%20%3D%20document.createElement(%22button%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B0%5D%20!%3D%3D%20%22buttons%22)%20btn.style.marginTop%20%3D%20%2210px%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B2%5D%20!%3D%3D%20%22buttons%22)%20btn.style.marginBottom%20%3D%20%2210px%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20btn.style.marginRight%20%3D%20%225px%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20btn.style.cursor%20%3D%20%22pointer%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20btn.innerHTML%20%3D%20xmlEscape(btnInfo.name).replace(%2F%5Cn%2Fg%2C%20%22%3Cbr%3E%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20btn.style.display%20%3D%20%22inline-block%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20btn.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.lastPressBtn%20%3D%20btnInfo.name%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(this.inputType%20%3D%3D%3D%20%22Disabled%22%20%3F%20btnInfo.name%20%3A%20this.userInput)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.closeOverlay(overlay%2C%20hasDecreased)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hasDecreased%20%3D%20true%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20btnContain.appendChild(btn)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20let%20dropdwnCont%2C%20dropdwnBtn%2C%20sliderContain%2C%20valTxt%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.inputType.includes(%22Dropdown%22))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20dropdown%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20dropdown.className%20%3D%20%22dropdown%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.inputType%20%3D%3D%3D%20%22Single%20Dropdown%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn%20%3D%20document.createElement(%22select%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.optionList.forEach((label)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20opt%20%3D%20document.createElement(%22option%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opt.value%20%3D%20label%3B%20opt.text%20%3D%20label%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn.appendChild(opt)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn.addEventListener(%22input%22%2C%20()%20%3D%3E%20%7B%20setInpValue(dropdwnBtn.value)%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn.value%20%3D%20this.defaultValue%20%7C%7C%20dropdwnBtn.value%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(dropdwnBtn.value)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20isMulti%20%3D%20this.inputType.includes(%22Multi-Select%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20defaultOpts%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isMulti)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultOpts%20%3D%20JSON.parse(this.defaultValue)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectOpts%20%3D%20defaultOpts%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn%20%3D%20document.createElement(%22button%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn.className%20%3D%20%22dropbtn%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn.innerHTML%20%3D%20xmlEscape(this.DropdownText).replace(%2F%5Cn%2Fg%2C%20%22%3Cbr%3E%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnCont%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnCont.id%20%3D%20%22myDropdown%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnCont.className%20%3D%20%22dropdown-content%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnCont.style.display%20%3D%20%22none%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.optionList.forEach((label%2C%20index)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20optTxt%20%3D%20document.createElement(%22label%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optTxt.style.color%20%3D%20this.questionColor%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optTxt.textContent%20%3D%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20optRadio%20%3D%20document.createElement(%22input%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optRadio.type%20%3D%20this.inputType%20%3D%3D%3D%20%22Dropdown%22%20%3F%20%22radio%22%20%3A%20%22checkbox%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isMulti)%20optRadio.checked%20%3D%20defaultOpts.indexOf(label)%20%3E%20-1%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20optRadio.checked%20%3D%20label%20%3D%3D%3D%20this.defaultValue%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optRadio.name%20%3D%20%22dropdownOptions%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optRadio.value%20%3D%20index%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optRadio.classList.add(%22dropdown-radio%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optRadio.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isMulti)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(selectOpts.includes(label))%20selectOpts%20%3D%20selectOpts.filter(item%20%3D%3E%20item%20!%3D%3D%20label)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20selectOpts.push(label)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inputField.value%20%3D%20selectOpts.length%20%3E%200%20%3F%20JSON.stringify(selectOpts)%20%3A%20%22%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%20inputField.value%20%3D%20label%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(inputField.value)%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optTxt.append(optRadio%2C%20document.createTextNode(%22%20%22%20%2B%20label)%2C%20document.createElement(%22br%22))%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnCont.appendChild(optTxt)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnBtn.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.lastPressBtn%20%3D%20this.DropdownText%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dropdwnCont.style.display%20%3D%20this.isDropdownOpen%20%3F%20%22none%22%20%3A%20%22block%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.isDropdownOpen%20%3D%20!this.isDropdownOpen%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(this.defaultValue)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(this.inputType.includes(%22Slider%22))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sliderContain%20%3D%20document.createElement(%22div%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sliderContain.classList.add(%22slider-container%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20slider%20%3D%20document.createElement(%22input%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20slider.type%20%3D%20%22range%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20slider.min%20%3D%20this.sliderInfo%5B0%5D%3B%20slider.max%20%3D%20this.sliderInfo%5B1%5D%3B%20slider.value%20%3D%20this.sliderInfo%5B2%5D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.inputType.includes(%22Vertical%22))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20slider.style.writingMode%20%3D%20%22vertical-lr%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20slider.style.direction%20%3D%20%22rtl%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sliderContain.appendChild(slider)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20valTxt%20%3D%20document.createElement(%22span%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20valTxt.classList.add(%22slider-value%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20sliderContain.appendChild(valTxt)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20valTxt.style.color%20%3D%20this.questionColor%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20valTxt.textContent%20%3D%20slider.value%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20slider.addEventListener(%22input%22%2C%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20valTxt.textContent%20%3D%20slider.value%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(valTxt.textContent)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(valTxt.textContent)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20item%20of%20this.uiOrder)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20switch%20(item)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20%22question%22%3A%20%7B%20overlay.appendChild(questionText)%3B%20break%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20%22input%22%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.inputType%20!%3D%3D%20%22Disabled%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20createBr%20%3D%20()%20%3D%3E%20%7B%20return%20document.createElement(%22br%22)%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.inputType%20%3D%3D%3D%20%22Single%20Dropdown%22)%20overlay.append(dropdwnBtn%2C%20createBr())%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(this.inputType.includes(%22Dropdown%22))%20overlay.append(dropdwnBtn%2C%20dropdwnCont%2C%20createBr())%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(this.inputType.includes(%22Slider%22))%20overlay.append(sliderContain%2C%20valTxt%2C%20createBr())%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setInpValue(this.defaultValue)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(inputField)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20%22buttons%22%3A%20%7B%20overlay.appendChild(btnContain)%3B%20break%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20overlay.appendChild(laidImgContain)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.body.appendChild(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B1%5D)%20document.body.appendChild(focusBG)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.focus()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20this.activeOverlays.push(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20resizeHandler%20%3D%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20%60%24%7Bthis.textBoxX%20!%3D%3D%20null%20%3F%2050%20%2B%20this.textBoxX%20%3A%2050%7D%25%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20%60%24%7Bthis.textBoxY%20!%3D%3D%20null%20%3F%2050%20%2B%20this.textBoxY%20%3A%2050%7D%25%60%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22fullscreenchange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22webkitfullscreenchange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22mozfullscreenchange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22MSFullscreenChange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20observer%20%3D%20new%20MutationObserver((mutationsList)%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20mutation%20of%20mutationsList)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(mutation.type%20%3D%3D%3D%20%22childList%22%20%26%26%20Array.from(mutation.removedNodes).includes(overlay))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22fullscreenchange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22webkitfullscreenchange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22mozfullscreenchange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22MSFullscreenChange%22%2C%20resizeHandler)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20observer.disconnect()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20observer.observe(overlay.parentNode%2C%20%7B%20childList%3A%20true%20%7D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20document.body.appendChild(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B1%5D)%20vm.renderer.addOverlay(focusBG%2C%20%22scale-centered%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20vm.renderer.addOverlay(overlay%2C%20%22scale-centered%22)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20inputField.focus()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20overlay.style.zIndex%20%3D%20%229999%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20else%20overlay.parentNode.style.zIndex%20%3D%20%229999%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20this.updateOverlay(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20closeOverlay(overlay%2C%20doneBefore)%20%7B%0D%0A%20%20%20%20%20%20this.isDropdownOpen%20%3D%20false%3B%0D%0A%20%20%20%20%20%20if%20(!doneBefore)%20%7B%0D%0A%20%20%20%20%20%20%20%20this.askBoxInfo%5B0%5D--%3B%0D%0A%20%20%20%20%20%20%20%20let%20usedBG%20%3D%20document.querySelectorAll(%60div%5Bclass%3D%22SP-ask-boxBG%22%5D%60)%3B%0D%0A%20%20%20%20%20%20%20%20usedBG%20%3D%20usedBG%5BusedBG.length%20-%201%5D%3B%0D%0A%20%20%20%20%20%20%20%20%2F%2F%20%5E%20Prioritizes%20Textboxes%20on%20Window%0D%0A%20%20%20%20%20%20%20%20const%20index%20%3D%20this.activeOverlays.indexOf(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20setTimeout(()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(index%20!%3D%3D%20-1)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20this.activeOverlays.splice(index%2C%201)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20this.askBoxPromises.splice(index%2C%201)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20document.body.removeChild(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20else%20vm.renderer.removeOverlay(overlay)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20if%20(usedBG)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(usedBG.id%20%3D%3D%3D%20%22window%22)%20document.body.removeChild(usedBG)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20vm.renderer.removeOverlay(usedBG)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%2C%20this.Timeout%20*%201000)%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setButton(args)%20%7B%0D%0A%20%20%20%20%20%20if%20(args.BUTTON%20%3D%3D%3D%20%22add%22)%20%7B%0D%0A%20%20%20%20%20%20%20%20this.buttonJSON%5Bargs.NAME%5D%20%3D%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%205%2C%20border%3A%20%221px%20none%20%23000000%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%22%230074D9%22%2C%20textColor%3A%20%22%23ffffff%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20name%3A%20args.NAME%2C%20padding%3A%20%225px%2010px%22%2C%0D%0A%20%20%20%20%20%20%20%20%20%20image%3A%20%22%22%2C%20imgScale%3A%20100%2C%0D%0A%20%20%20%20%20%20%20%20%20%20dropShadow%3A%20%22none%22%2C%20outline%3A%20%5B%22%22%2C%200%5D%0D%0A%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%20delete%20this.buttonJSON%5Bargs.NAME%5D%20%7D%0D%0A%20%20%20%20%20%20vm.extensionManager.refreshBlocks()%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20deleteAllButtons()%20%7B%0D%0A%20%20%20%20%20%20this.buttonJSON%20%3D%20%7B%7D%3B%0D%0A%20%20%20%20%20%20vm.extensionManager.refreshBlocks()%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20lastButton()%20%7B%20return%20this.lastPressBtn%20%7D%0D%0A%0D%0A%20%20%20%20isWaitingInput()%20%7B%20return%20this.activeOverlays.length%20%3E%200%20%7D%0D%0A%0D%0A%20%20%20%20isDropdown()%20%7B%20return%20this.isDropdownOpen%20%7D%0D%0A%0D%0A%20%20%20%20setMaxBoxCount(args)%20%7B%0D%0A%20%20%20%20%20%20this.askBoxInfo%5B1%5D%20%3D%20Scratch.Cast.toNumber(args.MAX)%3B%0D%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B1%5D%20%3E%201%20%26%26%20!Array.isArray(this.userInput))%20this.userInput%20%3D%20%5Bthis.userInput%5D%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setTimeout(args)%20%7B%20this.Timeout%20%3D%20Scratch.Cast.toNumber(args.TIME)%20%7D%0D%0A%0D%0A%20%20%20%20reportTimeout()%20%7B%20return%20this.Timeout%20%7D%0D%0A%0D%0A%20%20%20%20getUserInput()%20%7B%0D%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B1%5D%20%3E%201)%20return%20this.userInput%20%3D%3D%3D%20null%20%3F%20%22%5B%5D%22%20%3A%20JSON.stringify(this.userInput)%3B%0D%0A%20%20%20%20%20%20else%20return%20this.userInput%20%3D%3D%3D%20null%20%3F%20%22%22%20%3A%20this.userInput%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getBoxInfo(args)%20%7B%0D%0A%20%20%20%20%20%20if%20(args.INFO.includes(%22button%22))%20%7B%0D%0A%20%20%20%20%20%20%20%20const%20buttons%20%3D%20Object.keys(this.buttonJSON)%3B%0D%0A%20%20%20%20%20%20%20%20return%20args.INFO.includes(%22names%22)%20%3F%20JSON.stringify(buttons)%20%3A%20buttons.length%3B%0D%0A%20%20%20%20%20%20%7D%20else%20%7B%20return%20this.askBoxInfo%5Bargs.INFO%20%3D%3D%3D%20%22count%22%20%3F%200%20%3A%201%5D%20%7D%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20setSubmitEvent(args)%20%7B%20this.forceInput%20%3D%20args.ENTER%20%7D%0D%0A%0D%0A%20%20%20%20setDefaultV(args)%20%7B%20this.defaultValue%20%3D%20args.defaultV%20%7D%0D%0A%0D%0A%20%20%20%20setAppend(args)%20%7B%20this.appendTarget%5B0%5D%20%3D%20args.TARGET%20%7D%0D%0A%20%20%20%20setFocus(args)%20%7B%20this.appendTarget%5B1%5D%20%3D%20args.TYPE%20%3D%3D%3D%20%22Enabled%22%20%7D%0D%0A%0D%0A%20%20%20%20setUI(args)%20%7B%0D%0A%20%20%20%20%20%20let%20array%3B%0D%0A%20%20%20%20%20%20try%20%7B%20array%20%3D%20JSON.parse(args.ARRAY.toLowerCase())%20%7D%20catch%20%7B%20return%20%7D%0D%0A%20%20%20%20%20%20if%20(!Array.isArray(array))%20return%3B%0D%0A%20%20%20%20%20%20const%20allowedUI%20%3D%20%5B%22question%22%2C%20%22input%22%2C%20%22buttons%22%5D%3B%0D%0A%20%20%20%20%20%20let%20filteredArray%20%3D%20%5B...new%20Set(array.filter(element%20%3D%3E%20allowedUI.includes(element)))%5D%3B%0D%0A%20%20%20%20%20%20allowedUI.forEach(element%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(!filteredArray.includes(element))%20filteredArray.push(element)%3B%0D%0A%20%20%20%20%20%20%7D)%3B%0D%0A%20%20%20%20%20%20this.uiOrder%20%3D%20filteredArray%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20getUIOrder()%20%7B%20return%20JSON.stringify(this.uiOrder)%20%7D%0D%0A%0D%0A%20%20%20%20%2F%2F%20deprecated%0D%0A%20%20%20%20setEnable()%20%7B%20throw%20new%20Error(%22This%20Block%20has%20been%20removed%20since%20Better%20Input%20V3.%20Please%20use%20the%20New%20Powerful%20Blocks%22)%20%7D%0D%0A%20%20%20%20getBoxCount()%20%7B%20return%20this.askBoxInfo%5B0%5D%20%7D%0D%0A%20%20%20%20getMaxCount()%20%7B%20return%20this.askBoxInfo%5B1%5D%20%7D%0D%0A%20%20%20%20setGradient(t)%7Bif(%22Input%20Box%22%3D%3D%3Dt.COLOR_TYPE)throw%20Error(%22As%20of%20Better%20Input%20V4%2C%20this%20Option%20no%20Longer%20Works%22)%3Blet%20i%3Dthis.findGradientType(t.COLOR_TYPE)%2Ce%3D%60linear-gradient(%24%7Bt.DIR-90%7Ddeg%2C%20%24%7Bt.COLOR2%7D%2C%20%24%7Bt.COLOR1%7D)%60%3B%22button%22!%3D%3Di%5B0%5D%3Fthis%5Bi%5D%5B0%5D%3De%3Athis.buttonJSON%5Bi%5B1%5D%5D.color%3De%2Cthis.activeOverlays.forEach(t%3D%3E%7Bthis.updateOverlay(t)%7D)%7D%0D%0A%20%20%20%20setCircleGradient(t)%7Blet%20i%3Dthis.findGradientType(t.COLOR_TYPE)%2Ce%3D%5Bt.X%2B50%2Ct.Y%2B50%5D%2Cn%3D%60radial-gradient(circle%20at%20%24%7Be%5B0%5D%7D%25%20%24%7Be%5B1%5D%7D%25%2C%20%24%7Bt.COLOR2%7D%2C%20%24%7Bt.COLOR1%7D)%60%3B%22button%22!%3D%3Di%5B0%5D%3Fthis%5Bi%5D%5B0%5D%3Dn%3Athis.buttonJSON%5Bi%5B1%5D%5D.color%3Dn%2Cthis.activeOverlays.forEach(t%3D%3E%7Bthis.updateOverlay(t)%7D)%7D%0D%0A%20%20%7D%0D%0A%0D%0A%20%20Scratch.extensions.register(new%20BetterInputSP())%3B%0D%0A%7D)(Scratch)%3B%0D%0A%20%7D)(Scratch)%3B"]) {
vm.extensionManager.loadExtensionURL(extension);
}
vm.runtime.isProjectPermissionManagerDisabled = true;
vm.runtime.extensionRuntimeOptions.javascriptUnsandboxed = 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>