@jayf0x/fluidity-js 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,956 +0,0 @@
1
- var Dg = Object.defineProperty;
2
- var Jg = (i, g, C) => g in i ? Dg(i, g, { enumerable: !0, configurable: !0, writable: !0, value: C }) : i[g] = C;
3
- var mg = (i, g, C) => (Jg(i, typeof g != "symbol" ? g + "" : g, C), C), bg = (i, g, C) => {
4
- if (!g.has(i))
5
- throw TypeError("Cannot " + C);
6
- };
7
- var I = (i, g, C) => (bg(i, g, "read from private field"), C ? C.call(i) : g.get(i)), a = (i, g, C) => {
8
- if (g.has(i))
9
- throw TypeError("Cannot add the same private member more than once");
10
- g instanceof WeakSet ? g.add(i) : g.set(i, C);
11
- }, t = (i, g, C, e) => (bg(i, g, "write to private field"), e ? e.call(i, C) : g.set(i, C), C);
12
- var y = (i, g, C) => (bg(i, g, "access private method"), C);
13
- import { jsx as kg } from "react/jsx-runtime";
14
- import { useRef as ng, useEffect as N, forwardRef as Yg, useImperativeHandle as Fg } from "react";
15
- const Xg = {
16
- densityDissipation: 0.992,
17
- velocityDissipation: 0.93,
18
- pressureIterations: 1,
19
- curl: 1e-4,
20
- splatRadius: 4e-3,
21
- splatForce: 0.91,
22
- refraction: 0.25,
23
- specularExp: 1.01,
24
- shine: 0.01,
25
- waterColor: [0, 0, 0],
26
- glowColor: [0.7, 0.85, 1],
27
- algorithm: "standard",
28
- warpStrength: 0.015
29
- }, Eg = {
30
- calm: {
31
- densityDissipation: 0.999,
32
- velocityDissipation: 0.98,
33
- curl: 1e-4,
34
- splatRadius: 3e-3,
35
- splatForce: 0.5,
36
- refraction: 0.15,
37
- shine: 5e-3,
38
- glowColor: [0.6, 0.85, 1],
39
- waterColor: [0, 0.02, 0.05]
40
- },
41
- storm: {
42
- densityDissipation: 0.97,
43
- velocityDissipation: 0.88,
44
- curl: 0.45,
45
- splatRadius: 0.012,
46
- splatForce: 3,
47
- refraction: 0.6,
48
- shine: 0.08,
49
- glowColor: [0.2, 0.3, 0.8],
50
- waterColor: [0, 0, 0.1],
51
- pressureIterations: 150
52
- },
53
- wave: {
54
- densityDissipation: 0.994,
55
- velocityDissipation: 0.92,
56
- curl: 0.2,
57
- splatRadius: 5e-3,
58
- splatForce: 1.2,
59
- refraction: 0.35,
60
- shine: 0.03,
61
- pressureIterations: 5,
62
- glowColor: [0.5, 0.8, 1],
63
- waterColor: [0, 0.01, 0.03]
64
- },
65
- neon: {
66
- densityDissipation: 0.985,
67
- velocityDissipation: 0.93,
68
- curl: 0.05,
69
- splatRadius: 8e-3,
70
- splatForce: 1.5,
71
- refraction: 0.25,
72
- specularExp: 0.5,
73
- shine: 0.14,
74
- glowColor: [1, 0.2, 0.8],
75
- waterColor: [0.05, 0, 0.08]
76
- },
77
- smoke: {
78
- densityDissipation: 0.996,
79
- velocityDissipation: 0.97,
80
- curl: 0.04,
81
- splatRadius: 9e-3,
82
- splatForce: 0.8,
83
- refraction: 0.08,
84
- shine: 0,
85
- glowColor: [0.5, 0.5, 0.5],
86
- waterColor: [0.06, 0.06, 0.06]
87
- }
88
- };
89
- function Kg(i = {}, g) {
90
- return { ...g ? { ...Xg, ...Eg[g] } : Xg, ...i };
91
- }
92
- const O = (
93
- /* glsl */
94
- `
95
- precision highp float;
96
- attribute vec2 aPosition;
97
- varying vec2 vUv;
98
- varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
99
- uniform vec2 texelSize;
100
- void main () {
101
- vUv = aPosition * 0.5 + 0.5;
102
- vL = vUv - vec2(texelSize.x, 0.0);
103
- vR = vUv + vec2(texelSize.x, 0.0);
104
- vT = vUv + vec2(0.0, texelSize.y);
105
- vB = vUv - vec2(0.0, texelSize.y);
106
- gl_Position = vec4(aPosition, 0.0, 1.0);
107
- }
108
- `
109
- ), Ng = (
110
- /* glsl */
111
- `
112
- precision highp float;
113
- varying vec2 vUv;
114
- uniform sampler2D uVelocity;
115
- uniform sampler2D uSource;
116
- uniform sampler2D uObstacle;
117
- uniform vec2 texelSize;
118
- uniform float dt;
119
- uniform float dissipation;
120
- void main () {
121
- if (texture2D(uObstacle, vUv).r > 0.5) { gl_FragColor = vec4(0.0); return; }
122
- vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;
123
- gl_FragColor = dissipation * texture2D(uSource, coord);
124
- }
125
- `
126
- ), zg = (
127
- /* glsl */
128
- `
129
- precision highp float;
130
- varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
131
- uniform sampler2D uVelocity;
132
- uniform sampler2D uObstacle;
133
- void main () {
134
- float L = texture2D(uObstacle, vL).r > 0.5 ? 0.0 : texture2D(uVelocity, vL).x;
135
- float R = texture2D(uObstacle, vR).r > 0.5 ? 0.0 : texture2D(uVelocity, vR).x;
136
- float T = texture2D(uObstacle, vT).r > 0.5 ? 0.0 : texture2D(uVelocity, vT).y;
137
- float B = texture2D(uObstacle, vB).r > 0.5 ? 0.0 : texture2D(uVelocity, vB).y;
138
- gl_FragColor = vec4(0.5 * (R - L + T - B), 0.0, 0.0, 1.0);
139
- }
140
- `
141
- ), Og = (
142
- /* glsl */
143
- `
144
- precision highp float;
145
- varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
146
- uniform sampler2D uPressure;
147
- uniform sampler2D uDivergence;
148
- uniform sampler2D uObstacle;
149
- void main () {
150
- float C = texture2D(uPressure, vUv).x;
151
- float L = texture2D(uObstacle, vL).r > 0.5 ? C : texture2D(uPressure, vL).x;
152
- float R = texture2D(uObstacle, vR).r > 0.5 ? C : texture2D(uPressure, vR).x;
153
- float T = texture2D(uObstacle, vT).r > 0.5 ? C : texture2D(uPressure, vT).x;
154
- float B = texture2D(uObstacle, vB).r > 0.5 ? C : texture2D(uPressure, vB).x;
155
- float div = texture2D(uDivergence, vUv).x;
156
- gl_FragColor = vec4((L + R + B + T - div) * 0.25, 0.0, 0.0, 1.0);
157
- }
158
- `
159
- ), Qg = (
160
- /* glsl */
161
- `
162
- precision highp float;
163
- varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
164
- uniform sampler2D uPressure;
165
- uniform sampler2D uVelocity;
166
- uniform sampler2D uObstacle;
167
- void main () {
168
- if (texture2D(uObstacle, vUv).r > 0.5) { gl_FragColor = vec4(0.0); return; }
169
- float L = texture2D(uPressure, vL).x;
170
- float R = texture2D(uPressure, vR).x;
171
- float T = texture2D(uPressure, vT).x;
172
- float B = texture2D(uPressure, vB).x;
173
- vec2 vel = texture2D(uVelocity, vUv).xy - vec2(R - L, T - B);
174
- gl_FragColor = vec4(vel, 0.0, 1.0);
175
- }
176
- `
177
- ), jg = (
178
- /* glsl */
179
- `
180
- precision highp float;
181
- varying vec2 vUv;
182
- uniform sampler2D uTarget;
183
- uniform float aspectRatio;
184
- uniform vec3 color;
185
- uniform vec2 point;
186
- uniform float radius;
187
- void main () {
188
- vec2 p = vUv - point.xy;
189
- p.x *= aspectRatio;
190
- vec3 splat = exp(-dot(p, p) / radius) * color;
191
- gl_FragColor = vec4(texture2D(uTarget, vUv).xyz + splat, 1.0);
192
- }
193
- `
194
- ), Pg = (
195
- /* glsl */
196
- `
197
- precision highp float;
198
- varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
199
- uniform sampler2D uVelocity;
200
- void main () {
201
- float L = texture2D(uVelocity, vL).y;
202
- float R = texture2D(uVelocity, vR).y;
203
- float T = texture2D(uVelocity, vT).x;
204
- float B = texture2D(uVelocity, vB).x;
205
- gl_FragColor = vec4(0.5 * (R - L - T + B), 0.0, 0.0, 1.0);
206
- }
207
- `
208
- ), _g = (
209
- /* glsl */
210
- `
211
- precision highp float;
212
- varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
213
- uniform sampler2D uVelocity;
214
- uniform sampler2D uCurl;
215
- uniform float curl;
216
- uniform float dt;
217
- void main () {
218
- float L = texture2D(uCurl, vL).x;
219
- float R = texture2D(uCurl, vR).x;
220
- float T = texture2D(uCurl, vT).x;
221
- float B = texture2D(uCurl, vB).x;
222
- float C = texture2D(uCurl, vUv).x;
223
- vec2 force = 0.5 * vec2(abs(T) - abs(B), abs(R) - abs(L));
224
- force /= length(force) + 0.0001;
225
- force *= curl * 30.0 * C;
226
- gl_FragColor = vec4(texture2D(uVelocity, vUv).xy + force * dt, 0.0, 1.0);
227
- }
228
- `
229
- ), qg = (
230
- /* glsl */
231
- `
232
- precision highp float;
233
- varying vec2 vUv;
234
-
235
- uniform sampler2D uTexture;
236
- uniform sampler2D uObstacle;
237
- uniform sampler2D uBackground;
238
- uniform sampler2D uCoverage;
239
- uniform sampler2D uVelocity;
240
-
241
- uniform vec2 texelSize;
242
- uniform vec3 uWaterColor;
243
- uniform vec3 uGlowColor;
244
- uniform float uRefraction;
245
- uniform float uSpecularExp;
246
- uniform float uShine;
247
- uniform float uWarpStrength;
248
- uniform int uAlgorithm;
249
-
250
- void main () {
251
- float density = max(texture2D(uTexture, vUv).r, 0.0);
252
- float obs = texture2D(uObstacle, vUv).r;
253
- float coverage = texture2D(uCoverage, vUv).r;
254
-
255
- float dL = max(texture2D(uTexture, vUv - vec2(texelSize.x * 2.0, 0.0)).r, 0.0);
256
- float dR = max(texture2D(uTexture, vUv + vec2(texelSize.x * 2.0, 0.0)).r, 0.0);
257
- float dT = max(texture2D(uTexture, vUv + vec2(0.0, texelSize.y * 2.0)).r, 0.0);
258
- float dB = max(texture2D(uTexture, vUv - vec2(0.0, texelSize.y * 2.0)).r, 0.0);
259
-
260
- vec3 normal = normalize(vec3(dL - dR, dB - dT, 0.2));
261
- vec3 lightDir = normalize(vec3(0.5, 1.0, 0.5));
262
- vec3 halfV = normalize(lightDir + vec3(0.0, 0.0, 1.0));
263
- float spec = pow(max(dot(normal, halfV), 0.0), uSpecularExp) * uShine * density;
264
-
265
- vec3 bg = texture2D(uBackground, vUv).rgb;
266
- vec3 color = bg;
267
-
268
- if (uAlgorithm == 1) {
269
- // ── glass ──────────────────────────────────────────────────────────────
270
- // Strong UV distortion only. Image bends but no colour overlay.
271
- vec2 refrUv = clamp(vUv + normal.xy * uRefraction * density * 3.0, 0.0, 1.0);
272
- vec3 refrBg = texture2D(uBackground, mix(vUv, refrUv, 1.0 - obs)).rgb;
273
- color = refrBg + spec * uGlowColor * 2.5;
274
- color = mix(color, bg * 0.6, obs * 0.3);
275
-
276
- } else if (uAlgorithm == 2) {
277
- // ── ink ────────────────────────────────────────────────────────────────
278
- // Dense opaque pigment that stains. Subtle refraction underneath.
279
- float inkD = min(density * 4.0, 1.0);
280
- vec2 refrUv = clamp(vUv + normal.xy * uRefraction * density * 0.4, 0.0, 1.0);
281
- vec3 refrBg = texture2D(uBackground, mix(vUv, refrUv, 1.0 - obs)).rgb;
282
- color = mix(refrBg, uWaterColor + spec * uGlowColor, inkD);
283
- color = mix(color, bg * 0.5, obs * 0.15);
284
-
285
- } else if (uAlgorithm == 3) {
286
- // ── aurora ─────────────────────────────────────────────────────────────
287
- // Velocity field warps background UVs — liquid metal / lava-lamp feel.
288
- vec2 vel = texture2D(uVelocity, vUv).xy;
289
- float velMag = clamp(length(vel) * 20.0, 0.0, 1.0);
290
- vec2 warpUv = clamp(vUv + vel * uWarpStrength, 0.0, 1.0);
291
- vec3 warpBg = texture2D(uBackground, warpUv).rgb;
292
- color = mix(bg, warpBg, velMag * (1.0 - obs));
293
- color += spec * uGlowColor * velMag * 1.5;
294
- color += uWaterColor * density * 0.3;
295
- color = mix(color, bg * 0.5, obs * 0.2);
296
-
297
- } else if (uAlgorithm == 4) {
298
- // ── ripple ─────────────────────────────────────────────────────────────
299
- // Exaggerated normal perturbation + Fresnel rim — calm water surface.
300
- vec2 rippleUv = clamp(vUv + normal.xy * uRefraction * density * 6.0, 0.0, 1.0);
301
- vec3 refrBg = texture2D(uBackground, mix(vUv, rippleUv, 1.0 - obs)).rgb;
302
- float fresnel = pow(clamp(1.0 - dot(normal, vec3(0.0, 0.0, 1.0)), 0.0, 1.0), 3.0) * density;
303
- color = refrBg;
304
- color += fresnel * uGlowColor * 2.0;
305
- color += spec * uGlowColor * density * 2.0;
306
- color = mix(color, bg * 0.5, obs * 0.2);
307
-
308
- } else {
309
- // ── standard (0) ───────────────────────────────────────────────────────
310
- // Original: colour overlay blended over refracted background.
311
- vec2 refrUv = vUv + normal.xy * uRefraction * density;
312
- vec3 refrBg = texture2D(uBackground, mix(vUv, refrUv, 1.0 - obs)).rgb;
313
- color = mix(refrBg, uWaterColor, min(density * 1.5, 0.8));
314
- color += spec * uGlowColor;
315
- color = mix(color, bg * 0.5, obs * 0.2);
316
- }
317
-
318
- // Premultiplied alpha — transparent where there is neither content nor fluid,
319
- // letting the CSS backgroundColor on the container div show through.
320
- float alpha = clamp(max(density * 1.5, coverage), 0.0, 1.0);
321
- gl_FragColor = vec4(color * alpha, alpha);
322
- }
323
- `
324
- );
325
- function $g(i) {
326
- const g = { alpha: !0, depth: !1, stencil: !1, antialias: !0, preserveDrawingBuffer: !1 };
327
- let C = i.getContext("webgl2", g);
328
- const e = !!C;
329
- e || (C = i.getContext("webgl", g) || i.getContext("experimental-webgl", g), C.getExtension("EXT_color_buffer_half_float"));
330
- const s = e ? null : C.getExtension("OES_texture_half_float"), o = e ? C.HALF_FLOAT : s.HALF_FLOAT_OES;
331
- return C.getExtension("EXT_color_buffer_float"), C.getExtension("OES_texture_half_float_linear"), {
332
- gl: C,
333
- isWebGL2: e,
334
- ext: {
335
- internalFormat: e ? C.RGBA16F : C.RGBA,
336
- format: C.RGBA,
337
- type: o
338
- }
339
- };
340
- }
341
- class Q {
342
- constructor(g, C, e) {
343
- mg(this, "program");
344
- mg(this, "uniforms", {});
345
- mg(this, "_gl");
346
- this._gl = g, this.program = g.createProgram(), g.attachShader(this.program, this._compile(g.VERTEX_SHADER, C)), g.attachShader(this.program, this._compile(g.FRAGMENT_SHADER, e)), g.linkProgram(this.program);
347
- const s = g.getProgramParameter(this.program, g.ACTIVE_UNIFORMS);
348
- for (let o = 0; o < s; o++) {
349
- const l = g.getActiveUniform(this.program, o).name;
350
- this.uniforms[l] = g.getUniformLocation(this.program, l);
351
- }
352
- }
353
- _compile(g, C) {
354
- const e = this._gl, s = e.createShader(g);
355
- return e.shaderSource(s, C), e.compileShader(s), s;
356
- }
357
- bind() {
358
- this._gl.useProgram(this.program);
359
- }
360
- dispose() {
361
- this._gl.deleteProgram(this.program);
362
- }
363
- }
364
- function gI(i) {
365
- return {
366
- advection: new Q(i, O, Ng),
367
- divergence: new Q(i, O, zg),
368
- pressure: new Q(i, O, Og),
369
- gradientSubtract: new Q(i, O, Qg),
370
- splat: new Q(i, O, jg),
371
- curl: new Q(i, O, Pg),
372
- vorticity: new Q(i, O, _g),
373
- display: new Q(i, O, qg)
374
- };
375
- }
376
- function Zg(i, g, C, e) {
377
- i.activeTexture(i.TEXTURE0);
378
- const s = i.createTexture();
379
- i.bindTexture(i.TEXTURE_2D, s), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MIN_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), i.texImage2D(i.TEXTURE_2D, 0, g.internalFormat, C, e, 0, g.format, g.type, null);
380
- const o = i.createFramebuffer();
381
- return i.bindFramebuffer(i.FRAMEBUFFER, o), i.framebufferTexture2D(i.FRAMEBUFFER, i.COLOR_ATTACHMENT0, i.TEXTURE_2D, s, 0), { tex: s, fbo: o, width: C, height: e };
382
- }
383
- function pg(i, g, C, e) {
384
- let s = Zg(i, g, C, e), o = Zg(i, g, C, e);
385
- return {
386
- get read() {
387
- return s;
388
- },
389
- get write() {
390
- return o;
391
- },
392
- swap() {
393
- [s, o] = [o, s];
394
- },
395
- dispose() {
396
- i.deleteTexture(s.tex), i.deleteFramebuffer(s.fbo), i.deleteTexture(o.tex), i.deleteFramebuffer(o.fbo);
397
- }
398
- };
399
- }
400
- function II(i) {
401
- const g = i.createBuffer();
402
- return i.bindBuffer(i.ARRAY_BUFFER, g), i.bufferData(
403
- i.ARRAY_BUFFER,
404
- new Float32Array([-1, -1, -1, 1, 1, 1, 1, -1]),
405
- i.STATIC_DRAW
406
- ), i.vertexAttribPointer(0, 2, i.FLOAT, !1, 0, 0), i.enableVertexAttribArray(0), function(e) {
407
- i.bindFramebuffer(i.FRAMEBUFFER, e), i.drawArrays(i.TRIANGLE_FAN, 0, 4);
408
- };
409
- }
410
- function hg(i, g, C, e, s = "cover") {
411
- let o;
412
- s === "cover" ? o = Math.max(C / i, e / g) : s === "contain" ? o = Math.min(C / i, e / g) : typeof s == "string" && s.endsWith("%") ? o = Math.min(C / i, e / g) * (parseFloat(s) / 100) : typeof s == "string" && s.endsWith("px") ? o = parseFloat(s) / Math.max(i, g) : typeof s == "number" ? o = s : o = Math.max(C / i, e / g);
413
- const l = i * o, G = g * o;
414
- return { x: (C - l) / 2, y: (e - G) / 2, drawW: l, drawH: G };
415
- }
416
- function CI(i, g, C, e, s = null, o = "cover") {
417
- const { text: l, fontSize: G, color: n, fontFamily: d = "sans-serif", fontWeight: u = 900 } = e, b = new OffscreenCanvas(g, C), c = b.getContext("2d");
418
- ((K, m = 0) => {
419
- if (s) {
420
- c.clearRect(0, 0, g, C), c.fillStyle = "black", c.fillRect(0, 0, g, C);
421
- const { x: Z, y: A, drawW: r, drawH: L } = hg(
422
- s.width,
423
- s.height,
424
- g,
425
- C,
426
- o
427
- );
428
- c.drawImage(s, Z, A, r, L);
429
- } else
430
- c.fillStyle = "black", c.fillRect(0, 0, g, C);
431
- c.shadowColor = K, c.fillStyle = K, c.font = `${u} ${G}px ${d}`, c.textAlign = "center", c.textBaseline = "middle", c.fillText(l, g / 2, C / 2);
432
- })(n);
433
- const k = cg(i, b);
434
- c.fillStyle = "black", c.fillRect(0, 0, g, C), c.fillStyle = "white", c.font = `${u} ${G}px ${d}`, c.textAlign = "center", c.textBaseline = "middle", c.fillText(l, g / 2, C / 2);
435
- const Y = cg(i, b);
436
- return { backgroundTex: k, obstacleTex: Y, coverageTex: Y };
437
- }
438
- function iI(i, g, C, e, s = 0, o = "cover", l = null, G = "cover") {
439
- const n = new OffscreenCanvas(C, e), d = n.getContext("2d"), { x: u, y: b, drawW: c, drawH: p } = hg(g.width, g.height, C, e, o);
440
- if (d.clearRect(0, 0, C, e), d.fillStyle = "black", d.fillRect(0, 0, C, e), l) {
441
- const {
442
- x: m,
443
- y: Z,
444
- drawW: A,
445
- drawH: r
446
- } = hg(l.width, l.height, C, e, G);
447
- d.filter = `brightness(${s}) blur(8px)`, d.drawImage(l, m, Z, A, r), d.filter = "none";
448
- }
449
- d.drawImage(g, u, b, c, p);
450
- const k = cg(i, n);
451
- d.clearRect(0, 0, C, e), d.fillStyle = "black", d.fillRect(0, 0, C, e), d.filter = `brightness(${s}) blur(8px)`, d.drawImage(g, u, b, c, p), d.filter = "none";
452
- const Y = cg(i, n);
453
- d.clearRect(0, 0, C, e), d.fillStyle = "black", d.fillRect(0, 0, C, e), d.fillStyle = "white", d.fillRect(
454
- Math.max(0, u),
455
- Math.max(0, b),
456
- Math.min(c, C - Math.max(0, u)),
457
- Math.min(p, e - Math.max(0, b))
458
- );
459
- const K = cg(i, n);
460
- return { backgroundTex: k, obstacleTex: Y, coverageTex: K };
461
- }
462
- function cg(i, g) {
463
- const C = i.createTexture();
464
- return i.bindTexture(i.TEXTURE_2D, C), i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, !0), i.texImage2D(i.TEXTURE_2D, 0, i.RGB, i.RGB, i.UNSIGNED_BYTE, g), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MIN_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), C;
465
- }
466
- async function wg(i) {
467
- const g = await fetch(i);
468
- if (!g.ok)
469
- throw new Error(`Failed to fetch image: ${i} (${g.status})`);
470
- const C = await g.blob();
471
- return createImageBitmap(C);
472
- }
473
- const Ug = typeof requestAnimationFrame < "u" ? requestAnimationFrame.bind(globalThis) : (i) => setTimeout(i, 1e3 / 60), eI = typeof cancelAnimationFrame < "u" ? cancelAnimationFrame.bind(globalThis) : clearTimeout, Hg = 0.016, sI = { standard: 0, glass: 1, ink: 2, aurora: 3, ripple: 4 };
474
- var q, R, Ag, $, eg, w, U, j, P, X, S, T, x, M, E, H, D, F, sg, gg, V, v, J, Ig, Cg, lg, dg, Vg, _, ig, og, rg, ag, Lg, ug, yg, Gg, fg;
475
- class vg {
476
- constructor(g, C = {}) {
477
- // ---------------------------------------------------------------------------
478
- // Private helpers
479
- // ---------------------------------------------------------------------------
480
- a(this, Cg);
481
- a(this, dg);
482
- a(this, _);
483
- a(this, og);
484
- a(this, ag);
485
- a(this, ug);
486
- a(this, Gg);
487
- a(this, q, void 0);
488
- a(this, R, void 0);
489
- a(this, Ag, void 0);
490
- a(this, $, void 0);
491
- a(this, eg, void 0);
492
- a(this, w, 0);
493
- a(this, U, 0);
494
- a(this, j, 0);
495
- a(this, P, 0);
496
- a(this, X, null);
497
- a(this, S, null);
498
- a(this, T, null);
499
- a(this, x, null);
500
- a(this, M, null);
501
- a(this, E, null);
502
- a(this, H, null);
503
- a(this, D, null);
504
- // binary content mask for transparent canvas support
505
- a(this, F, null);
506
- // optional background image (from backgroundSrc prop)
507
- a(this, sg, "cover");
508
- a(this, gg, void 0);
509
- a(this, V, { x: 0, y: 0, dx: 0, dy: 0, targetX: 0, targetY: 0, moved: !1 });
510
- // Stores source so textures can be rebuilt on resize
511
- a(this, v, null);
512
- a(this, J, null);
513
- a(this, Ig, !1);
514
- t(this, q, g), t(this, gg, Kg(C));
515
- const { gl: e, ext: s } = $g(g);
516
- t(this, R, e), t(this, Ag, s), t(this, $, gI(e)), t(this, eg, II(e)), e.clearColor(0, 0, 0, 0);
517
- }
518
- // ---------------------------------------------------------------------------
519
- // Public API
520
- // ---------------------------------------------------------------------------
521
- setTextSource(g) {
522
- t(this, v, { type: "text", opts: g }), y(this, Cg, lg).call(this), y(this, _, ig).call(this), y(this, og, rg).call(this);
523
- }
524
- async setImageSource(g, C = 0, e = "cover") {
525
- const s = await wg(g);
526
- t(this, v, { type: "image", bitmap: s, effect: C, size: e }), y(this, Cg, lg).call(this), y(this, _, ig).call(this), y(this, og, rg).call(this);
527
- }
528
- setImageBitmap(g, C = 0, e = "cover") {
529
- t(this, v, { type: "image", bitmap: g, effect: C, size: e }), y(this, Cg, lg).call(this), y(this, _, ig).call(this), y(this, og, rg).call(this);
530
- }
531
- setBackground(g, C = "cover") {
532
- I(this, F) && I(this, F) !== g && I(this, F).close(), t(this, F, g), t(this, sg, C ?? "cover"), I(this, v) && I(this, w) > 0 && y(this, _, ig).call(this);
533
- }
534
- handleMove(g, C, e = 1) {
535
- I(this, V).moved = !0, I(this, V).dx = (g - I(this, V).targetX) * e, I(this, V).dy = (C - I(this, V).targetY) * e, I(this, V).targetX = g, I(this, V).targetY = C;
536
- }
537
- /**
538
- * Immediately applies one fluid splat at (x, y) with explicit velocity (vx, vy).
539
- * Safe to call multiple times per frame — each call writes directly to the FBOs.
540
- * Designed for programmatic use cases (e.g. particle systems, attractor paths)
541
- * where you want N independent injection points per frame without flooding the
542
- * mouse-state machine or the worker message queue.
543
- */
544
- splat(g, C, e, s, o = 1) {
545
- if (!I(this, Ig) || I(this, w) === 0)
546
- return;
547
- const l = I(this, R), G = I(this, gg), { splat: n } = I(this, $), d = I(this, eg);
548
- l.viewport(0, 0, I(this, j), I(this, P)), n.bind(), l.uniform1f(n.uniforms.aspectRatio, I(this, w) / I(this, U)), l.uniform2f(n.uniforms.point, g / I(this, w), 1 - C / I(this, U)), l.uniform1f(n.uniforms.radius, G.splatRadius), l.uniform1i(n.uniforms.uTarget, 0), l.activeTexture(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, I(this, S).read.tex), l.uniform3f(n.uniforms.color, e * G.splatForce * o, -s * G.splatForce * o, 0), d(I(this, S).write.fbo), I(this, S).swap(), l.activeTexture(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, I(this, X).read.tex), l.uniform3f(n.uniforms.color, o, o, o), d(I(this, X).write.fbo), I(this, X).swap();
549
- }
550
- resize(g, C) {
551
- g !== void 0 && g > 0 ? (t(this, w, I(this, q).width = g), t(this, U, I(this, q).height = C), t(this, j, g >> 1), t(this, P, C >> 1), y(this, dg, Vg).call(this)) : y(this, Cg, lg).call(this), I(this, v) && y(this, _, ig).call(this);
552
- }
553
- updateConfig(g) {
554
- Object.assign(I(this, gg), g);
555
- }
556
- destroy() {
557
- this.stop();
558
- const g = I(this, R);
559
- y(this, ag, Lg).call(this), y(this, ug, yg).call(this), I(this, F) && (I(this, F).close(), t(this, F, null));
560
- for (const e of Object.values(I(this, $)))
561
- e.dispose();
562
- const C = g.getExtension("WEBGL_lose_context");
563
- C == null || C.loseContext();
564
- }
565
- // ---------------------------------------------------------------------------
566
- // Loop control
567
- // ---------------------------------------------------------------------------
568
- start() {
569
- if (I(this, J) !== null)
570
- return;
571
- const g = () => {
572
- y(this, Gg, fg).call(this), t(this, J, Ug(g));
573
- };
574
- t(this, J, Ug(g));
575
- }
576
- stop() {
577
- I(this, J) !== null && (eI(I(this, J)), t(this, J, null));
578
- }
579
- get isRunning() {
580
- return I(this, J) !== null;
581
- }
582
- }
583
- q = new WeakMap(), R = new WeakMap(), Ag = new WeakMap(), $ = new WeakMap(), eg = new WeakMap(), w = new WeakMap(), U = new WeakMap(), j = new WeakMap(), P = new WeakMap(), X = new WeakMap(), S = new WeakMap(), T = new WeakMap(), x = new WeakMap(), M = new WeakMap(), E = new WeakMap(), H = new WeakMap(), D = new WeakMap(), F = new WeakMap(), sg = new WeakMap(), gg = new WeakMap(), V = new WeakMap(), v = new WeakMap(), J = new WeakMap(), Ig = new WeakMap(), Cg = new WeakSet(), lg = function() {
584
- const g = I(this, q);
585
- t(this, w, g.width = g.clientWidth || g.width), t(this, U, g.height = g.clientHeight || g.height), !(I(this, w) === 0 || I(this, U) === 0) && (t(this, j, I(this, w) >> 1), t(this, P, I(this, U) >> 1), y(this, dg, Vg).call(this));
586
- }, dg = new WeakSet(), Vg = function() {
587
- const g = I(this, R), C = I(this, Ag), e = I(this, j), s = I(this, P);
588
- y(this, ag, Lg).call(this), t(this, X, pg(g, C, e, s)), t(this, S, pg(g, C, e, s)), t(this, x, pg(g, C, e, s)), t(this, T, Zg(g, C, e, s)), t(this, M, Zg(g, C, e, s));
589
- }, _ = new WeakSet(), ig = function() {
590
- if (!(!I(this, v) || I(this, w) === 0)) {
591
- if (y(this, ug, yg).call(this), I(this, v).type === "text") {
592
- const { backgroundTex: g, obstacleTex: C, coverageTex: e } = CI(
593
- I(this, R),
594
- I(this, w),
595
- I(this, U),
596
- I(this, v).opts,
597
- I(this, F),
598
- I(this, sg)
599
- );
600
- t(this, E, g), t(this, H, C), t(this, D, e);
601
- } else {
602
- const { backgroundTex: g, obstacleTex: C, coverageTex: e } = iI(
603
- I(this, R),
604
- I(this, v).bitmap,
605
- I(this, w),
606
- I(this, U),
607
- I(this, v).effect,
608
- I(this, v).size,
609
- I(this, F),
610
- I(this, sg)
611
- );
612
- t(this, E, g), t(this, H, C), t(this, D, e);
613
- }
614
- t(this, Ig, !0);
615
- }
616
- }, og = new WeakSet(), rg = function() {
617
- I(this, Ig) && !this.isRunning && this.start();
618
- }, ag = new WeakSet(), Lg = function() {
619
- var g, C, e;
620
- (g = I(this, X)) == null || g.dispose(), (C = I(this, S)) == null || C.dispose(), (e = I(this, x)) == null || e.dispose(), I(this, T) && (I(this, R).deleteTexture(I(this, T).tex), I(this, R).deleteFramebuffer(I(this, T).fbo)), I(this, M) && (I(this, R).deleteTexture(I(this, M).tex), I(this, R).deleteFramebuffer(I(this, M).fbo)), t(this, X, t(this, S, t(this, x, t(this, T, t(this, M, null)))));
621
- }, ug = new WeakSet(), yg = function() {
622
- I(this, E) && I(this, R).deleteTexture(I(this, E)), I(this, H) && I(this, R).deleteTexture(I(this, H)), I(this, D) && I(this, D) !== I(this, H) && I(this, R).deleteTexture(I(this, D)), t(this, E, t(this, H, t(this, D, null)));
623
- }, Gg = new WeakSet(), fg = function() {
624
- if (!I(this, Ig) || I(this, w) === 0)
625
- return;
626
- const g = I(this, R), C = I(this, gg), { advection: e, divergence: s, pressure: o, gradientSubtract: l, splat: G, curl: n, vorticity: d, display: u } = I(this, $);
627
- I(this, V).x += (I(this, V).targetX - I(this, V).x) * 0.15, I(this, V).y += (I(this, V).targetY - I(this, V).y) * 0.15;
628
- const b = I(this, j), c = I(this, P), p = I(this, eg);
629
- g.viewport(0, 0, b, c), e.bind(), g.uniform2f(e.uniforms.texelSize, 1 / b, 1 / c), g.uniform1f(e.uniforms.dt, Hg), g.uniform1i(e.uniforms.uObstacle, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, H)), g.uniform1f(e.uniforms.dissipation, C.velocityDissipation), g.uniform1i(e.uniforms.uVelocity, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(e.uniforms.uSource, 1), p(I(this, S).write.fbo), I(this, S).swap(), g.uniform1f(e.uniforms.dissipation, C.densityDissipation), g.uniform1i(e.uniforms.uSource, 2), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, X).read.tex), p(I(this, X).write.fbo), I(this, X).swap(), n.bind(), g.uniform2f(n.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(n.uniforms.uVelocity, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), p(I(this, M).fbo), d.bind(), g.uniform2f(d.uniforms.texelSize, 1 / b, 1 / c), g.uniform1f(d.uniforms.curl, C.curl), g.uniform1f(d.uniforms.dt, Hg), g.uniform1i(d.uniforms.uVelocity, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(d.uniforms.uCurl, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, M).tex), p(I(this, S).write.fbo), I(this, S).swap(), I(this, V).moved && (G.bind(), g.uniform1f(G.uniforms.aspectRatio, I(this, w) / I(this, U)), g.uniform2f(G.uniforms.point, I(this, V).x / I(this, w), 1 - I(this, V).y / I(this, U)), g.uniform1f(G.uniforms.radius, C.splatRadius), g.uniform1i(G.uniforms.uTarget, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform3f(G.uniforms.color, I(this, V).dx * C.splatForce, -I(this, V).dy * C.splatForce, 0), p(I(this, S).write.fbo), I(this, S).swap(), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, X).read.tex), g.uniform3f(G.uniforms.color, 1, 1, 1), p(I(this, X).write.fbo), I(this, X).swap(), I(this, V).moved = !1), s.bind(), g.uniform2f(s.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(s.uniforms.uVelocity, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(s.uniforms.uObstacle, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, H)), p(I(this, T).fbo), o.bind(), g.uniform2f(o.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(o.uniforms.uDivergence, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, T).tex), g.uniform1i(o.uniforms.uObstacle, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, H));
630
- for (let k = 0; k < C.pressureIterations; k++)
631
- g.uniform1i(o.uniforms.uPressure, 2), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, x).read.tex), p(I(this, x).write.fbo), I(this, x).swap();
632
- l.bind(), g.uniform2f(l.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(l.uniforms.uPressure, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, x).read.tex), g.uniform1i(l.uniforms.uVelocity, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(l.uniforms.uObstacle, 2), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, H)), p(I(this, S).write.fbo), I(this, S).swap(), g.viewport(0, 0, I(this, w), I(this, U)), g.bindFramebuffer(g.FRAMEBUFFER, null), g.clear(g.COLOR_BUFFER_BIT), u.bind(), g.uniform2f(u.uniforms.texelSize, 1 / I(this, w), 1 / I(this, U)), g.uniform3fv(u.uniforms.uWaterColor, C.waterColor), g.uniform3fv(u.uniforms.uGlowColor, C.glowColor), g.uniform1f(u.uniforms.uRefraction, C.refraction), g.uniform1f(u.uniforms.uSpecularExp, C.specularExp), g.uniform1f(u.uniforms.uShine, C.shine), g.uniform1f(u.uniforms.uWarpStrength, C.warpStrength ?? 0.015), g.uniform1i(u.uniforms.uAlgorithm, sI[C.algorithm] ?? 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, X).read.tex), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, H)), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, E)), g.activeTexture(g.TEXTURE3), g.bindTexture(g.TEXTURE_2D, I(this, D)), g.activeTexture(g.TEXTURE4), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(u.uniforms.uTexture, 0), g.uniform1i(u.uniforms.uObstacle, 1), g.uniform1i(u.uniforms.uBackground, 2), g.uniform1i(u.uniforms.uCoverage, 3), g.uniform1i(u.uniforms.uVelocity, 4), p(null);
633
- };
634
- const Tg = "dmFyIFJlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5Owp2YXIgeWUgPSAoaSwgZSwgcikgPT4gZSBpbiBpID8gUmUoaSwgZSwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogciB9KSA6IGlbZV0gPSByOwp2YXIgaWUgPSAoaSwgZSwgcikgPT4gKHllKGksIHR5cGVvZiBlICE9ICJzeW1ib2wiID8gZSArICIiIDogZSwgciksIHIpLCBjZSA9IChpLCBlLCByKSA9PiB7CiAgaWYgKCFlLmhhcyhpKSkKICAgIHRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIgKyByKTsKfTsKdmFyIHQgPSAoaSwgZSwgcikgPT4gKGNlKGksIGUsICJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLCByID8gci5jYWxsKGkpIDogZS5nZXQoaSkpLCBsID0gKGksIGUsIHIpID0+IHsKICBpZiAoZS5oYXMoaSkpCiAgICB0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTsKICBlIGluc3RhbmNlb2YgV2Vha1NldCA/IGUuYWRkKGkpIDogZS5zZXQoaSwgcik7Cn0sIGEgPSAoaSwgZSwgciwgbykgPT4gKGNlKGksIGUsICJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksIG8gPyBvLmNhbGwoaSwgcikgOiBlLnNldChpLCByKSwgcik7CnZhciBUID0gKGksIGUsIHIpID0+IChjZShpLCBlLCAiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksIHIpOwpjb25zdCBkZSA9IHsKICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTkyLAogIHZlbG9jaXR5RGlzc2lwYXRpb246IDAuOTMsCiAgcHJlc3N1cmVJdGVyYXRpb25zOiAxLAogIGN1cmw6IDFlLTQsCiAgc3BsYXRSYWRpdXM6IDRlLTMsCiAgc3BsYXRGb3JjZTogMC45MSwKICByZWZyYWN0aW9uOiAwLjI1LAogIHNwZWN1bGFyRXhwOiAxLjAxLAogIHNoaW5lOiAwLjAxLAogIHdhdGVyQ29sb3I6IFswLCAwLCAwXSwKICBnbG93Q29sb3I6IFswLjcsIDAuODUsIDFdLAogIGFsZ29yaXRobTogInN0YW5kYXJkIiwKICB3YXJwU3RyZW5ndGg6IDAuMDE1Cn0sIERlID0gewogIGNhbG06IHsKICAgIGRlbnNpdHlEaXNzaXBhdGlvbjogMC45OTksCiAgICB2ZWxvY2l0eURpc3NpcGF0aW9uOiAwLjk4LAogICAgY3VybDogMWUtNCwKICAgIHNwbGF0UmFkaXVzOiAzZS0zLAogICAgc3BsYXRGb3JjZTogMC41LAogICAgcmVmcmFjdGlvbjogMC4xNSwKICAgIHNoaW5lOiA1ZS0zLAogICAgZ2xvd0NvbG9yOiBbMC42LCAwLjg1LCAxXSwKICAgIHdhdGVyQ29sb3I6IFswLCAwLjAyLCAwLjA1XQogIH0sCiAgc3Rvcm06IHsKICAgIGRlbnNpdHlEaXNzaXBhdGlvbjogMC45NywKICAgIHZlbG9jaXR5RGlzc2lwYXRpb246IDAuODgsCiAgICBjdXJsOiAwLjQ1LAogICAgc3BsYXRSYWRpdXM6IDAuMDEyLAogICAgc3BsYXRGb3JjZTogMywKICAgIHJlZnJhY3Rpb246IDAuNiwKICAgIHNoaW5lOiAwLjA4LAogICAgZ2xvd0NvbG9yOiBbMC4yLCAwLjMsIDAuOF0sCiAgICB3YXRlckNvbG9yOiBbMCwgMCwgMC4xXSwKICAgIHByZXNzdXJlSXRlcmF0aW9uczogMTUwCiAgfSwKICB3YXZlOiB7CiAgICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTk0LAogICAgdmVsb2NpdHlEaXNzaXBhdGlvbjogMC45MiwKICAgIGN1cmw6IDAuMiwKICAgIHNwbGF0UmFkaXVzOiA1ZS0zLAogICAgc3BsYXRGb3JjZTogMS4yLAogICAgcmVmcmFjdGlvbjogMC4zNSwKICAgIHNoaW5lOiAwLjAzLAogICAgcHJlc3N1cmVJdGVyYXRpb25zOiA1LAogICAgZ2xvd0NvbG9yOiBbMC41LCAwLjgsIDFdLAogICAgd2F0ZXJDb2xvcjogWzAsIDAuMDEsIDAuMDNdCiAgfSwKICBuZW9uOiB7CiAgICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTg1LAogICAgdmVsb2NpdHlEaXNzaXBhdGlvbjogMC45MywKICAgIGN1cmw6IDAuMDUsCiAgICBzcGxhdFJhZGl1czogOGUtMywKICAgIHNwbGF0Rm9yY2U6IDEuNSwKICAgIHJlZnJhY3Rpb246IDAuMjUsCiAgICBzcGVjdWxhckV4cDogMC41LAogICAgc2hpbmU6IDAuMTQsCiAgICBnbG93Q29sb3I6IFsxLCAwLjIsIDAuOF0sCiAgICB3YXRlckNvbG9yOiBbMC4wNSwgMCwgMC4wOF0KICB9LAogIHNtb2tlOiB7CiAgICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTk2LAogICAgdmVsb2NpdHlEaXNzaXBhdGlvbjogMC45NywKICAgIGN1cmw6IDAuMDQsCiAgICBzcGxhdFJhZGl1czogOWUtMywKICAgIHNwbGF0Rm9yY2U6IDAuOCwKICAgIHJlZnJhY3Rpb246IDAuMDgsCiAgICBzaGluZTogMCwKICAgIGdsb3dDb2xvcjogWzAuNSwgMC41LCAwLjVdLAogICAgd2F0ZXJDb2xvcjogWzAuMDYsIDAuMDYsIDAuMDZdCiAgfQp9OwpmdW5jdGlvbiBVZShpID0ge30sIGUpIHsKICByZXR1cm4geyAuLi5lID8geyAuLi5kZSwgLi4uRGVbZV0gfSA6IGRlLCAuLi5pIH07Cn0KY29uc3QgTCA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICBhdHRyaWJ1dGUgdmVjMiBhUG9zaXRpb247CiAgdmFyeWluZyB2ZWMyIHZVdjsKICB2YXJ5aW5nIHZlYzIgdkw7IHZhcnlpbmcgdmVjMiB2UjsgdmFyeWluZyB2ZWMyIHZUOyB2YXJ5aW5nIHZlYzIgdkI7CiAgdW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTsKICB2b2lkIG1haW4gKCkgewogICAgdlV2ID0gYVBvc2l0aW9uICogMC41ICsgMC41OwogICAgdkwgPSB2VXYgLSB2ZWMyKHRleGVsU2l6ZS54LCAwLjApOwogICAgdlIgPSB2VXYgKyB2ZWMyKHRleGVsU2l6ZS54LCAwLjApOwogICAgdlQgPSB2VXYgKyB2ZWMyKDAuMCwgdGV4ZWxTaXplLnkpOwogICAgdkIgPSB2VXYgLSB2ZWMyKDAuMCwgdGV4ZWxTaXplLnkpOwogICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFQb3NpdGlvbiwgMC4wLCAxLjApOwogIH0KYAopLCBfZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1U291cmNlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVPYnN0YWNsZTsKICB1bmlmb3JtIHZlYzIgdGV4ZWxTaXplOwogIHVuaWZvcm0gZmxvYXQgZHQ7CiAgdW5pZm9ybSBmbG9hdCBkaXNzaXBhdGlvbjsKICB2b2lkIG1haW4gKCkgewogICAgaWYgKHRleHR1cmUyRCh1T2JzdGFjbGUsIHZVdikuciA+IDAuNSkgeyBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCk7IHJldHVybjsgfQogICAgdmVjMiBjb29yZCA9IHZVdiAtIGR0ICogdGV4dHVyZTJEKHVWZWxvY2l0eSwgdlV2KS54eSAqIHRleGVsU2l6ZTsKICAgIGdsX0ZyYWdDb2xvciA9IGRpc3NpcGF0aW9uICogdGV4dHVyZTJEKHVTb3VyY2UsIGNvb3JkKTsKICB9CmAKKSwgd2UgPSAoCiAgLyogZ2xzbCAqLwogIGAKICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgdmFyeWluZyB2ZWMyIHZMOyB2YXJ5aW5nIHZlYzIgdlI7IHZhcnlpbmcgdmVjMiB2VDsgdmFyeWluZyB2ZWMyIHZCOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1T2JzdGFjbGU7CiAgdm9pZCBtYWluICgpIHsKICAgIGZsb2F0IEwgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2TCkuciA+IDAuNSA/IDAuMCA6IHRleHR1cmUyRCh1VmVsb2NpdHksIHZMKS54OwogICAgZmxvYXQgUiA9IHRleHR1cmUyRCh1T2JzdGFjbGUsIHZSKS5yID4gMC41ID8gMC4wIDogdGV4dHVyZTJEKHVWZWxvY2l0eSwgdlIpLng7CiAgICBmbG9hdCBUID0gdGV4dHVyZTJEKHVPYnN0YWNsZSwgdlQpLnIgPiAwLjUgPyAwLjAgOiB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VCkueTsKICAgIGZsb2F0IEIgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2QikuciA+IDAuNSA/IDAuMCA6IHRleHR1cmUyRCh1VmVsb2NpdHksIHZCKS55OwogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjUgKiAoUiAtIEwgKyBUIC0gQiksIDAuMCwgMC4wLCAxLjApOwogIH0KYAopLCBTZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OyB2YXJ5aW5nIHZlYzIgdkw7IHZhcnlpbmcgdmVjMiB2UjsgdmFyeWluZyB2ZWMyIHZUOyB2YXJ5aW5nIHZlYzIgdkI7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdVByZXNzdXJlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVEaXZlcmdlbmNlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVPYnN0YWNsZTsKICB2b2lkIG1haW4gKCkgewogICAgZmxvYXQgQyA9IHRleHR1cmUyRCh1UHJlc3N1cmUsIHZVdikueDsKICAgIGZsb2F0IEwgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2TCkuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2TCkueDsKICAgIGZsb2F0IFIgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2UikuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2UikueDsKICAgIGZsb2F0IFQgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2VCkuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2VCkueDsKICAgIGZsb2F0IEIgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2QikuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2QikueDsKICAgIGZsb2F0IGRpdiA9IHRleHR1cmUyRCh1RGl2ZXJnZW5jZSwgdlV2KS54OwogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgoTCArIFIgKyBCICsgVCAtIGRpdikgKiAwLjI1LCAwLjAsIDAuMCwgMS4wKTsKICB9CmAKKSwgQ2UgPSAoCiAgLyogZ2xzbCAqLwogIGAKICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgdmFyeWluZyB2ZWMyIHZVdjsgdmFyeWluZyB2ZWMyIHZMOyB2YXJ5aW5nIHZlYzIgdlI7IHZhcnlpbmcgdmVjMiB2VDsgdmFyeWluZyB2ZWMyIHZCOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVQcmVzc3VyZTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1VmVsb2NpdHk7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdU9ic3RhY2xlOwogIHZvaWQgbWFpbiAoKSB7CiAgICBpZiAodGV4dHVyZTJEKHVPYnN0YWNsZSwgdlV2KS5yID4gMC41KSB7IGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wKTsgcmV0dXJuOyB9CiAgICBmbG9hdCBMID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdkwpLng7CiAgICBmbG9hdCBSID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdlIpLng7CiAgICBmbG9hdCBUID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdlQpLng7CiAgICBmbG9hdCBCID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdkIpLng7CiAgICB2ZWMyIHZlbCA9IHRleHR1cmUyRCh1VmVsb2NpdHksIHZVdikueHkgLSB2ZWMyKFIgLSBMLCBUIC0gQik7CiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlbCwgMC4wLCAxLjApOwogIH0KYAopLCBGZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OwogIHVuaWZvcm0gc2FtcGxlcjJEIHVUYXJnZXQ7CiAgdW5pZm9ybSBmbG9hdCBhc3BlY3RSYXRpbzsKICB1bmlmb3JtIHZlYzMgY29sb3I7CiAgdW5pZm9ybSB2ZWMyIHBvaW50OwogIHVuaWZvcm0gZmxvYXQgcmFkaXVzOwogIHZvaWQgbWFpbiAoKSB7CiAgICB2ZWMyIHAgPSB2VXYgLSBwb2ludC54eTsKICAgIHAueCAqPSBhc3BlY3RSYXRpbzsKICAgIHZlYzMgc3BsYXQgPSBleHAoLWRvdChwLCBwKSAvIHJhZGl1cykgKiBjb2xvcjsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4dHVyZTJEKHVUYXJnZXQsIHZVdikueHl6ICsgc3BsYXQsIDEuMCk7CiAgfQpgCiksIFhlID0gKAogIC8qIGdsc2wgKi8KICBgCiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogIHZhcnlpbmcgdmVjMiB2TDsgdmFyeWluZyB2ZWMyIHZSOyB2YXJ5aW5nIHZlYzIgdlQ7IHZhcnlpbmcgdmVjMiB2QjsKICB1bmlmb3JtIHNhbXBsZXIyRCB1VmVsb2NpdHk7CiAgdm9pZCBtYWluICgpIHsKICAgIGZsb2F0IEwgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2TCkueTsKICAgIGZsb2F0IFIgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2UikueTsKICAgIGZsb2F0IFQgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VCkueDsKICAgIGZsb2F0IEIgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2QikueDsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC41ICogKFIgLSBMIC0gVCArIEIpLCAwLjAsIDAuMCwgMS4wKTsKICB9CmAKKSwgQmUgPSAoCiAgLyogZ2xzbCAqLwogIGAKICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgdmFyeWluZyB2ZWMyIHZVdjsgdmFyeWluZyB2ZWMyIHZMOyB2YXJ5aW5nIHZlYzIgdlI7IHZhcnlpbmcgdmVjMiB2VDsgdmFyeWluZyB2ZWMyIHZCOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1Q3VybDsKICB1bmlmb3JtIGZsb2F0IGN1cmw7CiAgdW5pZm9ybSBmbG9hdCBkdDsKICB2b2lkIG1haW4gKCkgewogICAgZmxvYXQgTCA9IHRleHR1cmUyRCh1Q3VybCwgdkwpLng7CiAgICBmbG9hdCBSID0gdGV4dHVyZTJEKHVDdXJsLCB2UikueDsKICAgIGZsb2F0IFQgPSB0ZXh0dXJlMkQodUN1cmwsIHZUKS54OwogICAgZmxvYXQgQiA9IHRleHR1cmUyRCh1Q3VybCwgdkIpLng7CiAgICBmbG9hdCBDID0gdGV4dHVyZTJEKHVDdXJsLCB2VXYpLng7CiAgICB2ZWMyIGZvcmNlID0gMC41ICogdmVjMihhYnMoVCkgLSBhYnMoQiksIGFicyhSKSAtIGFicyhMKSk7CiAgICBmb3JjZSAvPSBsZW5ndGgoZm9yY2UpICsgMC4wMDAxOwogICAgZm9yY2UgKj0gY3VybCAqIDMwLjAgKiBDOwogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VXYpLnh5ICsgZm9yY2UgKiBkdCwgMC4wLCAxLjApOwogIH0KYAopLCBBZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OwoKICB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1T2JzdGFjbGU7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdUJhY2tncm91bmQ7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdUNvdmVyYWdlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKCiAgdW5pZm9ybSB2ZWMyICB0ZXhlbFNpemU7CiAgdW5pZm9ybSB2ZWMzICB1V2F0ZXJDb2xvcjsKICB1bmlmb3JtIHZlYzMgIHVHbG93Q29sb3I7CiAgdW5pZm9ybSBmbG9hdCB1UmVmcmFjdGlvbjsKICB1bmlmb3JtIGZsb2F0IHVTcGVjdWxhckV4cDsKICB1bmlmb3JtIGZsb2F0IHVTaGluZTsKICB1bmlmb3JtIGZsb2F0IHVXYXJwU3RyZW5ndGg7CiAgdW5pZm9ybSBpbnQgICB1QWxnb3JpdGhtOwoKICB2b2lkIG1haW4gKCkgewogICAgZmxvYXQgZGVuc2l0eSAgPSBtYXgodGV4dHVyZTJEKHVUZXh0dXJlLCAgIHZVdikuciwgMC4wKTsKICAgIGZsb2F0IG9icyAgICAgID0gdGV4dHVyZTJEKHVPYnN0YWNsZSwgIHZVdikucjsKICAgIGZsb2F0IGNvdmVyYWdlID0gdGV4dHVyZTJEKHVDb3ZlcmFnZSwgIHZVdikucjsKCiAgICBmbG9hdCBkTCA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiAtIHZlYzIodGV4ZWxTaXplLnggKiAyLjAsIDAuMCkpLnIsIDAuMCk7CiAgICBmbG9hdCBkUiA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiArIHZlYzIodGV4ZWxTaXplLnggKiAyLjAsIDAuMCkpLnIsIDAuMCk7CiAgICBmbG9hdCBkVCA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiArIHZlYzIoMC4wLCB0ZXhlbFNpemUueSAqIDIuMCkpLnIsIDAuMCk7CiAgICBmbG9hdCBkQiA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiAtIHZlYzIoMC4wLCB0ZXhlbFNpemUueSAqIDIuMCkpLnIsIDAuMCk7CgogICAgdmVjMyAgbm9ybWFsICAgPSBub3JtYWxpemUodmVjMyhkTCAtIGRSLCBkQiAtIGRULCAwLjIpKTsKICAgIHZlYzMgIGxpZ2h0RGlyID0gbm9ybWFsaXplKHZlYzMoMC41LCAxLjAsIDAuNSkpOwogICAgdmVjMyAgaGFsZlYgICAgPSBub3JtYWxpemUobGlnaHREaXIgKyB2ZWMzKDAuMCwgMC4wLCAxLjApKTsKICAgIGZsb2F0IHNwZWMgICAgID0gcG93KG1heChkb3Qobm9ybWFsLCBoYWxmViksIDAuMCksIHVTcGVjdWxhckV4cCkgKiB1U2hpbmUgKiBkZW5zaXR5OwoKICAgIHZlYzMgYmcgICAgPSB0ZXh0dXJlMkQodUJhY2tncm91bmQsIHZVdikucmdiOwogICAgdmVjMyBjb2xvciA9IGJnOwoKICAgIGlmICh1QWxnb3JpdGhtID09IDEpIHsKICAgICAgLy8g4pSA4pSAIGdsYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAvLyBTdHJvbmcgVVYgZGlzdG9ydGlvbiBvbmx5LiBJbWFnZSBiZW5kcyBidXQgbm8gY29sb3VyIG92ZXJsYXkuCiAgICAgIHZlYzIgcmVmclV2ID0gY2xhbXAodlV2ICsgbm9ybWFsLnh5ICogdVJlZnJhY3Rpb24gKiBkZW5zaXR5ICogMy4wLCAwLjAsIDEuMCk7CiAgICAgIHZlYzMgcmVmckJnID0gdGV4dHVyZTJEKHVCYWNrZ3JvdW5kLCBtaXgodlV2LCByZWZyVXYsIDEuMCAtIG9icykpLnJnYjsKICAgICAgY29sb3IgPSByZWZyQmcgKyBzcGVjICogdUdsb3dDb2xvciAqIDIuNTsKICAgICAgY29sb3IgPSBtaXgoY29sb3IsIGJnICogMC42LCBvYnMgKiAwLjMpOwoKICAgIH0gZWxzZSBpZiAodUFsZ29yaXRobSA9PSAyKSB7CiAgICAgIC8vIOKUgOKUgCBpbmsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgIC8vIERlbnNlIG9wYXF1ZSBwaWdtZW50IHRoYXQgc3RhaW5zLiBTdWJ0bGUgcmVmcmFjdGlvbiB1bmRlcm5lYXRoLgogICAgICBmbG9hdCBpbmtEICA9IG1pbihkZW5zaXR5ICogNC4wLCAxLjApOwogICAgICB2ZWMyIHJlZnJVdiA9IGNsYW1wKHZVdiArIG5vcm1hbC54eSAqIHVSZWZyYWN0aW9uICogZGVuc2l0eSAqIDAuNCwgMC4wLCAxLjApOwogICAgICB2ZWMzIHJlZnJCZyA9IHRleHR1cmUyRCh1QmFja2dyb3VuZCwgbWl4KHZVdiwgcmVmclV2LCAxLjAgLSBvYnMpKS5yZ2I7CiAgICAgIGNvbG9yID0gbWl4KHJlZnJCZywgdVdhdGVyQ29sb3IgKyBzcGVjICogdUdsb3dDb2xvciwgaW5rRCk7CiAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBiZyAqIDAuNSwgb2JzICogMC4xNSk7CgogICAgfSBlbHNlIGlmICh1QWxnb3JpdGhtID09IDMpIHsKICAgICAgLy8g4pSA4pSAIGF1cm9yYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgLy8gVmVsb2NpdHkgZmllbGQgd2FycHMgYmFja2dyb3VuZCBVVnMg4oCUIGxpcXVpZCBtZXRhbCAvIGxhdmEtbGFtcCBmZWVsLgogICAgICB2ZWMyICB2ZWwgICAgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VXYpLnh5OwogICAgICBmbG9hdCB2ZWxNYWcgPSBjbGFtcChsZW5ndGgodmVsKSAqIDIwLjAsIDAuMCwgMS4wKTsKICAgICAgdmVjMiAgd2FycFV2ID0gY2xhbXAodlV2ICsgdmVsICogdVdhcnBTdHJlbmd0aCwgMC4wLCAxLjApOwogICAgICB2ZWMzICB3YXJwQmcgPSB0ZXh0dXJlMkQodUJhY2tncm91bmQsIHdhcnBVdikucmdiOwogICAgICBjb2xvciAgPSBtaXgoYmcsIHdhcnBCZywgdmVsTWFnICogKDEuMCAtIG9icykpOwogICAgICBjb2xvciArPSBzcGVjICogdUdsb3dDb2xvciAqIHZlbE1hZyAqIDEuNTsKICAgICAgY29sb3IgKz0gdVdhdGVyQ29sb3IgKiBkZW5zaXR5ICogMC4zOwogICAgICBjb2xvciAgPSBtaXgoY29sb3IsIGJnICogMC41LCBvYnMgKiAwLjIpOwoKICAgIH0gZWxzZSBpZiAodUFsZ29yaXRobSA9PSA0KSB7CiAgICAgIC8vIOKUgOKUgCByaXBwbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgIC8vIEV4YWdnZXJhdGVkIG5vcm1hbCBwZXJ0dXJiYXRpb24gKyBGcmVzbmVsIHJpbSDigJQgY2FsbSB3YXRlciBzdXJmYWNlLgogICAgICB2ZWMyICByaXBwbGVVdiA9IGNsYW1wKHZVdiArIG5vcm1hbC54eSAqIHVSZWZyYWN0aW9uICogZGVuc2l0eSAqIDYuMCwgMC4wLCAxLjApOwogICAgICB2ZWMzICByZWZyQmcgICA9IHRleHR1cmUyRCh1QmFja2dyb3VuZCwgbWl4KHZVdiwgcmlwcGxlVXYsIDEuMCAtIG9icykpLnJnYjsKICAgICAgZmxvYXQgZnJlc25lbCAgPSBwb3coY2xhbXAoMS4wIC0gZG90KG5vcm1hbCwgdmVjMygwLjAsIDAuMCwgMS4wKSksIDAuMCwgMS4wKSwgMy4wKSAqIGRlbnNpdHk7CiAgICAgIGNvbG9yICA9IHJlZnJCZzsKICAgICAgY29sb3IgKz0gZnJlc25lbCAqIHVHbG93Q29sb3IgKiAyLjA7CiAgICAgIGNvbG9yICs9IHNwZWMgKiB1R2xvd0NvbG9yICogZGVuc2l0eSAqIDIuMDsKICAgICAgY29sb3IgID0gbWl4KGNvbG9yLCBiZyAqIDAuNSwgb2JzICogMC4yKTsKCiAgICB9IGVsc2UgewogICAgICAvLyDilIDilIAgc3RhbmRhcmQgKDApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAvLyBPcmlnaW5hbDogY29sb3VyIG92ZXJsYXkgYmxlbmRlZCBvdmVyIHJlZnJhY3RlZCBiYWNrZ3JvdW5kLgogICAgICB2ZWMyIHJlZnJVdiA9IHZVdiArIG5vcm1hbC54eSAqIHVSZWZyYWN0aW9uICogZGVuc2l0eTsKICAgICAgdmVjMyByZWZyQmcgPSB0ZXh0dXJlMkQodUJhY2tncm91bmQsIG1peCh2VXYsIHJlZnJVdiwgMS4wIC0gb2JzKSkucmdiOwogICAgICBjb2xvciAgPSBtaXgocmVmckJnLCB1V2F0ZXJDb2xvciwgbWluKGRlbnNpdHkgKiAxLjUsIDAuOCkpOwogICAgICBjb2xvciArPSBzcGVjICogdUdsb3dDb2xvcjsKICAgICAgY29sb3IgID0gbWl4KGNvbG9yLCBiZyAqIDAuNSwgb2JzICogMC4yKTsKICAgIH0KCiAgICAvLyBQcmVtdWx0aXBsaWVkIGFscGhhIOKAlCB0cmFuc3BhcmVudCB3aGVyZSB0aGVyZSBpcyBuZWl0aGVyIGNvbnRlbnQgbm9yIGZsdWlkLAogICAgLy8gbGV0dGluZyB0aGUgQ1NTIGJhY2tncm91bmRDb2xvciBvbiB0aGUgY29udGFpbmVyIGRpdiBzaG93IHRocm91Z2guCiAgICBmbG9hdCBhbHBoYSA9IGNsYW1wKG1heChkZW5zaXR5ICogMS41LCBjb3ZlcmFnZSksIDAuMCwgMS4wKTsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IgKiBhbHBoYSwgYWxwaGEpOwogIH0KYAopOwpmdW5jdGlvbiBMZShpKSB7CiAgY29uc3QgZSA9IHsgYWxwaGE6ICEwLCBkZXB0aDogITEsIHN0ZW5jaWw6ICExLCBhbnRpYWxpYXM6ICEwLCBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ICExIH07CiAgbGV0IHIgPSBpLmdldENvbnRleHQoIndlYmdsMiIsIGUpOwogIGNvbnN0IG8gPSAhIXI7CiAgbyB8fCAociA9IGkuZ2V0Q29udGV4dCgid2ViZ2wiLCBlKSB8fCBpLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsIGUpLCByLmdldEV4dGVuc2lvbigiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IikpOwogIGNvbnN0IHMgPSBvID8gbnVsbCA6IHIuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksIG4gPSBvID8gci5IQUxGX0ZMT0FUIDogcy5IQUxGX0ZMT0FUX09FUzsKICByZXR1cm4gci5nZXRFeHRlbnNpb24oIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSwgci5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIiksIHsKICAgIGdsOiByLAogICAgaXNXZWJHTDI6IG8sCiAgICBleHQ6IHsKICAgICAgaW50ZXJuYWxGb3JtYXQ6IG8gPyByLlJHQkExNkYgOiByLlJHQkEsCiAgICAgIGZvcm1hdDogci5SR0JBLAogICAgICB0eXBlOiBuCiAgICB9CiAgfTsKfQpjbGFzcyBPIHsKICBjb25zdHJ1Y3RvcihlLCByLCBvKSB7CiAgICBpZSh0aGlzLCAicHJvZ3JhbSIpOwogICAgaWUodGhpcywgInVuaWZvcm1zIiwge30pOwogICAgaWUodGhpcywgIl9nbCIpOwogICAgdGhpcy5fZ2wgPSBlLCB0aGlzLnByb2dyYW0gPSBlLmNyZWF0ZVByb2dyYW0oKSwgZS5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB0aGlzLl9jb21waWxlKGUuVkVSVEVYX1NIQURFUiwgcikpLCBlLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHRoaXMuX2NvbXBpbGUoZS5GUkFHTUVOVF9TSEFERVIsIG8pKSwgZS5saW5rUHJvZ3JhbSh0aGlzLnByb2dyYW0pOwogICAgY29uc3QgcyA9IGUuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIGUuQUNUSVZFX1VOSUZPUk1TKTsKICAgIGZvciAobGV0IG4gPSAwOyBuIDwgczsgbisrKSB7CiAgICAgIGNvbnN0IHUgPSBlLmdldEFjdGl2ZVVuaWZvcm0odGhpcy5wcm9ncmFtLCBuKS5uYW1lOwogICAgICB0aGlzLnVuaWZvcm1zW3VdID0gZS5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1KTsKICAgIH0KICB9CiAgX2NvbXBpbGUoZSwgcikgewogICAgY29uc3QgbyA9IHRoaXMuX2dsLCBzID0gby5jcmVhdGVTaGFkZXIoZSk7CiAgICByZXR1cm4gby5zaGFkZXJTb3VyY2UocywgciksIG8uY29tcGlsZVNoYWRlcihzKSwgczsKICB9CiAgYmluZCgpIHsKICAgIHRoaXMuX2dsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTsKICB9CiAgZGlzcG9zZSgpIHsKICAgIHRoaXMuX2dsLmRlbGV0ZVByb2dyYW0odGhpcy5wcm9ncmFtKTsKICB9Cn0KZnVuY3Rpb24gT2UoaSkgewogIHJldHVybiB7CiAgICBhZHZlY3Rpb246IG5ldyBPKGksIEwsIF9lKSwKICAgIGRpdmVyZ2VuY2U6IG5ldyBPKGksIEwsIHdlKSwKICAgIHByZXNzdXJlOiBuZXcgTyhpLCBMLCBTZSksCiAgICBncmFkaWVudFN1YnRyYWN0OiBuZXcgTyhpLCBMLCBDZSksCiAgICBzcGxhdDogbmV3IE8oaSwgTCwgRmUpLAogICAgY3VybDogbmV3IE8oaSwgTCwgWGUpLAogICAgdm9ydGljaXR5OiBuZXcgTyhpLCBMLCBCZSksCiAgICBkaXNwbGF5OiBuZXcgTyhpLCBMLCBBZSkKICB9Owp9CmZ1bmN0aW9uIHNlKGksIGUsIHIsIG8pIHsKICBpLmFjdGl2ZVRleHR1cmUoaS5URVhUVVJFMCk7CiAgY29uc3QgcyA9IGkuY3JlYXRlVGV4dHVyZSgpOwogIGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELCBzKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX01JTl9GSUxURVIsIGkuTElORUFSKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX01BR19GSUxURVIsIGkuTElORUFSKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX1dSQVBfUywgaS5DTEFNUF9UT19FREdFKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX1dSQVBfVCwgaS5DTEFNUF9UT19FREdFKSwgaS50ZXhJbWFnZTJEKGkuVEVYVFVSRV8yRCwgMCwgZS5pbnRlcm5hbEZvcm1hdCwgciwgbywgMCwgZS5mb3JtYXQsIGUudHlwZSwgbnVsbCk7CiAgY29uc3QgbiA9IGkuY3JlYXRlRnJhbWVidWZmZXIoKTsKICByZXR1cm4gaS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUiwgbiksIGkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5GUkFNRUJVRkZFUiwgaS5DT0xPUl9BVFRBQ0hNRU5UMCwgaS5URVhUVVJFXzJELCBzLCAwKSwgeyB0ZXg6IHMsIGZibzogbiwgd2lkdGg6IHIsIGhlaWdodDogbyB9Owp9CmZ1bmN0aW9uIGZlKGksIGUsIHIsIG8pIHsKICBsZXQgcyA9IHNlKGksIGUsIHIsIG8pLCBuID0gc2UoaSwgZSwgciwgbyk7CiAgcmV0dXJuIHsKICAgIGdldCByZWFkKCkgewogICAgICByZXR1cm4gczsKICAgIH0sCiAgICBnZXQgd3JpdGUoKSB7CiAgICAgIHJldHVybiBuOwogICAgfSwKICAgIHN3YXAoKSB7CiAgICAgIFtzLCBuXSA9IFtuLCBzXTsKICAgIH0sCiAgICBkaXNwb3NlKCkgewogICAgICBpLmRlbGV0ZVRleHR1cmUocy50ZXgpLCBpLmRlbGV0ZUZyYW1lYnVmZmVyKHMuZmJvKSwgaS5kZWxldGVUZXh0dXJlKG4udGV4KSwgaS5kZWxldGVGcmFtZWJ1ZmZlcihuLmZibyk7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBQZShpKSB7CiAgY29uc3QgZSA9IGkuY3JlYXRlQnVmZmVyKCk7CiAgcmV0dXJuIGkuYmluZEJ1ZmZlcihpLkFSUkFZX0JVRkZFUiwgZSksIGkuYnVmZmVyRGF0YSgKICAgIGkuQVJSQVlfQlVGRkVSLAogICAgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAtMSwgMSwgMSwgMSwgMSwgLTFdKSwKICAgIGkuU1RBVElDX0RSQVcKICApLCBpLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwgMiwgaS5GTE9BVCwgITEsIDAsIDApLCBpLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLCBmdW5jdGlvbihvKSB7CiAgICBpLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLCBvKSwgaS5kcmF3QXJyYXlzKGkuVFJJQU5HTEVfRkFOLCAwLCA0KTsKICB9Owp9CmZ1bmN0aW9uIHZlKGksIGUsIHIsIG8sIHMgPSAiY292ZXIiKSB7CiAgbGV0IG47CiAgcyA9PT0gImNvdmVyIiA/IG4gPSBNYXRoLm1heChyIC8gaSwgbyAvIGUpIDogcyA9PT0gImNvbnRhaW4iID8gbiA9IE1hdGgubWluKHIgLyBpLCBvIC8gZSkgOiB0eXBlb2YgcyA9PSAic3RyaW5nIiAmJiBzLmVuZHNXaXRoKCIlIikgPyBuID0gTWF0aC5taW4ociAvIGksIG8gLyBlKSAqIChwYXJzZUZsb2F0KHMpIC8gMTAwKSA6IHR5cGVvZiBzID09ICJzdHJpbmciICYmIHMuZW5kc1dpdGgoInB4IikgPyBuID0gcGFyc2VGbG9hdChzKSAvIE1hdGgubWF4KGksIGUpIDogdHlwZW9mIHMgPT0gIm51bWJlciIgPyBuID0gcyA6IG4gPSBNYXRoLm1heChyIC8gaSwgbyAvIGUpOwogIGNvbnN0IHUgPSBpICogbiwgZCA9IGUgKiBuOwogIHJldHVybiB7IHg6IChyIC0gdSkgLyAyLCB5OiAobyAtIGQpIC8gMiwgZHJhd1c6IHUsIGRyYXdIOiBkIH07Cn0KZnVuY3Rpb24gSWUoaSwgZSwgciwgbywgcyA9IG51bGwsIG4gPSAiY292ZXIiKSB7CiAgY29uc3QgeyB0ZXh0OiB1LCBmb250U2l6ZTogZCwgY29sb3I6IEUsIGZvbnRGYW1pbHk6IGMgPSAic2Fucy1zZXJpZiIsIGZvbnRXZWlnaHQ6IGggPSA5MDAgfSA9IG8sIGcgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKGUsIHIpLCBmID0gZy5nZXRDb250ZXh0KCIyZCIpOwogICgocmUsIFRlID0gMCkgPT4gewogICAgaWYgKHMpIHsKICAgICAgZi5jbGVhclJlY3QoMCwgMCwgZSwgciksIGYuZmlsbFN0eWxlID0gImJsYWNrIiwgZi5maWxsUmVjdCgwLCAwLCBlLCByKTsKICAgICAgY29uc3QgeyB4OiBuZSwgeTogdWUsIGRyYXdXOiBsZSwgZHJhd0g6IGdlIH0gPSB2ZSgKICAgICAgICBzLndpZHRoLAogICAgICAgIHMuaGVpZ2h0LAogICAgICAgIGUsCiAgICAgICAgciwKICAgICAgICBuCiAgICAgICk7CiAgICAgIGYuZHJhd0ltYWdlKHMsIG5lLCB1ZSwgbGUsIGdlKTsKICAgIH0gZWxzZQogICAgICBmLmZpbGxTdHlsZSA9ICJibGFjayIsIGYuZmlsbFJlY3QoMCwgMCwgZSwgcik7CiAgICBmLnNoYWRvd0NvbG9yID0gcmUsIGYuZmlsbFN0eWxlID0gcmUsIGYuZm9udCA9IGAke2h9ICR7ZH1weCAke2N9YCwgZi50ZXh0QWxpZ24gPSAiY2VudGVyIiwgZi50ZXh0QmFzZWxpbmUgPSAibWlkZGxlIiwgZi5maWxsVGV4dCh1LCBlIC8gMiwgciAvIDIpOwogIH0pKEUpOwogIGNvbnN0IE4gPSBLKGksIGcpOwogIGYuZmlsbFN0eWxlID0gImJsYWNrIiwgZi5maWxsUmVjdCgwLCAwLCBlLCByKSwgZi5maWxsU3R5bGUgPSAid2hpdGUiLCBmLmZvbnQgPSBgJHtofSAke2R9cHggJHtjfWAsIGYudGV4dEFsaWduID0gImNlbnRlciIsIGYudGV4dEJhc2VsaW5lID0gIm1pZGRsZSIsIGYuZmlsbFRleHQodSwgZSAvIDIsIHIgLyAyKTsKICBjb25zdCB0ZSA9IEsoaSwgZyk7CiAgcmV0dXJuIHsgYmFja2dyb3VuZFRleDogTiwgb2JzdGFjbGVUZXg6IHRlLCBjb3ZlcmFnZVRleDogdGUgfTsKfQpmdW5jdGlvbiBrZShpLCBlLCByLCBvLCBzID0gMCwgbiA9ICJjb3ZlciIsIHUgPSBudWxsLCBkID0gImNvdmVyIikgewogIGNvbnN0IEUgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHIsIG8pLCBjID0gRS5nZXRDb250ZXh0KCIyZCIpLCB7IHg6IGgsIHk6IGcsIGRyYXdXOiBmLCBkcmF3SDogeSB9ID0gdmUoZS53aWR0aCwgZS5oZWlnaHQsIHIsIG8sIG4pOwogIGlmIChjLmNsZWFyUmVjdCgwLCAwLCByLCBvKSwgYy5maWxsU3R5bGUgPSAiYmxhY2siLCBjLmZpbGxSZWN0KDAsIDAsIHIsIG8pLCB1KSB7CiAgICBjb25zdCB7CiAgICAgIHg6IFRlLAogICAgICB5OiBuZSwKICAgICAgZHJhd1c6IHVlLAogICAgICBkcmF3SDogbGUKICAgIH0gPSB2ZSh1LndpZHRoLCB1LmhlaWdodCwgciwgbywgZCk7CiAgICBjLmZpbHRlciA9IGBicmlnaHRuZXNzKCR7c30pIGJsdXIoOHB4KWAsIGMuZHJhd0ltYWdlKHUsIFRlLCBuZSwgdWUsIGxlKSwgYy5maWx0ZXIgPSAibm9uZSI7CiAgfQogIGMuZHJhd0ltYWdlKGUsIGgsIGcsIGYsIHkpOwogIGNvbnN0IE4gPSBLKGksIEUpOwogIGMuY2xlYXJSZWN0KDAsIDAsIHIsIG8pLCBjLmZpbGxTdHlsZSA9ICJibGFjayIsIGMuZmlsbFJlY3QoMCwgMCwgciwgbyksIGMuZmlsdGVyID0gYGJyaWdodG5lc3MoJHtzfSkgYmx1cig4cHgpYCwgYy5kcmF3SW1hZ2UoZSwgaCwgZywgZiwgeSksIGMuZmlsdGVyID0gIm5vbmUiOwogIGNvbnN0IHRlID0gSyhpLCBFKTsKICBjLmNsZWFyUmVjdCgwLCAwLCByLCBvKSwgYy5maWxsU3R5bGUgPSAiYmxhY2siLCBjLmZpbGxSZWN0KDAsIDAsIHIsIG8pLCBjLmZpbGxTdHlsZSA9ICJ3aGl0ZSIsIGMuZmlsbFJlY3QoCiAgICBNYXRoLm1heCgwLCBoKSwKICAgIE1hdGgubWF4KDAsIGcpLAogICAgTWF0aC5taW4oZiwgciAtIE1hdGgubWF4KDAsIGgpKSwKICAgIE1hdGgubWluKHksIG8gLSBNYXRoLm1heCgwLCBnKSkKICApOwogIGNvbnN0IHJlID0gSyhpLCBFKTsKICByZXR1cm4geyBiYWNrZ3JvdW5kVGV4OiBOLCBvYnN0YWNsZVRleDogdGUsIGNvdmVyYWdlVGV4OiByZSB9Owp9CmZ1bmN0aW9uIEsoaSwgZSkgewogIGNvbnN0IHIgPSBpLmNyZWF0ZVRleHR1cmUoKTsKICByZXR1cm4gaS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfMkQsIHIpLCBpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgITApLCBpLnRleEltYWdlMkQoaS5URVhUVVJFXzJELCAwLCBpLlJHQiwgaS5SR0IsIGkuVU5TSUdORURfQllURSwgZSksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9NSU5fRklMVEVSLCBpLkxJTkVBUiksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9NQUdfRklMVEVSLCBpLkxJTkVBUiksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9XUkFQX1MsIGkuQ0xBTVBfVE9fRURHRSksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9XUkFQX1QsIGkuQ0xBTVBfVE9fRURHRSksIHI7Cn0KYXN5bmMgZnVuY3Rpb24gTWUoaSkgewogIGNvbnN0IGUgPSBhd2FpdCBmZXRjaChpKTsKICBpZiAoIWUub2spCiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZTogJHtpfSAoJHtlLnN0YXR1c30pYCk7CiAgY29uc3QgciA9IGF3YWl0IGUuYmxvYigpOwogIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChyKTsKfQpjb25zdCBwZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPCAidSIgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZChnbG9iYWxUaGlzKSA6IChpKSA9PiBzZXRUaW1lb3V0KGksIDFlMyAvIDYwKSwgVmUgPSB0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPCAidSIgPyBjYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbFRoaXMpIDogY2xlYXJUaW1lb3V0LCBFZSA9IDAuMDE2LCBHZSA9IHsgc3RhbmRhcmQ6IDAsIGdsYXNzOiAxLCBpbms6IDIsIGF1cm9yYTogMywgcmlwcGxlOiA0IH07CnZhciBNLCBiLCBKLCBWLCBZLCBwLCBELCBQLCBJLCBSLCB2LCBTLCBDLCBGLCBBLCBVLCBYLCB3LCBxLCBHLCBtLCBfLCBCLCB6LCBXLCBqLCBRLCBoZSwgaywgJCwgSCwgb2UsIFosIG1lLCBlZSwgeGUsIGFlLCBiZTsKY2xhc3MgemUgewogIGNvbnN0cnVjdG9yKGUsIHIgPSB7fSkgewogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBQcml2YXRlIGhlbHBlcnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbCh0aGlzLCBXKTsKICAgIGwodGhpcywgUSk7CiAgICBsKHRoaXMsIGspOwogICAgbCh0aGlzLCBIKTsKICAgIGwodGhpcywgWik7CiAgICBsKHRoaXMsIGVlKTsKICAgIGwodGhpcywgYWUpOwogICAgbCh0aGlzLCBNLCB2b2lkIDApOwogICAgbCh0aGlzLCBiLCB2b2lkIDApOwogICAgbCh0aGlzLCBKLCB2b2lkIDApOwogICAgbCh0aGlzLCBWLCB2b2lkIDApOwogICAgbCh0aGlzLCBZLCB2b2lkIDApOwogICAgbCh0aGlzLCBwLCAwKTsKICAgIGwodGhpcywgRCwgMCk7CiAgICBsKHRoaXMsIFAsIDApOwogICAgbCh0aGlzLCBJLCAwKTsKICAgIGwodGhpcywgUiwgbnVsbCk7CiAgICBsKHRoaXMsIHYsIG51bGwpOwogICAgbCh0aGlzLCBTLCBudWxsKTsKICAgIGwodGhpcywgQywgbnVsbCk7CiAgICBsKHRoaXMsIEYsIG51bGwpOwogICAgbCh0aGlzLCBBLCBudWxsKTsKICAgIGwodGhpcywgVSwgbnVsbCk7CiAgICBsKHRoaXMsIFgsIG51bGwpOwogICAgLy8gYmluYXJ5IGNvbnRlbnQgbWFzayBmb3IgdHJhbnNwYXJlbnQgY2FudmFzIHN1cHBvcnQKICAgIGwodGhpcywgdywgbnVsbCk7CiAgICAvLyBvcHRpb25hbCBiYWNrZ3JvdW5kIGltYWdlIChmcm9tIGJhY2tncm91bmRTcmMgcHJvcCkKICAgIGwodGhpcywgcSwgImNvdmVyIik7CiAgICBsKHRoaXMsIEcsIHZvaWQgMCk7CiAgICBsKHRoaXMsIG0sIHsgeDogMCwgeTogMCwgZHg6IDAsIGR5OiAwLCB0YXJnZXRYOiAwLCB0YXJnZXRZOiAwLCBtb3ZlZDogITEgfSk7CiAgICAvLyBTdG9yZXMgc291cmNlIHNvIHRleHR1cmVzIGNhbiBiZSByZWJ1aWx0IG9uIHJlc2l6ZQogICAgbCh0aGlzLCBfLCBudWxsKTsKICAgIGwodGhpcywgQiwgbnVsbCk7CiAgICBsKHRoaXMsIHosICExKTsKICAgIGEodGhpcywgTSwgZSksIGEodGhpcywgRywgVWUocikpOwogICAgY29uc3QgeyBnbDogbywgZXh0OiBzIH0gPSBMZShlKTsKICAgIGEodGhpcywgYiwgbyksIGEodGhpcywgSiwgcyksIGEodGhpcywgViwgT2UobykpLCBhKHRoaXMsIFksIFBlKG8pKSwgby5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBQdWJsaWMgQVBJCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgc2V0VGV4dFNvdXJjZShlKSB7CiAgICBhKHRoaXMsIF8sIHsgdHlwZTogInRleHQiLCBvcHRzOiBlIH0pLCBUKHRoaXMsIFcsIGopLmNhbGwodGhpcyksIFQodGhpcywgaywgJCkuY2FsbCh0aGlzKSwgVCh0aGlzLCBILCBvZSkuY2FsbCh0aGlzKTsKICB9CiAgYXN5bmMgc2V0SW1hZ2VTb3VyY2UoZSwgciA9IDAsIG8gPSAiY292ZXIiKSB7CiAgICBjb25zdCBzID0gYXdhaXQgTWUoZSk7CiAgICBhKHRoaXMsIF8sIHsgdHlwZTogImltYWdlIiwgYml0bWFwOiBzLCBlZmZlY3Q6IHIsIHNpemU6IG8gfSksIFQodGhpcywgVywgaikuY2FsbCh0aGlzKSwgVCh0aGlzLCBrLCAkKS5jYWxsKHRoaXMpLCBUKHRoaXMsIEgsIG9lKS5jYWxsKHRoaXMpOwogIH0KICBzZXRJbWFnZUJpdG1hcChlLCByID0gMCwgbyA9ICJjb3ZlciIpIHsKICAgIGEodGhpcywgXywgeyB0eXBlOiAiaW1hZ2UiLCBiaXRtYXA6IGUsIGVmZmVjdDogciwgc2l6ZTogbyB9KSwgVCh0aGlzLCBXLCBqKS5jYWxsKHRoaXMpLCBUKHRoaXMsIGssICQpLmNhbGwodGhpcyksIFQodGhpcywgSCwgb2UpLmNhbGwodGhpcyk7CiAgfQogIHNldEJhY2tncm91bmQoZSwgciA9ICJjb3ZlciIpIHsKICAgIHQodGhpcywgdykgJiYgdCh0aGlzLCB3KSAhPT0gZSAmJiB0KHRoaXMsIHcpLmNsb3NlKCksIGEodGhpcywgdywgZSksIGEodGhpcywgcSwgciA/PyAiY292ZXIiKSwgdCh0aGlzLCBfKSAmJiB0KHRoaXMsIHApID4gMCAmJiBUKHRoaXMsIGssICQpLmNhbGwodGhpcyk7CiAgfQogIGhhbmRsZU1vdmUoZSwgciwgbyA9IDEpIHsKICAgIHQodGhpcywgbSkubW92ZWQgPSAhMCwgdCh0aGlzLCBtKS5keCA9IChlIC0gdCh0aGlzLCBtKS50YXJnZXRYKSAqIG8sIHQodGhpcywgbSkuZHkgPSAociAtIHQodGhpcywgbSkudGFyZ2V0WSkgKiBvLCB0KHRoaXMsIG0pLnRhcmdldFggPSBlLCB0KHRoaXMsIG0pLnRhcmdldFkgPSByOwogIH0KICAvKioKICAgKiBJbW1lZGlhdGVseSBhcHBsaWVzIG9uZSBmbHVpZCBzcGxhdCBhdCAoeCwgeSkgd2l0aCBleHBsaWNpdCB2ZWxvY2l0eSAodngsIHZ5KS4KICAgKiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lIOKAlCBlYWNoIGNhbGwgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBGQk9zLgogICAqIERlc2lnbmVkIGZvciBwcm9ncmFtbWF0aWMgdXNlIGNhc2VzIChlLmcuIHBhcnRpY2xlIHN5c3RlbXMsIGF0dHJhY3RvciBwYXRocykKICAgKiB3aGVyZSB5b3Ugd2FudCBOIGluZGVwZW5kZW50IGluamVjdGlvbiBwb2ludHMgcGVyIGZyYW1lIHdpdGhvdXQgZmxvb2RpbmcgdGhlCiAgICogbW91c2Utc3RhdGUgbWFjaGluZSBvciB0aGUgd29ya2VyIG1lc3NhZ2UgcXVldWUuCiAgICovCiAgc3BsYXQoZSwgciwgbywgcywgbiA9IDEpIHsKICAgIGlmICghdCh0aGlzLCB6KSB8fCB0KHRoaXMsIHApID09PSAwKQogICAgICByZXR1cm47CiAgICBjb25zdCB1ID0gdCh0aGlzLCBiKSwgZCA9IHQodGhpcywgRyksIHsgc3BsYXQ6IEUgfSA9IHQodGhpcywgViksIGMgPSB0KHRoaXMsIFkpOwogICAgdS52aWV3cG9ydCgwLCAwLCB0KHRoaXMsIFApLCB0KHRoaXMsIEkpKSwgRS5iaW5kKCksIHUudW5pZm9ybTFmKEUudW5pZm9ybXMuYXNwZWN0UmF0aW8sIHQodGhpcywgcCkgLyB0KHRoaXMsIEQpKSwgdS51bmlmb3JtMmYoRS51bmlmb3Jtcy5wb2ludCwgZSAvIHQodGhpcywgcCksIDEgLSByIC8gdCh0aGlzLCBEKSksIHUudW5pZm9ybTFmKEUudW5pZm9ybXMucmFkaXVzLCBkLnNwbGF0UmFkaXVzKSwgdS51bmlmb3JtMWkoRS51bmlmb3Jtcy51VGFyZ2V0LCAwKSwgdS5hY3RpdmVUZXh0dXJlKHUuVEVYVFVSRTApLCB1LmJpbmRUZXh0dXJlKHUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIHUudW5pZm9ybTNmKEUudW5pZm9ybXMuY29sb3IsIG8gKiBkLnNwbGF0Rm9yY2UgKiBuLCAtcyAqIGQuc3BsYXRGb3JjZSAqIG4sIDApLCBjKHQodGhpcywgdikud3JpdGUuZmJvKSwgdCh0aGlzLCB2KS5zd2FwKCksIHUuYWN0aXZlVGV4dHVyZSh1LlRFWFRVUkUwKSwgdS5iaW5kVGV4dHVyZSh1LlRFWFRVUkVfMkQsIHQodGhpcywgUikucmVhZC50ZXgpLCB1LnVuaWZvcm0zZihFLnVuaWZvcm1zLmNvbG9yLCBuLCBuLCBuKSwgYyh0KHRoaXMsIFIpLndyaXRlLmZibyksIHQodGhpcywgUikuc3dhcCgpOwogIH0KICByZXNpemUoZSwgcikgewogICAgZSAhPT0gdm9pZCAwICYmIGUgPiAwID8gKGEodGhpcywgcCwgdCh0aGlzLCBNKS53aWR0aCA9IGUpLCBhKHRoaXMsIEQsIHQodGhpcywgTSkuaGVpZ2h0ID0gciksIGEodGhpcywgUCwgZSA+PiAxKSwgYSh0aGlzLCBJLCByID4+IDEpLCBUKHRoaXMsIFEsIGhlKS5jYWxsKHRoaXMpKSA6IFQodGhpcywgVywgaikuY2FsbCh0aGlzKSwgdCh0aGlzLCBfKSAmJiBUKHRoaXMsIGssICQpLmNhbGwodGhpcyk7CiAgfQogIHVwZGF0ZUNvbmZpZyhlKSB7CiAgICBPYmplY3QuYXNzaWduKHQodGhpcywgRyksIGUpOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy5zdG9wKCk7CiAgICBjb25zdCBlID0gdCh0aGlzLCBiKTsKICAgIFQodGhpcywgWiwgbWUpLmNhbGwodGhpcyksIFQodGhpcywgZWUsIHhlKS5jYWxsKHRoaXMpLCB0KHRoaXMsIHcpICYmICh0KHRoaXMsIHcpLmNsb3NlKCksIGEodGhpcywgdywgbnVsbCkpOwogICAgZm9yIChjb25zdCBvIG9mIE9iamVjdC52YWx1ZXModCh0aGlzLCBWKSkpCiAgICAgIG8uZGlzcG9zZSgpOwogICAgY29uc3QgciA9IGUuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9sb3NlX2NvbnRleHQiKTsKICAgIHIgPT0gbnVsbCB8fCByLmxvc2VDb250ZXh0KCk7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIExvb3AgY29udHJvbAogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHN0YXJ0KCkgewogICAgaWYgKHQodGhpcywgQikgIT09IG51bGwpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGUgPSAoKSA9PiB7CiAgICAgIFQodGhpcywgYWUsIGJlKS5jYWxsKHRoaXMpLCBhKHRoaXMsIEIsIHBlKGUpKTsKICAgIH07CiAgICBhKHRoaXMsIEIsIHBlKGUpKTsKICB9CiAgc3RvcCgpIHsKICAgIHQodGhpcywgQikgIT09IG51bGwgJiYgKFZlKHQodGhpcywgQikpLCBhKHRoaXMsIEIsIG51bGwpKTsKICB9CiAgZ2V0IGlzUnVubmluZygpIHsKICAgIHJldHVybiB0KHRoaXMsIEIpICE9PSBudWxsOwogIH0KfQpNID0gbmV3IFdlYWtNYXAoKSwgYiA9IG5ldyBXZWFrTWFwKCksIEogPSBuZXcgV2Vha01hcCgpLCBWID0gbmV3IFdlYWtNYXAoKSwgWSA9IG5ldyBXZWFrTWFwKCksIHAgPSBuZXcgV2Vha01hcCgpLCBEID0gbmV3IFdlYWtNYXAoKSwgUCA9IG5ldyBXZWFrTWFwKCksIEkgPSBuZXcgV2Vha01hcCgpLCBSID0gbmV3IFdlYWtNYXAoKSwgdiA9IG5ldyBXZWFrTWFwKCksIFMgPSBuZXcgV2Vha01hcCgpLCBDID0gbmV3IFdlYWtNYXAoKSwgRiA9IG5ldyBXZWFrTWFwKCksIEEgPSBuZXcgV2Vha01hcCgpLCBVID0gbmV3IFdlYWtNYXAoKSwgWCA9IG5ldyBXZWFrTWFwKCksIHcgPSBuZXcgV2Vha01hcCgpLCBxID0gbmV3IFdlYWtNYXAoKSwgRyA9IG5ldyBXZWFrTWFwKCksIG0gPSBuZXcgV2Vha01hcCgpLCBfID0gbmV3IFdlYWtNYXAoKSwgQiA9IG5ldyBXZWFrTWFwKCksIHogPSBuZXcgV2Vha01hcCgpLCBXID0gbmV3IFdlYWtTZXQoKSwgaiA9IGZ1bmN0aW9uKCkgewogIGNvbnN0IGUgPSB0KHRoaXMsIE0pOwogIGEodGhpcywgcCwgZS53aWR0aCA9IGUuY2xpZW50V2lkdGggfHwgZS53aWR0aCksIGEodGhpcywgRCwgZS5oZWlnaHQgPSBlLmNsaWVudEhlaWdodCB8fCBlLmhlaWdodCksICEodCh0aGlzLCBwKSA9PT0gMCB8fCB0KHRoaXMsIEQpID09PSAwKSAmJiAoYSh0aGlzLCBQLCB0KHRoaXMsIHApID4+IDEpLCBhKHRoaXMsIEksIHQodGhpcywgRCkgPj4gMSksIFQodGhpcywgUSwgaGUpLmNhbGwodGhpcykpOwp9LCBRID0gbmV3IFdlYWtTZXQoKSwgaGUgPSBmdW5jdGlvbigpIHsKICBjb25zdCBlID0gdCh0aGlzLCBiKSwgciA9IHQodGhpcywgSiksIG8gPSB0KHRoaXMsIFApLCBzID0gdCh0aGlzLCBJKTsKICBUKHRoaXMsIFosIG1lKS5jYWxsKHRoaXMpLCBhKHRoaXMsIFIsIGZlKGUsIHIsIG8sIHMpKSwgYSh0aGlzLCB2LCBmZShlLCByLCBvLCBzKSksIGEodGhpcywgQywgZmUoZSwgciwgbywgcykpLCBhKHRoaXMsIFMsIHNlKGUsIHIsIG8sIHMpKSwgYSh0aGlzLCBGLCBzZShlLCByLCBvLCBzKSk7Cn0sIGsgPSBuZXcgV2Vha1NldCgpLCAkID0gZnVuY3Rpb24oKSB7CiAgaWYgKCEoIXQodGhpcywgXykgfHwgdCh0aGlzLCBwKSA9PT0gMCkpIHsKICAgIGlmIChUKHRoaXMsIGVlLCB4ZSkuY2FsbCh0aGlzKSwgdCh0aGlzLCBfKS50eXBlID09PSAidGV4dCIpIHsKICAgICAgY29uc3QgeyBiYWNrZ3JvdW5kVGV4OiBlLCBvYnN0YWNsZVRleDogciwgY292ZXJhZ2VUZXg6IG8gfSA9IEllKAogICAgICAgIHQodGhpcywgYiksCiAgICAgICAgdCh0aGlzLCBwKSwKICAgICAgICB0KHRoaXMsIEQpLAogICAgICAgIHQodGhpcywgXykub3B0cywKICAgICAgICB0KHRoaXMsIHcpLAogICAgICAgIHQodGhpcywgcSkKICAgICAgKTsKICAgICAgYSh0aGlzLCBBLCBlKSwgYSh0aGlzLCBVLCByKSwgYSh0aGlzLCBYLCBvKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHsgYmFja2dyb3VuZFRleDogZSwgb2JzdGFjbGVUZXg6IHIsIGNvdmVyYWdlVGV4OiBvIH0gPSBrZSgKICAgICAgICB0KHRoaXMsIGIpLAogICAgICAgIHQodGhpcywgXykuYml0bWFwLAogICAgICAgIHQodGhpcywgcCksCiAgICAgICAgdCh0aGlzLCBEKSwKICAgICAgICB0KHRoaXMsIF8pLmVmZmVjdCwKICAgICAgICB0KHRoaXMsIF8pLnNpemUsCiAgICAgICAgdCh0aGlzLCB3KSwKICAgICAgICB0KHRoaXMsIHEpCiAgICAgICk7CiAgICAgIGEodGhpcywgQSwgZSksIGEodGhpcywgVSwgciksIGEodGhpcywgWCwgbyk7CiAgICB9CiAgICBhKHRoaXMsIHosICEwKTsKICB9Cn0sIEggPSBuZXcgV2Vha1NldCgpLCBvZSA9IGZ1bmN0aW9uKCkgewogIHQodGhpcywgeikgJiYgIXRoaXMuaXNSdW5uaW5nICYmIHRoaXMuc3RhcnQoKTsKfSwgWiA9IG5ldyBXZWFrU2V0KCksIG1lID0gZnVuY3Rpb24oKSB7CiAgdmFyIGUsIHIsIG87CiAgKGUgPSB0KHRoaXMsIFIpKSA9PSBudWxsIHx8IGUuZGlzcG9zZSgpLCAociA9IHQodGhpcywgdikpID09IG51bGwgfHwgci5kaXNwb3NlKCksIChvID0gdCh0aGlzLCBDKSkgPT0gbnVsbCB8fCBvLmRpc3Bvc2UoKSwgdCh0aGlzLCBTKSAmJiAodCh0aGlzLCBiKS5kZWxldGVUZXh0dXJlKHQodGhpcywgUykudGV4KSwgdCh0aGlzLCBiKS5kZWxldGVGcmFtZWJ1ZmZlcih0KHRoaXMsIFMpLmZibykpLCB0KHRoaXMsIEYpICYmICh0KHRoaXMsIGIpLmRlbGV0ZVRleHR1cmUodCh0aGlzLCBGKS50ZXgpLCB0KHRoaXMsIGIpLmRlbGV0ZUZyYW1lYnVmZmVyKHQodGhpcywgRikuZmJvKSksIGEodGhpcywgUiwgYSh0aGlzLCB2LCBhKHRoaXMsIEMsIGEodGhpcywgUywgYSh0aGlzLCBGLCBudWxsKSkpKSk7Cn0sIGVlID0gbmV3IFdlYWtTZXQoKSwgeGUgPSBmdW5jdGlvbigpIHsKICB0KHRoaXMsIEEpICYmIHQodGhpcywgYikuZGVsZXRlVGV4dHVyZSh0KHRoaXMsIEEpKSwgdCh0aGlzLCBVKSAmJiB0KHRoaXMsIGIpLmRlbGV0ZVRleHR1cmUodCh0aGlzLCBVKSksIHQodGhpcywgWCkgJiYgdCh0aGlzLCBYKSAhPT0gdCh0aGlzLCBVKSAmJiB0KHRoaXMsIGIpLmRlbGV0ZVRleHR1cmUodCh0aGlzLCBYKSksIGEodGhpcywgQSwgYSh0aGlzLCBVLCBhKHRoaXMsIFgsIG51bGwpKSk7Cn0sIGFlID0gbmV3IFdlYWtTZXQoKSwgYmUgPSBmdW5jdGlvbigpIHsKICBpZiAoIXQodGhpcywgeikgfHwgdCh0aGlzLCBwKSA9PT0gMCkKICAgIHJldHVybjsKICBjb25zdCBlID0gdCh0aGlzLCBiKSwgciA9IHQodGhpcywgRyksIHsgYWR2ZWN0aW9uOiBvLCBkaXZlcmdlbmNlOiBzLCBwcmVzc3VyZTogbiwgZ3JhZGllbnRTdWJ0cmFjdDogdSwgc3BsYXQ6IGQsIGN1cmw6IEUsIHZvcnRpY2l0eTogYywgZGlzcGxheTogaCB9ID0gdCh0aGlzLCBWKTsKICB0KHRoaXMsIG0pLnggKz0gKHQodGhpcywgbSkudGFyZ2V0WCAtIHQodGhpcywgbSkueCkgKiAwLjE1LCB0KHRoaXMsIG0pLnkgKz0gKHQodGhpcywgbSkudGFyZ2V0WSAtIHQodGhpcywgbSkueSkgKiAwLjE1OwogIGNvbnN0IGcgPSB0KHRoaXMsIFApLCBmID0gdCh0aGlzLCBJKSwgeSA9IHQodGhpcywgWSk7CiAgZS52aWV3cG9ydCgwLCAwLCBnLCBmKSwgby5iaW5kKCksIGUudW5pZm9ybTJmKG8udW5pZm9ybXMudGV4ZWxTaXplLCAxIC8gZywgMSAvIGYpLCBlLnVuaWZvcm0xZihvLnVuaWZvcm1zLmR0LCBFZSksIGUudW5pZm9ybTFpKG8udW5pZm9ybXMudU9ic3RhY2xlLCAwKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTApLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBVKSksIGUudW5pZm9ybTFmKG8udW5pZm9ybXMuZGlzc2lwYXRpb24sIHIudmVsb2NpdHlEaXNzaXBhdGlvbiksIGUudW5pZm9ybTFpKG8udW5pZm9ybXMudVZlbG9jaXR5LCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIGUudW5pZm9ybTFpKG8udW5pZm9ybXMudVNvdXJjZSwgMSksIHkodCh0aGlzLCB2KS53cml0ZS5mYm8pLCB0KHRoaXMsIHYpLnN3YXAoKSwgZS51bmlmb3JtMWYoby51bmlmb3Jtcy5kaXNzaXBhdGlvbiwgci5kZW5zaXR5RGlzc2lwYXRpb24pLCBlLnVuaWZvcm0xaShvLnVuaWZvcm1zLnVTb3VyY2UsIDIpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMiksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFIpLnJlYWQudGV4KSwgeSh0KHRoaXMsIFIpLndyaXRlLmZibyksIHQodGhpcywgUikuc3dhcCgpLCBFLmJpbmQoKSwgZS51bmlmb3JtMmYoRS51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFpKEUudW5pZm9ybXMudVZlbG9jaXR5LCAwKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTApLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIHkodCh0aGlzLCBGKS5mYm8pLCBjLmJpbmQoKSwgZS51bmlmb3JtMmYoYy51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFmKGMudW5pZm9ybXMuY3VybCwgci5jdXJsKSwgZS51bmlmb3JtMWYoYy51bmlmb3Jtcy5kdCwgRWUpLCBlLnVuaWZvcm0xaShjLnVuaWZvcm1zLnVWZWxvY2l0eSwgMCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgdikucmVhZC50ZXgpLCBlLnVuaWZvcm0xaShjLnVuaWZvcm1zLnVDdXJsLCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBGKS50ZXgpLCB5KHQodGhpcywgdikud3JpdGUuZmJvKSwgdCh0aGlzLCB2KS5zd2FwKCksIHQodGhpcywgbSkubW92ZWQgJiYgKGQuYmluZCgpLCBlLnVuaWZvcm0xZihkLnVuaWZvcm1zLmFzcGVjdFJhdGlvLCB0KHRoaXMsIHApIC8gdCh0aGlzLCBEKSksIGUudW5pZm9ybTJmKGQudW5pZm9ybXMucG9pbnQsIHQodGhpcywgbSkueCAvIHQodGhpcywgcCksIDEgLSB0KHRoaXMsIG0pLnkgLyB0KHRoaXMsIEQpKSwgZS51bmlmb3JtMWYoZC51bmlmb3Jtcy5yYWRpdXMsIHIuc3BsYXRSYWRpdXMpLCBlLnVuaWZvcm0xaShkLnVuaWZvcm1zLnVUYXJnZXQsIDApLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIHYpLnJlYWQudGV4KSwgZS51bmlmb3JtM2YoZC51bmlmb3Jtcy5jb2xvciwgdCh0aGlzLCBtKS5keCAqIHIuc3BsYXRGb3JjZSwgLXQodGhpcywgbSkuZHkgKiByLnNwbGF0Rm9yY2UsIDApLCB5KHQodGhpcywgdikud3JpdGUuZmJvKSwgdCh0aGlzLCB2KS5zd2FwKCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgUikucmVhZC50ZXgpLCBlLnVuaWZvcm0zZihkLnVuaWZvcm1zLmNvbG9yLCAxLCAxLCAxKSwgeSh0KHRoaXMsIFIpLndyaXRlLmZibyksIHQodGhpcywgUikuc3dhcCgpLCB0KHRoaXMsIG0pLm1vdmVkID0gITEpLCBzLmJpbmQoKSwgZS51bmlmb3JtMmYocy51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFpKHMudW5pZm9ybXMudVZlbG9jaXR5LCAwKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTApLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIGUudW5pZm9ybTFpKHMudW5pZm9ybXMudU9ic3RhY2xlLCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBVKSksIHkodCh0aGlzLCBTKS5mYm8pLCBuLmJpbmQoKSwgZS51bmlmb3JtMmYobi51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFpKG4udW5pZm9ybXMudURpdmVyZ2VuY2UsIDApLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFMpLnRleCksIGUudW5pZm9ybTFpKG4udW5pZm9ybXMudU9ic3RhY2xlLCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBVKSk7CiAgZm9yIChsZXQgTiA9IDA7IE4gPCByLnByZXNzdXJlSXRlcmF0aW9uczsgTisrKQogICAgZS51bmlmb3JtMWkobi51bmlmb3Jtcy51UHJlc3N1cmUsIDIpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMiksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIEMpLnJlYWQudGV4KSwgeSh0KHRoaXMsIEMpLndyaXRlLmZibyksIHQodGhpcywgQykuc3dhcCgpOwogIHUuYmluZCgpLCBlLnVuaWZvcm0yZih1LnVuaWZvcm1zLnRleGVsU2l6ZSwgMSAvIGcsIDEgLyBmKSwgZS51bmlmb3JtMWkodS51bmlmb3Jtcy51UHJlc3N1cmUsIDApLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIEMpLnJlYWQudGV4KSwgZS51bmlmb3JtMWkodS51bmlmb3Jtcy51VmVsb2NpdHksIDEpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMSksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIHYpLnJlYWQudGV4KSwgZS51bmlmb3JtMWkodS51bmlmb3Jtcy51T2JzdGFjbGUsIDIpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMiksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFUpKSwgeSh0KHRoaXMsIHYpLndyaXRlLmZibyksIHQodGhpcywgdikuc3dhcCgpLCBlLnZpZXdwb3J0KDAsIDAsIHQodGhpcywgcCksIHQodGhpcywgRCkpLCBlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLCBudWxsKSwgZS5jbGVhcihlLkNPTE9SX0JVRkZFUl9CSVQpLCBoLmJpbmQoKSwgZS51bmlmb3JtMmYoaC51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyB0KHRoaXMsIHApLCAxIC8gdCh0aGlzLCBEKSksIGUudW5pZm9ybTNmdihoLnVuaWZvcm1zLnVXYXRlckNvbG9yLCByLndhdGVyQ29sb3IpLCBlLnVuaWZvcm0zZnYoaC51bmlmb3Jtcy51R2xvd0NvbG9yLCByLmdsb3dDb2xvciksIGUudW5pZm9ybTFmKGgudW5pZm9ybXMudVJlZnJhY3Rpb24sIHIucmVmcmFjdGlvbiksIGUudW5pZm9ybTFmKGgudW5pZm9ybXMudVNwZWN1bGFyRXhwLCByLnNwZWN1bGFyRXhwKSwgZS51bmlmb3JtMWYoaC51bmlmb3Jtcy51U2hpbmUsIHIuc2hpbmUpLCBlLnVuaWZvcm0xZihoLnVuaWZvcm1zLnVXYXJwU3RyZW5ndGgsIHIud2FycFN0cmVuZ3RoID8/IDAuMDE1KSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51QWxnb3JpdGhtLCBHZVtyLmFsZ29yaXRobV0gPz8gMCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgUikucmVhZC50ZXgpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMSksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFUpKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTIpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBBKSksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUzKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgWCkpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFNCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIHYpLnJlYWQudGV4KSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51VGV4dHVyZSwgMCksIGUudW5pZm9ybTFpKGgudW5pZm9ybXMudU9ic3RhY2xlLCAxKSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51QmFja2dyb3VuZCwgMiksIGUudW5pZm9ybTFpKGgudW5pZm9ybXMudUNvdmVyYWdlLCAzKSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51VmVsb2NpdHksIDQpLCB5KG51bGwpOwp9OwpsZXQgeCA9IG51bGw7CnNlbGYub25tZXNzYWdlID0gYXN5bmMgKGkpID0+IHsKICBjb25zdCB7IHR5cGU6IGUsIC4uLnIgfSA9IGkuZGF0YTsKICB0cnkgewogICAgc3dpdGNoIChlKSB7CiAgICAgIGNhc2UgImluaXQiOiB7CiAgICAgICAgY29uc3QgeyBjYW52YXM6IG8sIHdpZHRoOiBzLCBoZWlnaHQ6IG4sIGNvbmZpZzogdSB9ID0gcjsKICAgICAgICBvLndpZHRoID0gcywgby5oZWlnaHQgPSBuLCB4ID0gbmV3IHplKG8sIHUpLCBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogInJlYWR5IiB9KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJzZXRUZXh0U291cmNlIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LnNldFRleHRTb3VyY2Uoci5vcHRzKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJzZXRJbWFnZVNvdXJjZSI6IHsKICAgICAgICBpZiAoIXgpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgYXdhaXQgeC5zZXRJbWFnZVNvdXJjZShyLnNyYywgci5lZmZlY3QsIHIuc2l6ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAic2V0SW1hZ2VCaXRtYXAiOiB7CiAgICAgICAgaWYgKCF4KQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHguc2V0SW1hZ2VCaXRtYXAoci5iaXRtYXAsIHIuZWZmZWN0LCByLnNpemUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgInNldEJhY2tncm91bmQiOiB7CiAgICAgICAgaWYgKCF4KQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHguc2V0QmFja2dyb3VuZChyLmJpdG1hcCwgci5zaXplKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJzcGxhdCI6IHsKICAgICAgICBpZiAoIXgpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgeC5zcGxhdCgKICAgICAgICAgIHIueCwKICAgICAgICAgIHIueSwKICAgICAgICAgIHIudngsCiAgICAgICAgICByLnZ5LAogICAgICAgICAgci5zdHJlbmd0aCA/PyAxCiAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJtb3ZlIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LmhhbmRsZU1vdmUoci54LCByLnksIHIuc3RyZW5ndGggPz8gMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAicmVzaXplIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LnJlc2l6ZShyLndpZHRoLCByLmhlaWdodCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAidXBkYXRlQ29uZmlnIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LnVwZGF0ZUNvbmZpZyhyLmNvbmZpZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAiZGVzdHJveSI6IHsKICAgICAgICB4ID09IG51bGwgfHwgeC5kZXN0cm95KCksIHggPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY29uc29sZS53YXJuKCJbZmx1aWRpdHktanMgd29ya2VyXSBVbmtub3duIG1lc3NhZ2UgdHlwZToiLCBlKTsKICAgIH0KICB9IGNhdGNoIChvKSB7CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogImVycm9yIiwgbWVzc2FnZTogKG8gPT0gbnVsbCA/IHZvaWQgMCA6IG8ubWVzc2FnZSkgPz8gU3RyaW5nKG8pIH0pOwogIH0KfTsK", Wg = typeof window < "u" && window.Blob && new Blob([atob(Tg)], { type: "text/javascript;charset=utf-8" });
635
- function oI() {
636
- let i;
637
- try {
638
- if (i = Wg && (window.URL || window.webkitURL).createObjectURL(Wg), !i)
639
- throw "";
640
- return new Worker(i);
641
- } catch {
642
- return new Worker("data:application/javascript;base64," + Tg, { type: "module" });
643
- } finally {
644
- i && (window.URL || window.webkitURL).revokeObjectURL(i);
645
- }
646
- }
647
- const tI = typeof Worker < "u" && typeof OffscreenCanvas < "u";
648
- var B, W, tg, Sg, Bg, xg;
649
- class lI {
650
- constructor(g, { isWorkerEnabled: C = !0, config: e = {} } = {}) {
651
- // ---------------------------------------------------------------------------
652
- // Private
653
- // ---------------------------------------------------------------------------
654
- a(this, Bg);
655
- a(this, B, null);
656
- a(this, W, null);
657
- a(this, tg, void 0);
658
- a(this, Sg, void 0);
659
- t(this, Sg, g), t(this, tg, C && tI), I(this, tg) ? y(this, Bg, xg).call(this, g, e) : t(this, W, new vg(g, e));
660
- }
661
- // ---------------------------------------------------------------------------
662
- // Source setters
663
- // ---------------------------------------------------------------------------
664
- setTextSource(g) {
665
- I(this, B) ? I(this, B).postMessage({ type: "setTextSource", opts: g }) : I(this, W).setTextSource(g);
666
- }
667
- setImageSource(g, C = 0, e = "cover") {
668
- I(this, B) ? I(this, B).postMessage({ type: "setImageSource", src: g, effect: C, size: e }) : I(this, W).setImageSource(g, C, e);
669
- }
670
- setBackground(g, C = "cover") {
671
- var e;
672
- if (I(this, B)) {
673
- const s = g ? [g] : [];
674
- I(this, B).postMessage({ type: "setBackground", bitmap: g ?? null, size: C }, s);
675
- } else
676
- (e = I(this, W)) == null || e.setBackground(g ?? null, C);
677
- }
678
- // ---------------------------------------------------------------------------
679
- // Interaction
680
- // ---------------------------------------------------------------------------
681
- /**
682
- * Immediately injects one splat at (x, y) with explicit velocity (vx, vy).
683
- * Safe to call multiple times per frame. See FluidSimulation.splat for details.
684
- */
685
- splat(g, C, e, s, o = 1) {
686
- I(this, B) ? I(this, B).postMessage({ type: "splat", x: g, y: C, vx: e, vy: s, strength: o }) : I(this, W).splat(g, C, e, s, o);
687
- }
688
- handleMove(g, C, e = 1) {
689
- I(this, B) ? I(this, B).postMessage({ type: "move", x: g, y: C, strength: e }) : I(this, W).handleMove(g, C, e);
690
- }
691
- // ---------------------------------------------------------------------------
692
- // Config + control
693
- // ---------------------------------------------------------------------------
694
- updateConfig(g) {
695
- I(this, B) ? I(this, B).postMessage({ type: "updateConfig", config: g }) : I(this, W).updateConfig(g);
696
- }
697
- resize(g, C) {
698
- I(this, B) ? I(this, B).postMessage({ type: "resize", width: g, height: C }) : I(this, W).resize(g, C);
699
- }
700
- destroy() {
701
- var g;
702
- if (I(this, B)) {
703
- const C = I(this, B);
704
- t(this, B, null), C.postMessage({ type: "destroy" }), setTimeout(() => C.terminate(), 50);
705
- } else
706
- (g = I(this, W)) == null || g.destroy(), t(this, W, null);
707
- }
708
- }
709
- B = new WeakMap(), W = new WeakMap(), tg = new WeakMap(), Sg = new WeakMap(), Bg = new WeakSet(), xg = function(g, C) {
710
- const { clientWidth: e, clientHeight: s } = g;
711
- let o;
712
- try {
713
- o = g.transferControlToOffscreen();
714
- } catch {
715
- console.warn(
716
- "[fluidity-js] OffscreenCanvas transfer failed — falling back to main-thread mode. This is expected in React StrictMode development."
717
- ), t(this, tg, !1), t(this, W, new vg(g, C));
718
- return;
719
- }
720
- t(this, B, new oI()), I(this, B).onerror = (l) => {
721
- console.error("[fluidity-js] Worker error:", l.message);
722
- }, I(this, B).onmessage = (l) => {
723
- l.data.type === "error" && console.error("[fluidity-js] Simulation error:", l.data.message);
724
- }, I(this, B).postMessage({ type: "init", canvas: o, width: e, height: s, config: C }, [o]);
725
- };
726
- function Mg(i, { isWorkerEnabled: g = !0, config: C = {} } = {}) {
727
- const e = ng(null), s = ng({ isWorkerEnabled: g, config: C });
728
- return N(() => {
729
- const o = i.current;
730
- if (!o)
731
- return;
732
- const l = document.createElement("canvas");
733
- l.style.cssText = "position:absolute;inset:0;width:100%;height:100%;display:block;", o.appendChild(l);
734
- const G = o.getBoundingClientRect(), n = Math.round(G.width) || o.clientWidth || 0, d = Math.round(G.height) || o.clientHeight || 0;
735
- n > 0 && (l.width = n, l.height = d);
736
- const { isWorkerEnabled: u, config: b } = s.current, c = new lI(l, { isWorkerEnabled: u, config: b });
737
- e.current = c;
738
- const p = new ResizeObserver((k) => {
739
- for (const Y of k) {
740
- const { inlineSize: K, blockSize: m } = Y.contentBoxSize[0];
741
- c.resize(Math.round(K), Math.round(m));
742
- }
743
- });
744
- return p.observe(o), () => {
745
- p.disconnect(), c.destroy(), l.remove(), e.current = null;
746
- };
747
- }, []), e;
748
- }
749
- const aI = Yg(function({
750
- text: g = "",
751
- fontSize: C = 100,
752
- color: e = "#ffffff",
753
- fontFamily: s = "sans-serif",
754
- fontWeight: o = 900,
755
- className: l,
756
- style: G,
757
- config: n,
758
- preset: d,
759
- algorithm: u,
760
- backgroundColor: b = "#0a0a0a",
761
- backgroundSrc: c,
762
- backgroundSize: p = "cover",
763
- isMouseEnabled: k = !0,
764
- isWorkerEnabled: Y = !0
765
- }, K) {
766
- const m = ng(null), Z = Mg(m, {
767
- isWorkerEnabled: Y,
768
- config: Kg({ ...n, ...u ? { algorithm: u } : {} }, d)
769
- });
770
- return Fg(
771
- K,
772
- () => ({
773
- reset() {
774
- var A;
775
- (A = Z.current) == null || A.setTextSource({ text: g, fontSize: C, color: e, fontFamily: s, fontWeight: o });
776
- },
777
- updateLocation({ x: A, y: r, strength: L = 1 }) {
778
- var h;
779
- (h = Z.current) == null || h.handleMove(A, r, L);
780
- },
781
- splat(A, r, L, h, f = 1) {
782
- var z;
783
- (z = Z.current) == null || z.splat(A, r, L, h, f);
784
- },
785
- updateConfig(A) {
786
- var r;
787
- (r = Z.current) == null || r.updateConfig(A);
788
- }
789
- }),
790
- [g, C, e, s, o]
791
- ), N(() => {
792
- var A;
793
- (A = Z.current) == null || A.setTextSource({ text: g, fontSize: C, color: e, fontFamily: s, fontWeight: o });
794
- }, [g, C, e, s, o]), N(() => {
795
- var A;
796
- u !== void 0 && ((A = Z.current) == null || A.updateConfig({ algorithm: u }));
797
- }, [u]), N(() => {
798
- var r;
799
- if (!c) {
800
- (r = Z.current) == null || r.setBackground(null);
801
- return;
802
- }
803
- let A = !1;
804
- return wg(c).then((L) => {
805
- var h;
806
- if (A) {
807
- L.close();
808
- return;
809
- }
810
- (h = Z.current) == null || h.setBackground(L, p);
811
- }).catch((L) => console.error("[fluidity-js] backgroundSrc load failed:", L)), () => {
812
- A = !0;
813
- };
814
- }, [c, p]), N(() => {
815
- if (!k)
816
- return;
817
- const A = m.current;
818
- if (!A)
819
- return;
820
- const r = (h) => {
821
- var z;
822
- const f = A.getBoundingClientRect();
823
- (z = Z.current) == null || z.handleMove(h.clientX - f.left, h.clientY - f.top, 2);
824
- }, L = (h) => {
825
- var Rg;
826
- h.preventDefault();
827
- const f = A.getBoundingClientRect(), z = h.touches[0];
828
- (Rg = Z.current) == null || Rg.handleMove(z.clientX - f.left, z.clientY - f.top, 1);
829
- };
830
- return A.addEventListener("mousemove", r), A.addEventListener("touchmove", L, { passive: !1 }), () => {
831
- A.removeEventListener("mousemove", r), A.removeEventListener("touchmove", L);
832
- };
833
- }, [k]), /* @__PURE__ */ kg(
834
- "div",
835
- {
836
- ref: m,
837
- className: l,
838
- style: {
839
- position: "relative",
840
- display: "block",
841
- width: "100%",
842
- height: "100%",
843
- background: b,
844
- ...G
845
- }
846
- }
847
- );
848
- }), uI = Yg(function({
849
- src: g,
850
- effect: C = 0.4,
851
- imageSize: e = "cover",
852
- className: s,
853
- style: o,
854
- config: l,
855
- preset: G,
856
- algorithm: n,
857
- backgroundColor: d = "#0a0a0a",
858
- backgroundSrc: u,
859
- backgroundSize: b = "cover",
860
- isMouseEnabled: c = !0,
861
- isWorkerEnabled: p = !0
862
- }, k) {
863
- const Y = ng(null), K = Mg(Y, {
864
- isWorkerEnabled: p,
865
- config: Kg({ ...l, ...n ? { algorithm: n } : {} }, G)
866
- });
867
- return Fg(
868
- k,
869
- () => ({
870
- reset() {
871
- var m;
872
- g && ((m = K.current) == null || m.setImageSource(g, C, e));
873
- },
874
- updateLocation({ x: m, y: Z, strength: A = 1 }) {
875
- var r;
876
- (r = K.current) == null || r.handleMove(m, Z, A);
877
- },
878
- splat(m, Z, A, r, L = 1) {
879
- var h;
880
- (h = K.current) == null || h.splat(m, Z, A, r, L);
881
- },
882
- updateConfig(m) {
883
- var Z;
884
- (Z = K.current) == null || Z.updateConfig(m);
885
- }
886
- }),
887
- [g, C, e]
888
- ), N(() => {
889
- var m;
890
- g && ((m = K.current) == null || m.setImageSource(g, C, e));
891
- }, [g, C, e]), N(() => {
892
- var m;
893
- n !== void 0 && ((m = K.current) == null || m.updateConfig({ algorithm: n }));
894
- }, [n]), N(() => {
895
- var Z;
896
- if (!u) {
897
- (Z = K.current) == null || Z.setBackground(null);
898
- return;
899
- }
900
- let m = !1;
901
- return wg(u).then((A) => {
902
- var r;
903
- if (m) {
904
- A.close();
905
- return;
906
- }
907
- (r = K.current) == null || r.setBackground(A, b);
908
- }).catch((A) => console.error("[fluidity-js] backgroundSrc load failed:", A)), () => {
909
- m = !0;
910
- };
911
- }, [u, b]), N(() => {
912
- if (!c)
913
- return;
914
- const m = Y.current;
915
- if (!m)
916
- return;
917
- const Z = (r) => {
918
- var h;
919
- const L = m.getBoundingClientRect();
920
- (h = K.current) == null || h.handleMove(r.clientX - L.left, r.clientY - L.top, 2);
921
- }, A = (r) => {
922
- var f;
923
- r.preventDefault();
924
- const L = m.getBoundingClientRect(), h = r.touches[0];
925
- (f = K.current) == null || f.handleMove(h.clientX - L.left, h.clientY - L.top, 1);
926
- };
927
- return m.addEventListener("mousemove", Z), m.addEventListener("touchmove", A, { passive: !1 }), () => {
928
- m.removeEventListener("mousemove", Z), m.removeEventListener("touchmove", A);
929
- };
930
- }, [c]), /* @__PURE__ */ kg(
931
- "div",
932
- {
933
- ref: Y,
934
- className: s,
935
- style: {
936
- position: "relative",
937
- display: "block",
938
- width: "100%",
939
- height: "100%",
940
- background: d,
941
- ...o
942
- }
943
- }
944
- );
945
- });
946
- export {
947
- Xg as DEFAULT_CONFIG,
948
- lI as FluidController,
949
- uI as FluidImage,
950
- vg as FluidSimulation,
951
- aI as FluidText,
952
- Eg as PRESETS,
953
- wg as loadImageBitmap,
954
- Kg as mergeConfig,
955
- Mg as useFluid
956
- };