-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
330 lines (307 loc) · 131 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
329
330
<!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>GGB</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 {
background-image: url(data:image/png;base64,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);
background-repeat: no-repeat;
background-size: contain;
background-position: center;
}
.progress-bar-outer {
border: 1px solid currentColor;
height: 10px;
width: 200px;
max-width: 200px;
}
.progress-bar-inner {
height: 100%;
width: 0;
background-color: currentColor;
}
.loading-text, noscript {
font-weight: normal;
font-size: 36px;
margin: 0 0 16px;
}
.loading-image {
margin: 0 0 16px;
}
#error-message, #error-stack {
font-family: monospace;
max-width: 600px;
white-space: pre-wrap;
user-select: text;
-webkit-user-select: text;
}
#error-stack {
text-align: left;
max-height: 200px;
overflow: auto;
}
.control-button {
width: 2rem;
height: 2rem;
padding: 0.375rem;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
user-select: none;
-webkit-user-select: none;
cursor: pointer;
border: 0;
border-radius: 4px;
}
.control-button:hover {
background: #00c3ff26;
}
.control-button.active {
background: #00c3ff59;
}
.fullscreen-button {
background: white !important;
}
.standalone-fullscreen-button {
position: absolute;
top: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 0 0 0 4px;
padding: 4px;
cursor: pointer;
}
.sc-canvas {
cursor: auto;
}
.sc-monitor-root[data-opcode^="data_"] .sc-monitor-value-color {
background-color: #ff8c1a;
}
.sc-monitor-row-value-outer {
background-color: #fc662c;
}
.sc-monitor-row-value-editing .sc-monitor-row-value-outer {
background-color: #e25b27;
}
</style>
<meta name="theme-color" content="#000000">
<link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIzNDAuODIxMDMiIGhlaWdodD0iMzQ0LjYzNjE5IiB2aWV3Qm94PSIwLDAsMzQwLjgyMTAzLDM0NC42MzYxOSI+PGRlZnM+PHJhZGlhbEdyYWRpZW50IGN4PSIzMjAuMDAwMDEiIGN5PSIxODAuMDAwMDEiIHI9IjE3Mi4zMTgxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNvbG9yLTEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzI0ODRmZiIgc3RvcC1vcGFjaXR5PSIwLjc0NTEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyNDg0ZmYiIHN0b3Atb3BhY2l0eT0iMCIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNDkuNTg5NDgsLTcuNjgxOTEpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PHBhdGggZD0iTTQ5MC40MTA1MiwxODAuMDAwMDFjMCw5NS4xNjg2NiAtNzYuMjk1MzksMTcyLjMxODEgLTE3MC40MTA1MSwxNzIuMzE4MWMtOTQuMTE1MTMsMCAtMTcwLjQxMDUyLC03Ny4xNDk0NCAtMTcwLjQxMDUyLC0xNzIuMzE4MWMwLC05NS4xNjg2NSA3Ni4yOTUzOSwtMTcyLjMxODA5IDE3MC40MTA1MiwtMTcyLjMxODA5Yzk0LjExNTEzLDAgMTcwLjQxMDUxLDc3LjE0OTQ0IDE3MC40MTA1MSwxNzIuMzE4MXoiIGZpbGw9InVybCgjY29sb3ItMSkiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIiBzdHJva2UtbGluZWNhcD0iYnV0dCIvPjxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0iYnV0dCI+PHBhdGggZD0iTTI1OC4xNzk2LDYzLjE4NzM0Yy0xNi41MzM2NCwyMy4yNjI0OCAtNDIuMTExNTcsNjEuNzQyMTYgLTU4Ljc4OTM3LDg0Ljg3ODEyYy0yLjA2NTY1LDIuODY1NTMgMTkuODMxMzEsNTYuMDcxNTkgMTkuODMxMzEsNTYuMDcxNTljMCwwIDYzLjMyMDY2LDMxLjQ1NTQ4IDg0LjQwMjg2LDUzLjc3MDgxYzcuMDIzMTQsNy40MzM5MiAtMTAuMTk5NzIsMjQuNTIxOCAtOS45NDQzOCwyNC44NzU1NGMtMi4xODUwNiwtMC41NTI4OSAtMjkuMzk5NjUsLTAuMjc3MTcgLTUxLjYxMTI1LC02LjY4NjJjLTEuMjgyNjksLTAuMzcwMTEgLTYxLjM3Njk5LC01OC40MDkyIC02MS4zNzY5OSwtNTguNDA5MmwtOC40NzI3LC01Ni4xOTY2M2wxOC42NDQyOCwtNzMuMDY5NThjMCwwIDY4LjA1MDI3LC0yNi4yNjcxNyA2Ny4zMTYyNiwtMjUuMjM0NDN6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0iIzE5MTkxOSIvPjxwYXRoIGQ9Ik0zNzYuMDI2NzcsMjk2LjM0NjI3YzMuMjAxODQsMC4xNjUyNiA0LjkwOTAzLC0wLjUyNTU0IDUuNjMzMjMsLTMuNjQwNzJjMS40NDc2MiwtNi4yMjY5MiAxNS42MDAyMiwtNDguODIxNTkgMTUuNjAwMjIsLTQ4LjgyMTU5YzAsMCAyLjc3NzQ5LC04MC4wODgzNiAzLjE4MjIsLTgxLjIwNDIxYzAuNTUwNzksMC43NTc3OSAxOC4wMzY1LC0yOS44MDU2NSAyNi4wNTA4OCwtMTguOTU2OTRjOS40ODk2NCwxMi44NDU3IDE1LjYyMjUyLDQ1LjA3MzM0IDIyLjA4Mzc3LDU1LjkzOTc2YzEuNjQyODgsMi43NjI5OSAtMTcuOTM1MTMsMTAyLjY5MDk5IC0zNC4wNTExLDEzNS4yNzc5MmMtMi4wNjg0OSw0LjE4MjU0IC00LjQ4MTQzLDUuMjk2OSAtOS40MjE4OCw0LjYzNDE5Yy0xNy41MzU4MiwtMi4zNTIyNiAtMTQwLjE4NzEyLC01Mi44MTQxNiAtMTQwLjE4NzEyLC01Mi44MTQxNmMwLDAgMjIuOTgxMjgsLTEzLjA4MTUyIDIyLjE4NDE3LC0xMy43Njk5MWMyMi4wNzY3OSwxLjA3MTU2IDcyLjUzODIxLDIyLjUwOTkzIDg4LjkyNTYzLDIzLjM1NTY1eiIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aW5kZXgmcXVvdDs6bnVsbH0iIGZpbGw9IiMxOTE5MTkiLz48cGF0aCBkPSJNMzkwLjkxMjAzLDgwLjUxODQyYzkuNjUxNzYsMjEuODk4MjIgNjQuMzk5MDIsMTA1LjA5NDQxIDY0LjAwNjM0LDEwNS4yMDc1OWMtNC4xNDgyOSwtNi42OTM5MiAtNDAuNDA2NDgsLTEwLjUzNjUyIC00NC41NzQsLTE3LjIxNzRjLTExLjA5Nzg0LC0xNy43OTA4NCAtMzMuMzA5NzgsLTUzLjM2MTUyIC0zMy4zMDk3OCwtNTMuMzYxNTJsLTU1LjkyMjU0LC0yMi44MzgzMWwtNzQuMzQ1OTEsOC45NzgxNmMwLDAgMjAuODkxMDYsLTMxLjE0NzE1IDIxLjM4NzU2LC0zMi43NDcwNWMyLjA0NjQ0LC02LjU5NDYgOS4zNTc3LC02LjEzMDc4IDE0LjIyODI5LC03Ljk3Njk5YzE0Ljk3MzIzLC01LjY3NTU2IDQ1LjMxOTM5LC05LjU3MjMzIDQ3LjY4NTksLTguODY3NjNjMTUuMTEyMyw0LjUwMDE1IDU3LjI3MjkyLDIwLjcyMDYxIDYwLjg0NDE2LDI4LjgyMzE2eiIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aW5kZXgmcXVvdDs6bnVsbH0iIGZpbGw9IiMxOTE5MTkiLz48cGF0aCBkPSJNMjcwLjY3OTYsNDEuMTg3MzNjLTE2LjUzMzY0LDIzLjI2MjQ4IC00Mi4xMTE1Nyw2MS43NDIxNiAtNTguNzg5MzcsODQuODc4MTJjLTIuMDY1NjUsMi44NjU1NCAxOS44MzEzMSw1Ni4wNzE1OSAxOS44MzEzMSw1Ni4wNzE1OWMwLDAgNzMuNDM2NjUsNzcuMjMwNzQgNzQuNDU4NDgsNzguNjQ2MzVjLTIuMTg1MDYsLTAuNTUyODkgLTI5LjM5OTY1LC0wLjI3NzE3IC01MS42MTEyNSwtNi42ODYyMWMtMS4yODI2OSwtMC4zNzAxMSAtNjEuMzc2OTksLTU4LjQwOTIgLTYxLjM3Njk5LC01OC40MDkybC04LjQ3MjcsLTU2LjE5NjYzbDUuNjQ0MjgsLTUwLjA2OTU4YzAsMCA4MS4wNTAyNywtNDkuMjY3MTcgODAuMzE2MjYsLTQ4LjIzNDQzeiIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aW5kZXgmcXVvdDs6bnVsbH0iIGZpbGw9IiM1NzU3NTciLz48cGF0aCBkPSJNMzkxLjAyNjc3LDI3NS4zNDYyN2MzLjIwMTg0LDAuMTY1MjYgNC45MDkwMywtMC41MjU1NCA1LjYzMzIzLC0zLjY0MDcyYzEuNDQ3NjIsLTYuMjI2OTIgMTUuNjAwMjIsLTQ4LjgyMTU5IDE1LjYwMDIyLC00OC44MjE1OWMwLDAgLTQuODg5MTgsLTc0LjQyMTcgLTQuNDg0NDYsLTc1LjUzNzU1YzEuMjAyOTcsMS42NTUwOCAzMS4zODMyOCwzMS43NzI2MSA0My4zMDEzMiw1MS44MTYxNmMxLjY0Mjg4LDIuNzYyOTkgLTMwLjUzMjUzLDExNy4wNzQ4MiAtMzUuNDcyOTgsMTE2LjQxMjExYy0yNi45NzkwNiwtMy42MTg5NyAtNDguODIyMDQsLTYuOTkwOTMgLTc0LjY0MDc4LC0xNS40ODgxMWMtMjAuMjkxODMsLTYuNjc4MjQgLTM5LjkwMTcyLC0xNC45NDAwNCAtNTguMDg5NzIsLTI2LjAyMDg3Yy0xLjM4OTQzLC0wLjg0NjQ3IC0yLjQ5NTEzLC0yLjEwODM4IC00Ljc3MjQ1LC00LjA3NTA5YzIyLjA3Njc5LDEuMDcxNTYgNDIuNDA4NDgsMi4wNTg0MSA2My4yNDk3MSwzLjA3NDA3YzE2Ljg5ODU3LDAuNzYyNDUgMzMuMjg4NSwxLjQzNTg2IDQ5LjY3NTkzLDIuMjgxNTl6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0iIzU3NTc1NyIvPjxwYXRoIGQ9Ik00MDYuNDEyMDMsNTUuMDE4NDFjOS42NTE3NiwyMS44OTgyMyA0OS4zOTkwMiwxMzAuMDk0NDEgNDkuMDA2MzQsMTMwLjIwNzU5Yy00LjE0ODI5LC02LjY5MzkyIC0yNS40MDY0OCwtMzUuNTM2NTIgLTI5LjU3NCwtNDIuMjE3NGMtMTEuMDk3ODQsLTE3Ljc5MDg0IC0zMy4zMDk3OCwtNTMuMzYxNTIgLTMzLjMwOTc4LC01My4zNjE1MmwtNTUuOTIyNTQsLTIyLjgzODMxbC03NC4zNDU5MSw4Ljk3ODE2YzAsMCAyMi44OTEwNiwtMjkuMTQ3MTUgMjMuMzg3NTYsLTMwLjc0NzA1YzIuMDQ2NDQsLTYuNTk0NiA3LjM1NzcsLTguMTMwNzggMTIuMjI4MjksLTkuOTc2OTljMTQuOTczMjMsLTUuNjc1NTYgNDUuMzE5MzksLTkuNTcyMzMgNDcuNjg1OSwtOC44Njc2M2MxNS4xMTIzLDQuNTAwMTUgNTcuMjcyOTIsMjAuNzIwNjEgNjAuODQ0MTYsMjguODIzMTZ6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0iIzU3NTc1NyIvPjwvZz48cGF0aCBkPSJNMzc2LjgyODI2LDE2My40MzI1NGMwLDI3LjYxNDI0IC0yMS4yNjY0OCw1MCAtNDcuNSw1MGMtMjYuMjMzNTIsMCAtNDcuNSwtMjIuMzg1NzYgLTQ3LjUsLTUwYzAsLTI3LjYxNDI0IDIxLjI2NjQ4LC01MCA0Ny41LC01MGMyNi4yMzM1MiwwIDQ3LjUsMjIuMzg1NzYgNDcuNSw1MHoiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIiBzdHJva2UtbGluZWNhcD0iYnV0dCIvPjxwYXRoIGQ9Ik0zMDkuMjY2OTgsMTQ5LjE3MDU3bC04OC41LC0yNWw2MCwtOTEuMjM4MDJsLTQwLDgxLjVsODQuNSwyeiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjxwYXRoIGQ9Ik0zNzUuMzc5NTcsMTczLjk3MDA1bDMsOTEuNWgtMTEwLjVoMzcuNWwzMiwtMTVsOS41LC01NXoiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48cGF0aCBkPSJNMzkyLjEwMTkzLDExNy4xMjg0N2wtMjIuNjY2NjcsMzVsLTI5LjY2NjY3LC0zNi41MTEwOWw1Mi4zMzMzNCwtMTdsNTAuMzMzMzMsODEuNjY2NjZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PHBhdGggZD0iTTI1MS4xOTQ3NSw5Ny40NDA4OGwxMywtMjJsMjYuNjY2NjcsLTM3LjMzMzMzIiBmaWxsPSJub25lIiBzdHJva2Utb3BhY2l0eT0iMC4zMzMzMyIgc3Ryb2tlPSIjNzJhNGZmIiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPjxwYXRoIGQ9Ik0yMTAuNTcyNDksMTI2LjgwMjkxbDYwLjMzMzMzLC04NS4zMzMzNCIgZmlsbD0ibm9uZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMzMzMzMiIHN0cm9rZT0iIzcyYTRmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48cGF0aCBkPSJNMjgwLjgxMDE4LDI3Mi4xNTI0NGwxMTIuNjY2NjcsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMzMzMzMiIHN0cm9rZT0iIzcyYTRmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48cGF0aCBkPSJNMjkwLjQ3Njg1LDI0My44MTkxMWwxMywxNS42NjY2NmwtMjYuNjY2NjcsMS4zMzMzNCIgZmlsbD0ibm9uZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMzMzMzMiIHN0cm9rZT0iIzcyYTRmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48cGF0aCBkPSJNNDA4Ljk0NjMzLDE0OS43MTM1NGw0MCw0NS42NjY2NyIgZmlsbD0ibm9uZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMzMzMzMiIHN0cm9rZT0iIzcyYTRmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48cGF0aCBkPSJNMzk1LjYxMyw5NS4wNDY4OGw1OC4zMzMzMyw4Ni42NjY2NiIgZmlsbD0ibm9uZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMzMzMzMiIHN0cm9rZT0iIzcyYTRmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48cGF0aCBkPSJNMzQ3Ljk5OTMzLDEwNi41MzI2NGwtNS43NDcwMSwxLjk5Mzc2Yy0xMC45Mzk3MywtNC4yOTIxMyAtMjIuOTkzNDUsLTUuMDY4NTEgLTM0LjYyMjc5LC0xLjQyMzM4Yy0yLjgyMDk1LDAuODg0MiAtNS41MTM4OSwxLjk5NjI3IC04LjA2ODIsMy4zMTMwN2wtNDQuOTcwNDQsLTEuNDA5MzUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0iYnV0dCIvPjxwYXRoIGQ9Ik0zODMuNjY2LDI1Ny4zMjgxM2wtMy4zMjYzNiwtNzMuMzAwOTdjMi41NDAwNiwtMTAuNjc5MjYgMi4zNTQ4NSwtMjIuNDA2NTkgLTEuMTAwMTMsLTMzLjk5ODQ2bDYuNzU5ODMsLTEzLjQ5NjA3IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz48cGF0aCBkPSJNMjIzLjc5MDg3LDEzNi4yNzAyMmw0Ni44MzU5NSwxNi40MDA1NWMtMS40MTMwNSw5LjQ5MTMyIC0wLjcyNzA3LDE5LjYyMDMyIDIuNDA4NjksMjkuNjI0NjFjOC42MjY3LDI3LjUyMjUgMzMuMDE1OTMsNDUuMjM2ODMgNTguMTA5ODEsNDQuMjc3NTJsLTIuNzIwODgsMTYuNTUxMTFsLTEzLjY2NjY3LDEwLjY2NjY3IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz48L2c+PC9nPjwvc3ZnPjwhLS1yb3RhdGlvbkNlbnRlcjoxNzAuNDEwNTE1OjE3Mi4zMTgwODUtLT4=">
</head>
<body>
<div id="app"></div>
<div id="launch" class="screen" hidden title="Click to start">
<div class="green-flag">
<svg viewBox="0 0 16.63 17.5" width="42" height="44">
<defs><style>.cls-1,.cls-2{fill:#007AF4;stroke:#003080;stroke-linecap:round;stroke-linejoin:round;}.cls-2{stroke-width:1.5px;}</style></defs>
<path class="cls-1" d="M.75,2A6.44,6.44,0,0,1,8.44,2h0a6.44,6.44,0,0,0,7.69,0V12.4a6.44,6.44,0,0,1-7.69,0h0a6.44,6.44,0,0,0-7.69,0"/>
<line class="cls-2" x1="0.75" y1="16.75" x2="0.75" y2="0.75"/>
</svg>
</div>
</div>
<div id="loading" class="screen">
<noscript>Enable JavaScript</noscript>
</div>
<div id="error" class="screen" hidden>
<h1>Error</h1>
<details>
<summary id="error-message"></summary>
<p id="error-stack"></p>
</details>
</div>
<script src="script.js"></script>
<script>
const appElement = document.getElementById('app');
const launchScreen = document.getElementById('launch');
const loadingScreen = document.getElementById('loading');
const loadingInner = document.getElementById('loading-inner');
const errorScreen = document.getElementById('error');
const errorScreenMessage = document.getElementById('error-message');
const errorScreenStack = document.getElementById('error-stack');
const handleError = (error) => {
console.error(error);
if (!errorScreen.hidden) return;
errorScreen.hidden = false;
errorScreenMessage.textContent = '' + error;
let debug = error && error.stack || 'no stack';
debug += '\nUser agent: ' + navigator.userAgent;
errorScreenStack.textContent = debug;
};
const setProgress = (progress) => {
if (loadingInner) loadingInner.style.width = progress * 100 + '%';
};
const interpolate = (a, b, t) => a + t * (b - a);
try {
setProgress(0.1);
const scaffolding = new Scaffolding.Scaffolding();
scaffolding.width = 640;
scaffolding.height = 360;
scaffolding.resizeMode = "preserve-ratio";
scaffolding.editableLists = false;
scaffolding.usePackagedRuntime = true;
scaffolding.setup();
scaffolding.appendTo(appElement);
const vm = scaffolding.vm;
window.scaffolding = scaffolding;
window.vm = scaffolding.vm;
window.Scratch = {
vm,
renderer: vm.renderer,
audioEngine: vm.runtime.audioEngine,
bitmapAdapter: vm.runtime.v2BitmapAdapter,
videoProvider: vm.runtime.ioDevices.video.provider
};
scaffolding.setUsername("player####".replace(/#/g, () => Math.floor(Math.random() * 10)));
scaffolding.setAccentColor("#00c3ff");
try {
scaffolding.addCloudProvider(new Scaffolding.Cloud.WebSocketProvider(["wss://clouddata.turbowarp.org","wss://clouddata.turbowarp.xyz"], "p4-@Project.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:text/javascript;base64,LyoqCiAqIFJpZ2h0IENsaWNrIE1lbnUgZXh0ZW5zaW9uIHYxLjAgYnkgMHpuencgKEVuZ2xpc2ggVmVyc2lvbikKICogQWxsIGNvZGUgaXMgYnkgMHpuencgfHwgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCiAqIGh0dHBzOi8vc2NyYXRjaC5taXQuZWR1L3VzZXJzLzB6bnp3LwogKiBEbyBub3QgcmVtb3ZlIHRoaXMgY29tbWVudAogKi8KKGZ1bmN0aW9uKFNjcmF0Y2gpIHsKICAndXNlIHN0cmljdCc7CiAgaWYgKCFTY3JhdGNoLmV4dGVuc2lvbnMudW5zYW5kYm94ZWQpIHsKICAgIHRocm93IG5ldyBFcnJvcignUmlnaHQtQ2xpY2stTWVudShFeHRlbnNpb24pIG11c3QgYmUgcnVuIHVuc2FuZGJveGVkJyk7CiAgfQogIGNvbnN0IGRpc2FibGUgPSBmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7IHJldHVybiBmYWxzZX0sIGVuYWJsZSA9IGZ1bmN0aW9uKGUpe3JldHVybiB0cnVlfTsKICBjb25zdCBmYWtlRXZlbnQgPSB7cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7fX07CiAgZG9jdW1lbnQub25jb250ZXh0bWVudSA9IGVuYWJsZTsKICBsZXQgaXNEaXNhYmxlZCA9IGZhbHNlOwogIGNsYXNzIGV4dGVuc2lvbiB7CiAgICBnZXRJbmZvKCkgeyByZXR1cm4oewogICAgICBpZDogJzB6bnp3UmlnaHRDbGljaycsCiAgICAgIG5hbWU6ICdSaWdodCBDbGljayBtZW51JywKICAgICAgYmxvY2tzOiBbewogICAgICAgIGJsb2NrVHlwZTogU2NyYXRjaC5CbG9ja1R5cGUuQ09NTUFORCwKICAgICAgICBvcGNvZGU6ICdlbmFibGUnLAogICAgICAgIHRleHQ6ICdlbmFibGUgcmlnaHQgY2xpY2sgbWVudScKICAgICAgfSwgewogICAgICAgIGJsb2NrVHlwZTogU2NyYXRjaC5CbG9ja1R5cGUuQ09NTUFORCwKICAgICAgICBvcGNvZGU6ICdkaXNhYmxlJywKICAgICAgICB0ZXh0OiAnZGlzYWJsZSByaWdodCBjbGljayBtZW51JwogICAgICB9LCB7CiAgICAgICAgYmxvY2tUeXBlOiBTY3JhdGNoLkJsb2NrVHlwZS5CT09MRUFOLAogICAgICAgIG9wY29kZTogJ2lzRGlzYWJsZWQnLAogICAgICAgIHRleHQ6ICdpcyByaWdodCBjbGljayBtZW51IGRpc2FibGVkPycKICAgICAgfV0KICAgIH0pfQogICAgaXNEaXNhYmxlZCgpIHsgcmV0dXJuKCFkb2N1bWVudC5vbmNvbnRleHRtZW51KGZha2VFdmVudCkpIH0KICAgIGVuYWJsZSgpIHsgZG9jdW1lbnQub25jb250ZXh0bWVudSA9IGVuYWJsZTsgfQogICAgZGlzYWJsZSgpIHsgZG9jdW1lbnQub25jb250ZXh0bWVudSA9IGRpc2FibGU7IH0KICB9CiAgU2NyYXRjaC5leHRlbnNpb25zLnJlZ2lzdGVyKG5ldyBleHRlbnNpb24oKSk7Cn0pKFNjcmF0Y2gpOw==","data:text/javascript;,(function(Scratch)%20%7B%20%2F%2F%20Name%3A%20Pointerlock%0A%2F%2F%20ID%3A%20pointerlock%0A%2F%2F%20Description%3A%20Adds%20blocks%20for%20mouse%20locking.%20Mouse%20x%20%26%20y%20blocks%20will%20report%20the%20change%20since%20the%20previous%20frame%20while%20the%20pointer%20is%20locked.%20Replaces%20the%20pointerlock%20experiment.%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_Pointerlock%22%3A%22Zeigersperren%22%7D%2C%22fi%22%3A%7B%22_Pointerlock%22%3A%22Hiiren%20osoittimen%20lukitus%22%7D%2C%22it%22%3A%7B%22_Pointerlock%22%3A%22Blocco%20Puntatore%22%2C%22_disabled%22%3A%22sblocca%22%2C%22_enabled%22%3A%22blocca%22%2C%22_pointer%20locked%3F%22%3A%22puntatore%20bloccato%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22%5Benabled%5D%20puntatore%22%7D%2C%22ja%22%3A%7B%22_Pointerlock%22%3A%22%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%AD%E3%83%83%E3%82%AF%22%2C%22_disabled%22%3A%22%E7%84%A1%E5%8A%B9%22%2C%22_enabled%22%3A%22%E6%9C%89%E5%8A%B9%22%2C%22_pointer%20locked%3F%22%3A%22%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%81%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%5Benabled%5D%E3%81%AB%E3%81%99%E3%82%8B%22%7D%2C%22nb%22%3A%7B%22_Pointerlock%22%3A%22Pointerl%C3%A5s%22%2C%22_disabled%22%3A%22deaktivert%22%2C%22_enabled%22%3A%22aktivert%22%2C%22_pointer%20locked%3F%22%3A%22peker%20l%C3%A5st%3F%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22sette%20pekerl%C3%A5s%20%5Benabled%5D%22%7D%2C%22nl%22%3A%7B%22_Pointerlock%22%3A%22Muisaanwijzer-vergrendeling%22%2C%22_disabled%22%3A%22ontgrendel%22%2C%22_enabled%22%3A%22vergrendel%22%2C%22_pointer%20locked%3F%22%3A%22muisaanwijzer%20vergrendeld%3F%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22%5Benabled%5D%20muisaanwijzer%22%7D%2C%22ru%22%3A%7B%22_disabled%22%3A%22%D0%B2%D1%8B%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%22%2C%22_enabled%22%3A%22%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%22%2C%22_pointer%20locked%3F%22%3A%22%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%3F%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D1%91%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%20%5Benabled%5D%22%7D%2C%22uk%22%3A%7B%22_disabled%22%3A%22%D1%80%D0%BE%D0%B7%D0%B1%D0%BB%D0%BE%D0%BA%D1%83%D0%B2%D0%B0%D1%82%D0%B8%22%2C%22_enabled%22%3A%22%D0%B7%D0%B0%D0%B1%D0%BB%D0%BE%D0%BA%D1%83%D0%B2%D0%B0%D1%82%D0%B8%22%2C%22_pointer%20locked%3F%22%3A%22%D0%B2%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%20%D0%B7%D0%B0%D0%B1%D0%BB%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D0%BD%D0%BE%3F%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22%5Benabled%5D%20%D0%B2%D0%BA%D0%B0%D0%B7%D1%96%D0%B2%D0%BD%D0%B8%D0%BA%20%D0%BC%D0%B8%D1%88%D1%96%22%7D%2C%22zh-cn%22%3A%7B%22_Pointerlock%22%3A%22%E9%BC%A0%E6%A0%87%E9%94%81%E5%AE%9A%22%2C%22_disabled%22%3A%22%E7%A6%81%E7%94%A8%22%2C%22_enabled%22%3A%22%E5%90%AF%E7%94%A8%22%2C%22_pointer%20locked%3F%22%3A%22%E6%8C%87%E9%92%88%E9%94%81%E5%AE%9A%EF%BC%9F%22%2C%22_set%20pointer%20lock%20%5Benabled%5D%22%3A%22%E8%AE%BE%E7%BD%AE%E6%8C%87%E9%92%88%E9%94%81%E5%AE%9A%E4%B8%BA%5Benabled%5D%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(%22pointerlock%20extension%20must%20be%20run%20unsandboxed%22)%3B%0A%20%20%7D%0A%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%0A%20%20const%20canvas%20%3D%20vm.runtime.renderer.canvas%3B%0A%20%20const%20mouse%20%3D%20vm.runtime.ioDevices.mouse%3B%0A%20%20let%20isLocked%20%3D%20false%3B%0A%20%20let%20isPointerLockEnabled%20%3D%20false%3B%0A%0A%20%20let%20rect%20%3D%20canvas.getBoundingClientRect()%3B%0A%20%20window.addEventListener(%22resize%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20rect%20%3D%20canvas.getBoundingClientRect()%3B%0A%20%20%7D)%3B%0A%0A%20%20const%20postMouseData%20%3D%20(e%2C%20isDown)%20%3D%3E%20%7B%0A%20%20%20%20const%20%7B%20movementX%2C%20movementY%20%7D%20%3D%20e%3B%0A%20%20%20%20const%20%7B%20width%2C%20height%20%7D%20%3D%20rect%3B%0A%20%20%20%20const%20x%20%3D%20mouse._clientX%20%2B%20movementX%3B%0A%20%20%20%20const%20y%20%3D%20mouse._clientY%20-%20movementY%3B%0A%20%20%20%20mouse._clientX%20%3D%20x%3B%0A%20%20%20%20mouse._scratchX%20%3D%20mouse.runtime.stageWidth%20*%20(x%20%2F%20width%20-%200.5)%3B%0A%20%20%20%20mouse._clientY%20%3D%20y%3B%0A%20%20%20%20mouse._scratchY%20%3D%20mouse.runtime.stageWidth%20*%20(y%20%2F%20height%20-%200.5)%3B%0A%20%20%20%20if%20(typeof%20isDown%20%3D%3D%3D%20%22boolean%22)%20%7B%0A%20%20%20%20%20%20const%20data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20button%3A%20e.button%2C%0A%20%20%20%20%20%20%20%20isDown%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20originalPostIOData(data)%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20const%20mouseDevice%20%3D%20vm.runtime.ioDevices.mouse%3B%0A%20%20const%20originalPostIOData%20%3D%20mouseDevice.postData.bind(mouseDevice)%3B%0A%20%20mouseDevice.postData%20%3D%20(data)%20%3D%3E%20%7B%0A%20%20%20%20if%20(!isPointerLockEnabled)%20%7B%0A%20%20%20%20%20%20return%20originalPostIOData(data)%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20document.addEventListener(%0A%20%20%20%20%22mousedown%22%2C%0A%20%20%20%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%0A%20%20%20%20%20%20if%20(canvas.contains(e.target))%20%7B%0A%20%20%20%20%20%20%20%20if%20(isLocked)%20%7B%0A%20%20%20%20%20%20%20%20%20%20postMouseData(e%2C%20true)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(isPointerLockEnabled)%20%7B%0A%20%20%20%20%20%20%20%20%20%20canvas.requestPointerLock()%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%2C%0A%20%20%20%20true%0A%20%20)%3B%0A%20%20document.addEventListener(%0A%20%20%20%20%22mouseup%22%2C%0A%20%20%20%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20(isLocked)%20%7B%0A%20%20%20%20%20%20%20%20postMouseData(e%2C%20false)%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20%40ts-expect-error%0A%20%20%20%20%20%20%7D%20else%20if%20(isPointerLockEnabled%20%26%26%20canvas.contains(e.target))%20%7B%0A%20%20%20%20%20%20%20%20canvas.requestPointerLock()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20true%0A%20%20)%3B%0A%20%20document.addEventListener(%0A%20%20%20%20%22mousemove%22%2C%0A%20%20%20%20(e)%20%3D%3E%20%7B%0A%20%20%20%20%20%20if%20(isLocked)%20%7B%0A%20%20%20%20%20%20%20%20postMouseData(e)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20true%0A%20%20)%3B%0A%0A%20%20document.addEventListener(%22pointerlockchange%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20isLocked%20%3D%20document.pointerLockElement%20%3D%3D%3D%20canvas%3B%0A%20%20%7D)%3B%0A%20%20document.addEventListener(%22pointerlockerror%22%2C%20(e)%20%3D%3E%20%7B%0A%20%20%20%20console.error(%22Pointer%20lock%20error%22%2C%20e)%3B%0A%20%20%7D)%3B%0A%0A%20%20const%20oldStep%20%3D%20vm.runtime._step%3B%0A%20%20vm.runtime._step%20%3D%20function%20(...args)%20%7B%0A%20%20%20%20const%20ret%20%3D%20oldStep.call(this%2C%20...args)%3B%0A%20%20%20%20if%20(isPointerLockEnabled)%20%7B%0A%20%20%20%20%20%20const%20%7B%20width%2C%20height%20%7D%20%3D%20rect%3B%0A%20%20%20%20%20%20mouse._clientX%20%3D%20width%20%2F%202%3B%0A%20%20%20%20%20%20mouse._clientY%20%3D%20height%20%2F%202%3B%0A%20%20%20%20%20%20mouse._scratchX%20%3D%200%3B%0A%20%20%20%20%20%20mouse._scratchY%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20ret%3B%0A%20%20%7D%3B%0A%0A%20%20vm.runtime.on(%22PROJECT_LOADED%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20isPointerLockEnabled%20%3D%20false%3B%0A%20%20%20%20if%20(isLocked)%20%7B%0A%20%20%20%20%20%20document.exitPointerLock()%3B%0A%20%20%20%20%7D%0A%20%20%7D)%3B%0A%0A%20%20class%20Pointerlock%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%22pointerlock%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20Scratch.translate(%22Pointerlock%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%22setLocked%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%20pointer%20lock%20%5Benabled%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%20enabled%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%22true%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22enabled%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%22isLocked%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%20Scratch.translate(%22pointer%20locked%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%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20enabled%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22enabled%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22true%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20Scratch.translate(%22disabled%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3A%20%22false%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setLocked(args)%20%7B%0A%20%20%20%20%20%20isPointerLockEnabled%20%3D%20Scratch.Cast.toBoolean(args.enabled)%20%3D%3D%3D%20true%3B%0A%20%20%20%20%20%20if%20(!isPointerLockEnabled%20%26%26%20isLocked)%20%7B%0A%20%20%20%20%20%20%20%20document.exitPointerLock()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20isLocked()%20%7B%0A%20%20%20%20%20%20return%20isLocked%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20Pointerlock())%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%20osoitin%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%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%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%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(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%20%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%20%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%20%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%20%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%20%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%20%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%20%22get%20headers%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%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%20%22get%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%22get%20%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%20%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%20%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%20%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%20%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%20%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%20%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%20%22set%20%5Bpath%5D%20to%20type%20%5Btype%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%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%20%22get%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%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%20%22get%20type%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"]) {
vm.extensionManager.loadExtensionURL(extension);
}
vm.runtime.isProjectPermissionManagerDisabled = true;
} catch (e) {
handleError(e);
}
</script>
<script>
const getProjectData = (function() {
const storage = scaffolding.storage;
storage.onprogress = (total, loaded) => {
setProgress(interpolate(0.2, 0.98, loaded / total));
};
storage.addWebStore(
[
storage.AssetType.ImageVector,
storage.AssetType.ImageBitmap,
storage.AssetType.Sound,
storage.AssetType.Font
].filter(i => i),
(asset) => new URL('./assets/' + asset.assetId + '.' + asset.dataFormat, location).href
);
return () => new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onload = () => {
resolve(xhr.response);
};
xhr.onerror = () => {
if (location.protocol === 'file:') {
reject(new Error('Zip environment must be used from a website, not from a file URL.'));
} else {
reject(new Error('Request to load project data failed.'));
}
};
xhr.onprogress = (e) => {
if (e.lengthComputable) {
setProgress(interpolate(0.1, 0.2, e.loaded / e.total));
}
};
xhr.responseType = 'arraybuffer';
xhr.open('GET', "./assets/project.json");
xhr.send();
});
})();
</script>
<script>
const run = async () => {
const projectData = await getProjectData();
await scaffolding.loadProject(projectData);
setProgress(1);
loadingScreen.hidden = true;
if (true) {
scaffolding.start();
} else {
launchScreen.hidden = false;
launchScreen.addEventListener('click', () => {
launchScreen.hidden = true;
scaffolding.start();
});
launchScreen.focus();
}
};
run().catch(handleError);
</script>
</body>
</html>