{
  "license": "CC0-1.0",
  "shader": {
    "id": "3kvp0bl1",
    "title": "rave.exe",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "Claude",
    "status": "active",
    "compile_ok": true,
    "render_hash": "011402285b102808",
    "tags": [
      "rave",
      "poster",
      "rave poster",
      "dance",
      "party",
      "90s"
    ],
    "parents": [],
    "author": "u7y1evhf0znj",
    "author_name": "ksin",
    "author_url": "/u/ksin",
    "created_at": "2026-10-04T22:48:22.890Z",
    "poster_url": "/posters/3kvp0bl1.avif",
    "stats": {
      "slops": 0,
      "views": 170,
      "forks": 0
    },
    "self": "/api/v1/shaders/3kvp0bl1",
    "isf": "/*{\n    \"DESCRIPTION\": \"procedural, beat-synced 90s rave poster generator. A new flyer every 8 beats: bitmap type, smileys, checker tunnels, contour echoes, halftone crowds, glitch cuts. Pure math, no textures.\",\n    \"CREDIT\": \"CC0\",\n    \"ISFVSN\": \"2\",\n    \"CATEGORIES\": [\"Generator\", \"Retro\", \"Text\"],\n    \"INPUTS\": [\n        { \"NAME\": \"bpm\", \"LABEL\": \"BPM\", \"TYPE\": \"float\", \"DEFAULT\": 140.0, \"MIN\": 60.0, \"MAX\": 200.0 },\n        { \"NAME\": \"chaos\", \"LABEL\": \"Chaos\", \"TYPE\": \"float\", \"DEFAULT\": 0.65, \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"kick\", \"LABEL\": \"Kick (map to audio)\", \"TYPE\": \"float\", \"DEFAULT\": 0.0, \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"firstPoster\", \"LABEL\": \"First poster\", \"TYPE\": \"float\", \"DEFAULT\": 2.0, \"MIN\": 0.0, \"MAX\": 63.0 },\n        { \"NAME\": \"holdPoster\", \"LABEL\": \"Hold poster\", \"TYPE\": \"bool\", \"DEFAULT\": false },\n        { \"NAME\": \"seed\", \"LABEL\": \"Seed\", \"TYPE\": \"float\", \"DEFAULT\": 0.0, \"MIN\": 0.0, \"MAX\": 99.0 },\n        { \"NAME\": \"layoutLock\", \"LABEL\": \"Layout\", \"TYPE\": \"long\", \"DEFAULT\": -1,\n          \"VALUES\": [-1, 0, 1, 2, 3, 4, 5],\n          \"LABELS\": [\"Auto\", \"Header slab\", \"Echo contours\", \"Acid stack\", \"Lineup smiley\", \"Side spine\", \"Zine grid\"] }\n    ]\n}*/\n\n// ====================================================================\n//  RAVE.GEN  -  procedural, beat-synced 90s rave poster generator\n//  single pass, no textures: bitmap font, SDF graphics, halftones,\n//  photocopy edges, glitch cuts. Everything below is pure math.\n//\n//  Written in the GLSL ES 1.00 / GLSL 1.10 subset so one source runs in\n//  ISF hosts, WebGL1, Shadertoy and TouchDesigner: no integer bit ops,\n//  no const arrays (tables are generated lookup functions), constant\n//  loop bounds only.\n// ====================================================================\n\n#ifdef GL_ES\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\nprecision highp int;\n#else\nprecision mediump float;\nprecision mediump int;\n#endif\n#endif\n\n#define PI  3.14159265359\n#define TAU 6.28318530718\n\n// ---------- frame globals (set in rave()) ----------\nfloat gT;      // seconds\nfloat gBeat;   // beats since start\nfloat gKick;   // 0..1 envelope, peaks on every beat\nfloat gChaos;  // 0..1\nfloat gPX;     // one pixel in poster units (poster height = 1)\nfloat gW;      // poster width  (aspect)\nfloat gRough;  // per-pixel edge jitter, gives the boiling xerox edge\nfloat gPhoto;  // photo-input luminance for this pixel, < 0 = none\nint   gLay;    // forced layout, < 0 = generator picks\nvec3  cP, cI, cA;   // paper, ink, accent\n// rarely-set text item extras (reset before each text item is built)\nfloat gTScr, gTWob, gTA;   // scroll in chars, headline wobble, alpha\nbool  gTRep;               // repeat endlessly (marquees)\n\n// ---------- generated by build.py: 5x5 font + word tables ----------\n// glyph bitmap split in two exact-in-float halves: (rows 0-2, rows 3-4)\nvec2 fontBits(float c) {\n    if (c < 24.0) {\n        if (c < 12.0) {\n            if (c < 6.0) {\n                if (c < 3.0) {\n                    if (c < 1.0) {\n                        return vec2(14911.0, 561.0);\n                    } else {\n                        if (c < 2.0) {\n                            return vec2(31294.0, 574.0);\n                        } else {\n                            return vec2(15888.0, 527.0);\n                        }\n                    }\n                } else {\n                    if (c < 4.0) {\n                        return vec2(31281.0, 574.0);\n                    } else {\n                        if (c < 5.0) {\n                            return vec2(32286.0, 543.0);\n                        } else {\n                            return vec2(32286.0, 528.0);\n                        }\n                    }\n                }\n            } else {\n                if (c < 9.0) {\n                    if (c < 7.0) {\n                        return vec2(15891.0, 559.0);\n                    } else {\n                        if (c < 8.0) {\n                            return vec2(17983.0, 561.0);\n                        } else {\n                            return vec2(31876.0, 159.0);\n                        }\n                    }\n                } else {\n                    if (c < 10.0) {\n                        return vec2(1057.0, 558.0);\n                    } else {\n                        if (c < 11.0) {\n                            return vec2(18012.0, 593.0);\n                        } else {\n                            return vec2(16912.0, 543.0);\n                        }\n                    }\n                }\n            }\n        } else {\n            if (c < 18.0) {\n                if (c < 15.0) {\n                    if (c < 13.0) {\n                        return vec2(18293.0, 561.0);\n                    } else {\n                        if (c < 14.0) {\n                            return vec2(18229.0, 625.0);\n                        } else {\n                            return vec2(14897.0, 558.0);\n                        }\n                    }\n                } else {\n                    if (c < 16.0) {\n                        return vec2(31294.0, 528.0);\n                    } else {\n                        if (c < 17.0) {\n                            return vec2(14901.0, 589.0);\n                        } else {\n                            return vec2(31294.0, 593.0);\n                        }\n                    }\n                }\n            } else {\n                if (c < 21.0) {\n                    if (c < 19.0) {\n                        return vec2(15886.0, 62.0);\n                    } else {\n                        if (c < 20.0) {\n                            return vec2(31876.0, 132.0);\n                        } else {\n                            return vec2(17969.0, 558.0);\n                        }\n                    }\n                } else {\n                    if (c < 22.0) {\n                        return vec2(17969.0, 324.0);\n                    } else {\n                        if (c < 23.0) {\n                            return vec2(17973.0, 881.0);\n                        } else {\n                            return vec2(17732.0, 337.0);\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        if (c < 36.0) {\n            if (c < 30.0) {\n                if (c < 27.0) {\n                    if (c < 25.0) {\n                        return vec2(17732.0, 132.0);\n                    } else {\n                        if (c < 26.0) {\n                            return vec2(31812.0, 287.0);\n                        } else {\n                            return vec2(14965.0, 814.0);\n                        }\n                    }\n                } else {\n                    if (c < 28.0) {\n                        return vec2(4484.0, 142.0);\n                    } else {\n                        if (c < 29.0) {\n                            return vec2(30766.0, 543.0);\n                        } else {\n                            return vec2(30766.0, 62.0);\n                        }\n                    }\n                }\n            } else {\n                if (c < 33.0) {\n                    if (c < 31.0) {\n                        return vec2(17983.0, 33.0);\n                    } else {\n                        if (c < 32.0) {\n                            return vec2(32286.0, 62.0);\n                        } else {\n                            return vec2(14878.0, 558.0);\n                        }\n                    }\n                } else {\n                    if (c < 34.0) {\n                        return vec2(31778.0, 132.0);\n                    } else {\n                        if (c < 35.0) {\n                            return vec2(14894.0, 558.0);\n                        } else {\n                            return vec2(14895.0, 46.0);\n                        }\n                    }\n                }\n            }\n        } else {\n            if (c < 42.0) {\n                if (c < 39.0) {\n                    if (c < 37.0) {\n                        return vec2(0.0, 0.0);\n                    } else {\n                        if (c < 38.0) {\n                            return vec2(4228.0, 4.0);\n                        } else {\n                            return vec2(14.0, 0.0);\n                        }\n                    }\n                } else {\n                    if (c < 40.0) {\n                        return vec2(4224.0, 0.0);\n                    } else {\n                        if (c < 41.0) {\n                            return vec2(12877.0, 589.0);\n                        } else {\n                            return vec2(0.0, 4.0);\n                        }\n                    }\n                }\n            } else {\n                if (c < 45.0) {\n                    if (c < 43.0) {\n                        return vec2(1092.0, 272.0);\n                    } else {\n                        if (c < 44.0) {\n                            return vec2(128.0, 128.0);\n                        } else {\n                            return vec2(142.0, 128.0);\n                        }\n                    }\n                } else {\n                    if (c < 46.0) {\n                        return vec2(21983.0, 469.0);\n                    } else {\n                        if (c < 47.0) {\n                            return vec2(14886.0, 4.0);\n                        } else {\n                            return vec2(0.0, 136.0);\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n// text store leaves\nvec4 txtLeaf(float k) {\n    if (k < 59.0) {\n        if (k < 29.0) {\n            if (k < 14.0) {\n                if (k < 7.0) {\n                    if (k < 3.0) {\n                        if (k < 1.0) {\n                            return vec4(1134609.0, 819328.0, 4866957.0, 3948811.0);\n                        } else {\n                            if (k < 2.0) {\n                                return vec4(4456911.0, 4513923.0, 5506116.0, 3467524.0);\n                            } else {\n                                return vec4(3490381.0, 4997830.0, 3436676.0, 3441422.0);\n                            }\n                        }\n                    } else {\n                        if (k < 5.0) {\n                            if (k < 4.0) {\n                                return vec4(90317.0, 5563345.0, 4469828.0, 1066312.0);\n                            } else {\n                                return vec4(1897732.0, 33870.0, 4792321.0, 2622736.0);\n                            }\n                        } else {\n                            if (k < 6.0) {\n                                return vec4(90378.0, 3698961.0, 1852564.0, 4473816.0);\n                            } else {\n                                return vec4(62609.0, 5316866.0, 3466369.0, 524936.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 10.0) {\n                        if (k < 8.0) {\n                            return vec4(9449986.0, 4801415.0, 5288900.0, 4719377.0);\n                        } else {\n                            if (k < 9.0) {\n                                return vec4(5538962.0, 2928644.0, 1606500.0, 4474055.0);\n                            } else {\n                                return vec4(5301393.0, 2891981.0, 1078400.0, 4473815.0);\n                            }\n                        }\n                    } else {\n                        if (k < 12.0) {\n                            if (k < 11.0) {\n                                return vec4(3424785.0, 1118466.0, 86549.0, 6304651.0);\n                            } else {\n                                return vec4(1123480.0, 6292248.0, 2932999.0, 6309006.0);\n                            }\n                        } else {\n                            if (k < 13.0) {\n                                return vec4(4539288.0, 1356050.0, 5129032.0, 5292295.0);\n                            } else {\n                                return vec4(558228.0, 840197.0, 5825602.0, 3408067.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (k < 21.0) {\n                    if (k < 17.0) {\n                        if (k < 15.0) {\n                            return vec4(4997261.0, 9482952.0, 4735443.0, 3679060.0);\n                        } else {\n                            if (k < 16.0) {\n                                return vec4(4735758.0, 3470628.0, 1094798.0, 2175940.0);\n                            } else {\n                                return vec4(4764360.0, 2167636.0, 1069330.0, 1913540.0);\n                            }\n                        }\n                    } else {\n                        if (k < 19.0) {\n                            if (k < 18.0) {\n                                return vec4(409863.0, 2172032.0, 3770637.0, 3675220.0);\n                            } else {\n                                return vec4(4735822.0, 1066053.0, 4539288.0, 840204.0);\n                            }\n                        } else {\n                            if (k < 20.0) {\n                                return vec4(3466435.0, 5009800.0, 524559.0, 5563076.0);\n                            } else {\n                                return vec4(3490069.0, 4555976.0, 1111172.0, 4752578.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 25.0) {\n                        if (k < 23.0) {\n                            if (k < 22.0) {\n                                return vec4(1915154.0, 2937732.0, 4771864.0, 2953494.0);\n                            } else {\n                                return vec4(1123211.0, 5301796.0, 2901137.0, 3442949.0);\n                            }\n                        } else {\n                            if (k < 24.0) {\n                                return vec4(1915149.0, 5294340.0, 1319442.0, 9450312.0);\n                            } else {\n                                return vec4(5301796.0, 2901137.0, 3442949.0, 1078500.0);\n                            }\n                        }\n                    } else {\n                        if (k < 27.0) {\n                            if (k < 26.0) {\n                                return vec4(4466948.0, 800142.0, 1057600.0, 2917604.0);\n                            } else {\n                                return vec4(934603.0, 3986816.0, 1056772.0, 5563108.0);\n                            }\n                        } else {\n                            if (k < 28.0) {\n                                return vec4(5390613.0, 6369805.0, 4736100.0, 4989199.0);\n                            } else {\n                                return vec4(4801299.0, 2244744.0, 1915154.0, 3410180.0);\n                            }\n                        }\n                    }\n                }\n            }\n        } else {\n            if (k < 44.0) {\n                if (k < 36.0) {\n                    if (k < 32.0) {\n                        if (k < 30.0) {\n                            return vec4(1139853.0, 9495377.0, 1065682.0, 2177295.0);\n                        } else {\n                            if (k < 31.0) {\n                                return vec4(9482952.0, 4510994.0, 3425416.0, 5009800.0);\n                            } else {\n                                return vec4(148627.0, 1458449.0, 934990.0, 2106176.0);\n                            }\n                        }\n                    } else {\n                        if (k < 34.0) {\n                            if (k < 33.0) {\n                                return vec4(287560.0, 1626641.0, 5301796.0, 1927441.0);\n                            } else {\n                                return vec4(5054983.0, 2883851.0, 2152715.0, 9515462.0);\n                            }\n                        } else {\n                            if (k < 35.0) {\n                                return vec4(3465956.0, 1118534.0, 3770628.0, 3294292.0);\n                            } else {\n                                return vec4(840204.0, 2900229.0, 1078500.0, 4718692.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 40.0) {\n                        if (k < 38.0) {\n                            if (k < 37.0) {\n                                return vec4(1914002.0, 5265668.0, 1119507.0, 9511460.0);\n                            } else {\n                                return vec4(5825380.0, 3208859.0, 8538532.0, 1123072.0);\n                            }\n                        } else {\n                            if (k < 39.0) {\n                                return vec4(1118340.0, 3717395.0, 2174978.0, 3441486.0);\n                            } else {\n                                return vec4(9494861.0, 1102347.0, 9316004.0, 6940962.0);\n                            }\n                        }\n                    } else {\n                        if (k < 42.0) {\n                            if (k < 41.0) {\n                                return vec4(8013722.0, 47002.0, 4788498.0, 3033892.0);\n                            } else {\n                                return vec4(1860107.0, 11682963.0, 2729956.0, 1606756.0);\n                            }\n                        } else {\n                            if (k < 43.0) {\n                                return vec4(4456902.0, 4513923.0, 5282052.0, 1094029.0);\n                            } else {\n                                return vec4(1128708.0, 3723714.0, 819328.0, 5300708.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (k < 51.0) {\n                    if (k < 47.0) {\n                        if (k < 45.0) {\n                            return vec4(9454740.0, 17473.0, 16458.0, 558291.0);\n                        } else {\n                            if (k < 46.0) {\n                                return vec4(4997762.0, 8239378.0, 9491364.0, 9454035.0);\n                            } else {\n                                return vec4(3727588.0, 3727569.0, 3818641.0, 9490703.0);\n                            }\n                        }\n                    } else {\n                        if (k < 49.0) {\n                            if (k < 48.0) {\n                                return vec4(4040420.0, 1118540.0, 63748.0, 2983121.0);\n                            } else {\n                                return vec4(1135115.0, 9438180.0, 2373932.0, 9619730.0);\n                            }\n                        } else {\n                            if (k < 50.0) {\n                                return vec4(4727588.0, 9498636.0, 3441551.0, 3467539.0);\n                            } else {\n                                return vec4(1915149.0, 2152708.0, 7680454.0, 1118244.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 55.0) {\n                        if (k < 53.0) {\n                            if (k < 52.0) {\n                                return vec4(4719428.0, 674596.0, 2929159.0, 5063588.0);\n                            } else {\n                                return vec4(3741971.0, 4760334.0, 9585480.0, 594434.0);\n                            }\n                        } else {\n                            if (k < 54.0) {\n                                return vec4(2244610.0, 9495757.0, 1598733.0, 9585860.0);\n                            } else {\n                                return vec4(1332516.0, 9584837.0, 4866627.0, 6316430.0);\n                            }\n                        }\n                    } else {\n                        if (k < 57.0) {\n                            if (k < 56.0) {\n                                return vec4(3750168.0, 9516160.0, 9474276.0, 5051285.0);\n                            } else {\n                                return vec4(9531667.0, 9446180.0, 4767751.0, 9507091.0);\n                            }\n                        } else {\n                            if (k < 58.0) {\n                                return vec4(1078692.0, 9585348.0, 5128332.0, 3675220.0);\n                            } else {\n                                return vec4(3557646.0, 4879168.0, 345252.0, 1368982.0);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        if (k < 88.0) {\n            if (k < 73.0) {\n                if (k < 66.0) {\n                    if (k < 62.0) {\n                        if (k < 60.0) {\n                            return vec4(9507077.0, 2105380.0, 2140419.0, 2771203.0);\n                        } else {\n                            if (k < 61.0) {\n                                return vec4(5013770.0, 4479239.0, 148238.0, 5300354.0);\n                            } else {\n                                return vec4(4797268.0, 1915172.0, 2889988.0, 9498884.0);\n                            }\n                        }\n                    } else {\n                        if (k < 64.0) {\n                            if (k < 63.0) {\n                                return vec4(2373924.0, 4998564.0, 582820.0, 4868362.0);\n                            } else {\n                                return vec4(4986130.0, 2151313.0, 411914.0, 2621713.0);\n                            }\n                        } else {\n                            if (k < 65.0) {\n                                return vec4(16458.0, 6419.0, 4473219.0, 43300.0);\n                            } else {\n                                return vec4(9511808.0, 5784642.0, 1915172.0, 526596.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 69.0) {\n                        if (k < 67.0) {\n                            return vec4(9449986.0, 1643394.0, 9585800.0, 4866188.0);\n                        } else {\n                            if (k < 68.0) {\n                                return vec4(4981970.0, 9585288.0, 3555907.0, 1079566.0);\n                            } else {\n                                return vec4(3944452.0, 1102727.0, 3033362.0, 4473984.0);\n                            }\n                        }\n                    } else {\n                        if (k < 71.0) {\n                            if (k < 70.0) {\n                                return vec4(524625.0, 3295492.0, 5253378.0, 4457682.0);\n                            } else {\n                                return vec4(671953.0, 3724096.0, 5130509.0, 3436676.0);\n                            }\n                        } else {\n                            if (k < 72.0) {\n                                return vec4(5129101.0, 9585422.0, 266246.0, 4483328.0);\n                            } else {\n                                return vec4(3461137.0, 936216.0, 3221769.0, 6308552.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (k < 80.0) {\n                    if (k < 76.0) {\n                        if (k < 74.0) {\n                            return vec4(936216.0, 80137.0, 1120535.0, 3478803.0);\n                        } else {\n                            if (k < 75.0) {\n                                return vec4(3295501.0, 2169090.0, 9585870.0, 856071.0);\n                            } else {\n                                return vec4(4513923.0, 30980.0, 1127564.0, 936209.0);\n                            }\n                        }\n                    } else {\n                        if (k < 78.0) {\n                            if (k < 77.0) {\n                                return vec4(6701635.0, 9495620.0, 9446180.0, 2679873.0);\n                            } else {\n                                return vec4(9490698.0, 5058826.0, 9584907.0, 3555907.0);\n                            }\n                        } else {\n                            if (k < 79.0) {\n                                return vec4(3465485.0, 6961444.0, 2160931.0, 3465478.0);\n                            } else {\n                                return vec4(9585805.0, 9557661.0, 9449994.0, 3715492.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 84.0) {\n                        if (k < 82.0) {\n                            if (k < 81.0) {\n                                return vec4(5055886.0, 9478280.0, 2888582.0, 9511752.0);\n                            } else {\n                                return vec4(5056804.0, 1053585.0, 2373924.0, 5300452.0);\n                            }\n                        } else {\n                            if (k < 83.0) {\n                                return vec4(1093716.0, 4457444.0, 9449738.0, 9446180.0);\n                            } else {\n                                return vec4(5288292.0, 3295511.0, 5323010.0, 4473807.0);\n                            }\n                        }\n                    } else {\n                        if (k < 86.0) {\n                            if (k < 85.0) {\n                                return vec4(4457873.0, 936196.0, 5318921.0, 4752461.0);\n                            } else {\n                                return vec4(9584914.0, 5915203.0, 1627025.0, 4457444.0);\n                            }\n                        } else {\n                            if (k < 87.0) {\n                                return vec4(9536721.0, 1118308.0, 1053312.0, 410816.0);\n                            } else {\n                                return vec4(9442177.0, 3932324.0, 3440659.0, 4719332.0);\n                            }\n                        }\n                    }\n                }\n            }\n        } else {\n            if (k < 103.0) {\n                if (k < 95.0) {\n                    if (k < 91.0) {\n                        if (k < 89.0) {\n                            return vec4(4002066.0, 4797248.0, 2160932.0, 1126417.0);\n                        } else {\n                            if (k < 90.0) {\n                                return vec4(3168516.0, 9562404.0, 2679489.0, 7226500.0);\n                            } else {\n                                return vec4(43291.0, 9495449.0, 4030948.0, 5252164.0);\n                            }\n                        }\n                    } else {\n                        if (k < 93.0) {\n                            if (k < 92.0) {\n                                return vec4(9453652.0, 9474276.0, 4800530.0, 9453952.0);\n                            } else {\n                                return vec4(2942052.0, 411915.0, 2507592.0, 1057300.0);\n                            }\n                        } else {\n                            if (k < 94.0) {\n                                return vec4(4466948.0, 9586052.0, 3031619.0, 5784212.0);\n                            } else {\n                                return vec4(3215382.0, 575780.0, 5301412.0, 2771215.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 99.0) {\n                        if (k < 97.0) {\n                            if (k < 96.0) {\n                                return vec4(4981898.0, 9553636.0, 1336576.0, 7750161.0);\n                            } else {\n                                return vec4(935645.0, 73860.0, 8235283.0, 4989860.0);\n                            }\n                        } else {\n                            if (k < 98.0) {\n                                return vec4(2167123.0, 9545508.0, 4764937.0, 7226560.0);\n                            } else {\n                                return vec4(3295259.0, 74816.0, 9292051.0, 278884.0);\n                            }\n                        }\n                    } else {\n                        if (k < 101.0) {\n                            if (k < 100.0) {\n                                return vec4(4457857.0, 5300676.0, 9322770.0, 2630531.0);\n                            } else {\n                                return vec4(3408586.0, 50307.0, 3733775.0, 9515848.0);\n                            }\n                        } else {\n                            if (k < 102.0) {\n                                return vec4(8241956.0, 1061716.0, 1915153.0, 4462852.0);\n                            } else {\n                                return vec4(1585681.0, 4751556.0, 803988.0, 4489252.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (k < 110.0) {\n                    if (k < 106.0) {\n                        if (k < 104.0) {\n                            return vec4(1081681.0, 4075723.0, 9595148.0, 49187.0);\n                        } else {\n                            if (k < 105.0) {\n                                return vec4(9482944.0, 1860109.0, 4044499.0, 9595148.0);\n                            } else {\n                                return vec4(3147876.0, 1984412.0, 4789518.0, 7223515.0);\n                            }\n                        }\n                    } else {\n                        if (k < 108.0) {\n                            if (k < 107.0) {\n                                return vec4(9320155.0, 7748060.0, 7203047.0, 7469283.0);\n                            } else {\n                                return vec4(8824732.0, 3553447.0, 2959630.0, 9498884.0);\n                            }\n                        } else {\n                            if (k < 109.0) {\n                                return vec4(2917604.0, 5318923.0, 4752461.0, 9623812.0);\n                            } else {\n                                return vec4(5506148.0, 3467524.0, 3558244.0, 856071.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (k < 114.0) {\n                        if (k < 112.0) {\n                            if (k < 111.0) {\n                                return vec4(4513923.0, 9623812.0, 1627401.0, 11944203.0);\n                            } else {\n                                return vec4(1128749.0, 3723714.0, 150372.0, 9449986.0);\n                            }\n                        } else {\n                            if (k < 113.0) {\n                                return vec4(1985380.0, 1123211.0, 5301796.0, 2901137.0);\n                            } else {\n                                return vec4(2244939.0, 1915149.0, 5294340.0, 9445906.0);\n                            }\n                        }\n                    } else {\n                        if (k < 116.0) {\n                            if (k < 115.0) {\n                                return vec4(3033508.0, 524559.0, 9619716.0, 1135499.0);\n                            } else {\n                                return vec4(9619716.0, 5014356.0, 9619736.0, 4006161.0);\n                            }\n                        } else {\n                            if (k < 117.0) {\n                                return vec4(4989199.0, 4082468.0, 4866957.0, 3948811.0);\n                            } else {\n                                return vec4(157967.0, 0.0, 0.0, 0.0);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n// (first char, length) of words 2j and 2j+1\nvec4 wordPair(float j) {\n    if (j < 39.0) {\n        if (j < 19.0) {\n            if (j < 9.0) {\n                if (j < 4.0) {\n                    if (j < 2.0) {\n                        if (j < 1.0) {\n                            return vec4(0.0, 4.0, 4.0, 4.0);\n                        } else {\n                            return vec4(8.0, 8.0, 16.0, 8.0);\n                        }\n                    } else {\n                        if (j < 3.0) {\n                            return vec4(24.0, 7.0, 31.0, 6.0);\n                        } else {\n                            return vec4(37.0, 6.0, 43.0, 8.0);\n                        }\n                    }\n                } else {\n                    if (j < 6.0) {\n                        if (j < 5.0) {\n                            return vec4(51.0, 9.0, 60.0, 8.0);\n                        } else {\n                            return vec4(68.0, 9.0, 77.0, 9.0);\n                        }\n                    } else {\n                        if (j < 7.0) {\n                            return vec4(86.0, 10.0, 96.0, 8.0);\n                        } else {\n                            if (j < 8.0) {\n                                return vec4(104.0, 10.0, 114.0, 4.0);\n                            } else {\n                                return vec4(77.0, 9.0, 118.0, 7.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (j < 14.0) {\n                    if (j < 11.0) {\n                        if (j < 10.0) {\n                            return vec4(125.0, 11.0, 136.0, 10.0);\n                        } else {\n                            return vec4(146.0, 10.0, 156.0, 7.0);\n                        }\n                    } else {\n                        if (j < 12.0) {\n                            return vec4(163.0, 7.0, 170.0, 6.0);\n                        } else {\n                            if (j < 13.0) {\n                                return vec4(176.0, 4.0, 180.0, 8.0);\n                            } else {\n                                return vec4(188.0, 6.0, 194.0, 5.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 16.0) {\n                        if (j < 15.0) {\n                            return vec4(199.0, 4.0, 180.0, 8.0);\n                        } else {\n                            return vec4(188.0, 6.0, 203.0, 5.0);\n                        }\n                    } else {\n                        if (j < 17.0) {\n                            return vec4(208.0, 5.0, 213.0, 8.0);\n                        } else {\n                            if (j < 18.0) {\n                                return vec4(221.0, 3.0, 224.0, 8.0);\n                            } else {\n                                return vec4(232.0, 2.0, 234.0, 5.0);\n                            }\n                        }\n                    }\n                }\n            }\n        } else {\n            if (j < 29.0) {\n                if (j < 24.0) {\n                    if (j < 21.0) {\n                        if (j < 20.0) {\n                            return vec4(239.0, 4.0, 243.0, 7.0);\n                        } else {\n                            return vec4(250.0, 4.0, 254.0, 8.0);\n                        }\n                    } else {\n                        if (j < 22.0) {\n                            return vec4(262.0, 7.0, 269.0, 5.0);\n                        } else {\n                            if (j < 23.0) {\n                                return vec4(274.0, 4.0, 278.0, 4.0);\n                            } else {\n                                return vec4(282.0, 4.0, 286.0, 7.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 26.0) {\n                        if (j < 25.0) {\n                            return vec4(293.0, 5.0, 298.0, 4.0);\n                        } else {\n                            return vec4(302.0, 5.0, 307.0, 7.0);\n                        }\n                    } else {\n                        if (j < 27.0) {\n                            return vec4(194.0, 5.0, 314.0, 6.0);\n                        } else {\n                            if (j < 28.0) {\n                                return vec4(320.0, 4.0, 324.0, 6.0);\n                            } else {\n                                return vec4(330.0, 26.0, 356.0, 26.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (j < 34.0) {\n                    if (j < 31.0) {\n                        if (j < 30.0) {\n                            return vec4(382.0, 15.0, 397.0, 24.0);\n                        } else {\n                            return vec4(421.0, 19.0, 440.0, 21.0);\n                        }\n                    } else {\n                        if (j < 32.0) {\n                            return vec4(461.0, 22.0, 483.0, 18.0);\n                        } else {\n                            if (j < 33.0) {\n                                return vec4(501.0, 14.0, 515.0, 14.0);\n                            } else {\n                                return vec4(529.0, 13.0, 542.0, 17.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 36.0) {\n                        if (j < 35.0) {\n                            return vec4(559.0, 10.0, 569.0, 15.0);\n                        } else {\n                            return vec4(584.0, 22.0, 606.0, 25.0);\n                        }\n                    } else {\n                        if (j < 37.0) {\n                            return vec4(631.0, 22.0, 653.0, 20.0);\n                        } else {\n                            if (j < 38.0) {\n                                return vec4(673.0, 22.0, 695.0, 15.0);\n                            } else {\n                                return vec4(710.0, 10.0, 720.0, 19.0);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        if (j < 59.0) {\n            if (j < 49.0) {\n                if (j < 44.0) {\n                    if (j < 41.0) {\n                        if (j < 40.0) {\n                            return vec4(739.0, 22.0, 761.0, 25.0);\n                        } else {\n                            return vec4(786.0, 4.0, 792.0, 17.0);\n                        }\n                    } else {\n                        if (j < 42.0) {\n                            return vec4(811.0, 5.0, 818.0, 14.0);\n                        } else {\n                            if (j < 43.0) {\n                                return vec4(834.0, 9.0, 845.0, 16.0);\n                            } else {\n                                return vec4(863.0, 8.0, 873.0, 15.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 46.0) {\n                        if (j < 45.0) {\n                            return vec4(890.0, 8.0, 900.0, 19.0);\n                        } else {\n                            return vec4(921.0, 9.0, 932.0, 11.0);\n                        }\n                    } else {\n                        if (j < 47.0) {\n                            return vec4(945.0, 9.0, 956.0, 16.0);\n                        } else {\n                            if (j < 48.0) {\n                                return vec4(974.0, 9.0, 985.0, 15.0);\n                            } else {\n                                return vec4(1002.0, 9.0, 1013.0, 16.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (j < 54.0) {\n                    if (j < 51.0) {\n                        if (j < 50.0) {\n                            return vec4(1031.0, 9.0, 1042.0, 17.0);\n                        } else {\n                            return vec4(1061.0, 10.0, 1073.0, 12.0);\n                        }\n                    } else {\n                        if (j < 52.0) {\n                            return vec4(1087.0, 9.0, 1098.0, 13.0);\n                        } else {\n                            if (j < 53.0) {\n                                return vec4(1113.0, 7.0, 1122.0, 16.0);\n                            } else {\n                                return vec4(1140.0, 7.0, 1149.0, 16.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 56.0) {\n                        if (j < 55.0) {\n                            return vec4(1167.0, 7.0, 1176.0, 11.0);\n                        } else {\n                            return vec4(1189.0, 7.0, 1198.0, 17.0);\n                        }\n                    } else {\n                        if (j < 57.0) {\n                            return vec4(1217.0, 6.0, 1225.0, 16.0);\n                        } else {\n                            if (j < 58.0) {\n                                return vec4(1243.0, 7.0, 1252.0, 13.0);\n                            } else {\n                                return vec4(1267.0, 10.0, 1279.0, 14.0);\n                            }\n                        }\n                    }\n                }\n            }\n        } else {\n            if (j < 69.0) {\n                if (j < 64.0) {\n                    if (j < 61.0) {\n                        if (j < 60.0) {\n                            return vec4(1295.0, 13.0, 1310.0, 18.0);\n                        } else {\n                            return vec4(1330.0, 9.0, 1341.0, 16.0);\n                        }\n                    } else {\n                        if (j < 62.0) {\n                            return vec4(1359.0, 9.0, 1370.0, 15.0);\n                        } else {\n                            if (j < 63.0) {\n                                return vec4(1387.0, 14.0, 1403.0, 11.0);\n                            } else {\n                                return vec4(1416.0, 7.0, 1426.0, 10.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 66.0) {\n                        if (j < 65.0) {\n                            return vec4(1436.0, 10.0, 1446.0, 10.0);\n                        } else {\n                            return vec4(1456.0, 10.0, 1466.0, 10.0);\n                        }\n                    } else {\n                        if (j < 67.0) {\n                            return vec4(1476.0, 10.0, 569.0, 15.0);\n                        } else {\n                            if (j < 68.0) {\n                                return vec4(1486.0, 11.0, 1497.0, 9.0);\n                            } else {\n                                return vec4(1506.0, 13.0, 1519.0, 16.0);\n                            }\n                        }\n                    }\n                }\n            } else {\n                if (j < 74.0) {\n                    if (j < 71.0) {\n                        if (j < 70.0) {\n                            return vec4(1535.0, 16.0, 559.0, 10.0);\n                        } else {\n                            return vec4(1551.0, 9.0, 1560.0, 9.0);\n                        }\n                    } else {\n                        if (j < 72.0) {\n                            return vec4(1569.0, 10.0, 1579.0, 8.0);\n                        } else {\n                            if (j < 73.0) {\n                                return vec4(1587.0, 4.0, 1591.0, 4.0);\n                            } else {\n                                return vec4(1595.0, 3.0, 1598.0, 3.0);\n                            }\n                        }\n                    }\n                } else {\n                    if (j < 76.0) {\n                        if (j < 75.0) {\n                            return vec4(1601.0, 4.0, 1605.0, 4.0);\n                        } else {\n                            return vec4(1609.0, 3.0, 1612.0, 34.0);\n                        }\n                    } else {\n                        if (j < 77.0) {\n                            return vec4(1647.0, 36.0, 1684.0, 29.0);\n                        } else {\n                            if (j < 78.0) {\n                                return vec4(1714.0, 33.0, 786.0, 639.0);\n                            } else {\n                                return vec4(1748.0, 10.0, 0.0, 1.0);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\nvec2 wordInfo(float w) { float j = floor(w * 0.5); vec4 v = wordPair(j); return w - 2.0 * j < 0.5 ? v.xy : v.zw; }\n// longest line of each four-line phrase\nfloat quadMax(int qi) {\n    float q = float(qi);\n    if (q < 4.0) {\n        if (q < 2.0) {\n            if (q < 1.0) {\n                return 8.0;\n            } else {\n                return 8.0;\n            }\n        } else {\n            if (q < 3.0) {\n                return 8.0;\n            } else {\n                return 7.0;\n            }\n        }\n    } else {\n        if (q < 6.0) {\n            if (q < 5.0) {\n                return 8.0;\n            } else {\n                return 7.0;\n            }\n        } else {\n            if (q < 7.0) {\n                return 7.0;\n            } else {\n                return 6.0;\n            }\n        }\n    }\n}\n#define G_HEAD 0\n#define N_HEAD 16\n#define G_HEAD2 16\n#define N_HEAD2 8\n#define G_QUAD 24\n#define N_QUAD 8\n#define G_TAG 56\n#define N_TAG 12\n#define G_INFO 68\n#define N_INFO 12\n#define G_DJ 80\n#define N_DJ 47\n#define G_DATE 127\n#define N_DATE 6\n#define G_PLACE 133\n#define N_PLACE 6\n#define G_HOUR 139\n#define N_HOUR 5\n#define G_YEAR 144\n#define N_YEAR 7\n#define G_MARQ 151\n#define N_MARQ 4\n#define W_LINEUP 155\n#define W_NOSLEEP 156\n\nstruct Scene {\n    float sd;\n    int lay, bg, hero, pal, sty;\n    int head, head2, tag, i0, i1, dj, quad, date, place, hour, yr, marq;\n    bool echo, inv;\n};\n\n// ---------- small integer helpers (ES 1.00 has no %, &, int min/clamp) ----------\nint imod(int a, int b) { return a - (a / b) * b; }                    // a >= 0\nint pickI(int n, float h) { return int(min(floor(h * float(n)), float(n - 1))); }\nint sel(int i, int a0, int a1, int a2, int a3, int a4, int a5, int a6) {\n    if (i == 0) return a0;\n    if (i == 1) return a1;\n    if (i == 2) return a2;\n    if (i == 3) return a3;\n    if (i == 4) return a4;\n    if (i == 5) return a5;\n    return a6;\n}\n\n// ---------- palettes: paper / ink / accent ----------\nvoid setPal(int i, bool inv) {\n    if      (i == 0)  { cP = vec3(0.96, 0.88, 0.10); cI = vec3(0.07, 0.07, 0.07); cA = vec3(0.97, 0.96, 0.92); }  // club yellow\n    else if (i == 1)  { cP = vec3(0.06, 0.06, 0.05); cI = vec3(0.98, 0.96, 0.55); cA = vec3(1.00, 0.45, 0.12); }  // black + pale yellow\n    else if (i == 2)  { cP = vec3(0.82, 0.95, 0.22); cI = vec3(0.08, 0.08, 0.06); cA = vec3(0.95, 0.18, 0.50); }  // lime flyer\n    else if (i == 3)  { cP = vec3(0.67, 0.50, 0.90); cI = vec3(0.10, 0.08, 0.10); cA = vec3(0.98, 0.93, 0.30); }  // purple warehouse\n    else if (i == 4)  { cP = vec3(0.50, 0.78, 0.92); cI = vec3(0.04, 0.06, 0.10); cA = vec3(0.98, 0.98, 0.98); }  // photocopy blue\n    else if (i == 5)  { cP = vec3(0.03, 0.04, 0.10); cI = vec3(0.30, 1.00, 0.18); cA = vec3(1.00, 0.55, 0.05); }  // acid neon\n    else if (i == 6)  { cP = vec3(0.97, 0.93, 0.86); cI = vec3(0.93, 0.14, 0.45); cA = vec3(0.15, 0.80, 0.40); }  // pink + green on cream\n    else if (i == 7)  { cP = vec3(0.05, 0.03, 0.03); cI = vec3(0.90, 0.10, 0.07); cA = vec3(0.62, 1.00, 0.95); }  // red contour / cyan\n    else if (i == 8)  { cP = vec3(0.02, 0.02, 0.02); cI = vec3(0.97, 0.97, 0.95); cA = vec3(1.00, 0.88, 0.10); }  // black + white\n    else if (i == 9)  { cP = vec3(0.93, 0.91, 0.84); cI = vec3(0.06, 0.06, 0.06); cA = vec3(0.90, 0.20, 0.10); }  // cream checker\n    else if (i == 10) { cP = vec3(0.03, 0.02, 0.02); cI = vec3(1.00, 0.32, 0.08); cA = vec3(1.00, 0.85, 0.20); }  // orange on black\n    else              { cP = vec3(1.00, 0.32, 0.70); cI = vec3(0.06, 0.04, 0.20); cA = vec3(0.20, 0.95, 1.00); }  // hot pink\n    if (inv) { vec3 t = cP; cP = cI; cI = t; }\n}\n\n// ---------- hashing / noise ----------\nfloat h11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat h21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2  h22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise(vec2 p) {\n    vec2 i = floor(p), f = fract(p), u = f * f * (3.0 - 2.0 * f);\n    return mix(mix(h21(i), h21(i + vec2(1.0, 0.0)), u.x),\n               mix(h21(i + vec2(0.0, 1.0)), h21(i + vec2(1.0, 1.0)), u.x), u.y);\n}\nfloat fbm(vec2 p) {\n    float s = 0.0, a = 0.5;\n    for (int i = 0; i < 4; i++) { s += a * vnoise(p); p = p * 2.03 + 17.1; a *= 0.5; }\n    return s;\n}\nmat2 rot(float a) { float c = cos(a), s = sin(a); return mat2(c, s, -s, c); }\n\n// ---------- 2D SDF kit ----------\nfloat sdBox(vec2 p, vec2 b) { vec2 d = abs(p) - b; return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); }\nfloat sdRBox(vec2 p, vec2 b, float r) { return sdBox(p, b - r) - r; }\nfloat sdSeg(vec2 p, vec2 a, vec2 b) { vec2 pa = p - a, ba = b - a; return length(pa - ba * clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0)); }\nfloat sdEll(vec2 p, vec2 r) { float k0 = length(p / r), k1 = length(p / (r * r)); return k0 * (k0 - 1.0) / max(k1, 1e-6); }\nfloat sdArc(vec2 p, vec2 sc, float ra, float rb) {\n    p.x = abs(p.x);\n    return ((sc.y * p.x > sc.x * p.y) ? length(p - sc * ra) : abs(length(p) - ra)) - rb;\n}\nfloat sdStar(vec2 p, float r, float n, float m) {   // n points, m in [2,n] = sharpness\n    float an = PI / n, en = PI / m;\n    vec2 acs = vec2(cos(an), sin(an)), ecs = vec2(cos(en), sin(en));\n    float bn = mod(atan(p.x, p.y), 2.0 * an) - an;\n    p = length(p) * vec2(cos(bn), abs(sin(bn)));\n    p -= r * acs;\n    p += ecs * clamp(-dot(p, ecs), 0.0, r * acs.y / ecs.y);\n    return length(p) * sign(p.x);\n}\nfloat smin(float a, float b, float k) { float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); }\n\n// coverage: 1px AA plus the boiling photocopy edge\nfloat fillD(float d) { return clamp(0.5 - (d + gRough) / gPX, 0.0, 1.0); }\nfloat strokeD(float d, float w) { return fillD(abs(d) - w); }\nvoid  paint(inout vec3 col, vec3 c, float m) { col = mix(col, c, clamp(m, 0.0, 1.0)); }\nfloat lum(vec3 c) { return dot(c, vec3(0.299, 0.587, 0.114)); }\nvec3  inkOn(vec3 bg) { return abs(lum(bg) - lum(cI)) < 0.3 ? cP : cI; }   // ink that reads on bg\nvec3  accOn() { return abs(lum(cA) - lum(cP)) < 0.22 ? cI : cA; }        // accent that reads on paper\n\n// ====================================================================\n//  BITMAP FONT (5x5 glyphs, rendered as an SDF of font pixels)\n// ====================================================================\n#define SOLID vec3(0.0, 0.0, 0.16)\n\n// glyph index at offset o (0..15) of a text-store leaf (4 floats x 4 six-bit chars)\nfloat charIn(vec4 lf, float o) {\n    float comp = floor(o / 4.0);\n    float sub = o - comp * 4.0;\n    float v = dot(lf, vec4(equal(vec4(comp), vec4(0.0, 1.0, 2.0, 3.0))));\n    float inv = sub < 0.5 ? 1.0 : (sub < 1.5 ? 0.015625 : (sub < 2.5 ? 0.000244140625 : 0.000003814697265625));\n    return mod(floor(v * inv), 64.0);\n}\n// glyph indices of store characters idx and idx+1 (leaves overlap by one, so one lookup)\nvec2 charPair(float idx) {\n    float k = floor((idx + 0.5) / 15.0);\n    float o = idx - 15.0 * k;\n    vec4 lf = txtLeaf(k);\n    return vec2(charIn(lf, o), charIn(lf, o + 1.0));\n}\n\n// signed distance to a line of text\n//  org = bottom-left of first cell, cs = cell size (6x5 font pixels incl. spacing)\n//  start/L = the word's characters, scr = scroll in characters, rep = endless repeat\n//  sh  = (corner rounding, extra bold, horizontal stem bold) in font pixels\nfloat sdText(vec2 p, vec2 org, vec2 cs, float start, float L, float scr, bool rep, vec3 sh) {\n    vec2 q = (p - org) / cs;\n    if (q.y < -0.35 || q.y > 1.35) return 1.0;\n    if (rep) q.x += mod(scr, L);\n    else if (q.x < -0.35 || q.x > L + 0.2) return 1.0;\n    vec2 u = cs / vec2(6.0, 5.0);\n    float mu = min(u.x, u.y);\n    vec2 hb = 0.5 * u + vec2(sh.z * u.x, 0.0);\n    float rr = sh.x * mu;\n    vec2 g = q * vec2(6.0, 5.0);\n    vec2 gi = floor(g - 0.5);                      // nearest 2x2 font pixels: gi .. gi+1\n    // (all styles stay within half a font pixel of the glyph, so 2x2 is exact enough)\n    // the 2x2 block touches at most two characters (c0, c0+1): fetch both once.\n    // Repeating words are stored with their first char appended, so c0+1 never wraps.\n    float c0 = floor((gi.x + 0.5) / 6.0);\n    float b = rep ? c0 - L * floor((c0 + 0.5) / L) : c0;\n    bool shift = b < -0.5;                         // left of a plain word: only c0+1 can show\n    vec2 cp = charPair(start + b + (shift ? 1.0 : 0.0));\n    bool v0 = !shift && (rep || b < L - 0.5);\n    bool v1 = rep || (b > -1.5 && b < L - 1.5);\n    vec2 g0 = vec2(0.0), g1 = vec2(0.0);\n    for (int q = 0; q < 2; q++) {                  // loop keeps one copy of the font table\n        if (q == 0 ? !v0 : !v1) continue;\n        vec2 gb = fontBits(q == 0 ? cp.x : (shift ? cp.x : cp.y));\n        if (q == 0) g0 = gb; else g1 = gb;\n    }\n    float d = 1.0;\n    for (int j = 0; j < 2; j++) {\n        float cy = gi.y + float(j);\n        if (cy < 0.0 || cy > 4.0) continue;\n        for (int i = 0; i < 2; i++) {\n            float cx = gi.x + float(i);\n            float ci = floor((cx + 0.5) / 6.0);\n            float cc = cx - ci * 6.0;\n            if (cc > 4.5) continue;\n            vec2 gl = ci < c0 + 0.5 ? g0 : g1;\n            float bi = cy * 5.0 + 4.0 - cc;                // bit index 0..24\n            float half_ = bi < 9.5 ? gl.y : gl.x;\n            float e = bi < 9.5 ? bi : bi - 10.0;\n            if (mod(floor((half_ + 0.5) / exp2(e)), 2.0) < 0.5) continue;\n            vec2 lp = (g - vec2(cx, cy) - 0.5) * u;\n            d = min(d, sh.x > 0.49 ? length(lp) - 0.5 * mu : sdRBox(lp, hb, rr));\n        }\n    }\n    return d - sh.y * mu - 0.6 * gPX;\n}\n// headline styles: 0 block, 1 dot-matrix, 2 outline, 3 bubble, 4 drop shadow\nvec3 styShape(int sty) {\n    if (sty == 1) return vec3(0.5, -0.06, 0.0);\n    if (sty == 2) return vec3(0.0, 0.25, 0.0);\n    if (sty == 3) return vec3(0.42, 0.28, 0.12);\n    return SOLID;\n}\nfloat textMask(float d, int sty, vec2 cs) {\n    if (sty == 2) return strokeD(d, 0.09 * min(cs.x / 6.0, cs.y / 5.0) + 0.3 * gPX);\n    return fillD(d);\n}\n\n// Each layout describes its type as text items. Text lines never overlap, so\n// every pixel picks the one item that can cover it (textSlot) and a single\n// shared renderer sizes and draws it - the word tables and glyph loop exist\n// once in the compiled shader, which keeps WebGL / ISF compile times short.\n//   sz = (bw, cxm, cym, st):\n//   cell width  = min(bw / (len - 1/6), cxm),  cell height = min(cym, width * st)\n//   origin      = anc - (text width, cell height) * aln\n// The item lands in the t* globals; scroll / repeat / wobble / alpha are the gT* globals.\nvec2  tP, tAnc, tAln;\nvec4  tSz;\nint   tW, tSty;\nvec3  tCol;\nvoid tItem(vec2 p, vec2 anc, vec2 aln, int w, vec4 sz, int sty, vec3 col) {\n    tP = p; tAnc = anc; tAln = aln; tSz = sz; tW = w; tSty = sty; tCol = col;\n}\n\n// ====================================================================\n//  BACKGROUNDS  ->  (ink coverage, ink->accent mix)\n// ====================================================================\nfloat ripField(vec2 c, float sd) {\n    return fbm(c * 1.5 + vec2(sd * 3.7, gT * 0.1)) * 2.2 + length(c * vec2(1.0, 0.8)) * 1.4 + 0.12 * gKick;\n}\nfloat halftone(vec2 p, float v, float cell) {\n    vec2 f = fract(rot(0.785398) * p / cell) - 0.5;\n    return fillD((length(f) - sqrt(clamp(v, 0.0, 1.0)) * 0.6) * cell);\n}\n\nvec2 background(vec2 c, int type, float sd) {\n    float r = length(c);\n    if (type == 0) {                               // warped checkerboard\n        if (h11(sd * 3.1) < 0.5) {\n            vec2 q = rot(2.4 * sin(gT * 0.45 + sd) * exp(-r * 2.2) + gT * 0.12) * c;\n            float sc = 7.0 + 2.0 * h11(sd);\n            q *= sc;\n            q += 0.4 * vec2(sin(q.y * 0.6 + gT * 1.3), cos(q.x * 0.6 - gT * 1.1));\n            float fw = PI * sc * gPX * 1.6;\n            return vec2(0.5 + 0.5 * clamp(sin(q.x * PI) / fw, -1.0, 1.0) * clamp(sin(q.y * PI) / fw, -1.0, 1.0), 0.0);\n        }\n        float a = atan(c.y, c.x);                  // log-polar checker tunnel\n        float u = a / TAU * 16.0 + gT * 0.2 + 0.35 * sin(r * 9.0 - gT * 2.0);\n        float z = log(r + 1e-4) * 5.0 - gT * 1.5;\n        float fu = PI * (16.0 / TAU / max(r, 1e-3) + 3.2) * gPX * 1.3;\n        float fz = PI * 5.0 / max(r, 1e-3) * gPX * 1.3;\n        return vec2(0.5 + 0.5 * clamp(sin(u * PI) / fu, -1.0, 1.0) * clamp(sin(z * PI) / fz, -1.0, 1.0), 0.0);\n    }\n    if (type == 1) {                               // wireframe box tunnel\n        vec2 q = rot(0.2 * sin(gT * 0.35 + sd)) * c + 0.03 * vec2(sin(gT * 0.7), cos(gT * 0.5));\n        float ax = abs(q.x), ay = abs(q.y), m = max(max(ax, ay), 1e-3);\n        float zz = 0.3 / m + gT * 1.8;\n        float dz = abs(fract(zz + 0.5) - 0.5) * m * m / 0.3;\n        float u = (ax > ay ? q.y : q.x) / m;\n        float du = abs(fract(u * 3.0 + 0.5) - 0.5) * m / 3.0;\n        float w = 0.0012 + 0.01 * m;\n        float ln = max(fillD(dz - w), fillD(du - w)) * smoothstep(0.02, 0.12, m);\n        return vec2(ln, smoothstep(0.08, 0.45, m));\n    }\n    if (type == 2) {                               // contour ripples\n        float f0 = ripField(c, sd);\n        vec2 gr = vec2(ripField(c + vec2(gPX, 0.0), sd) - f0, ripField(c + vec2(0.0, gPX), sd) - f0) / gPX;\n        float N = 6.0 + 4.0 * h11(sd * 5.3);\n        float v = f0 * N - gT * 0.9;\n        float gl = max(length(gr) * N, 1e-3);\n        float d = h11(sd * 7.7) < 0.5 ? (abs(fract(v) - 0.5) - 0.25) / gl\n                                      : abs(fract(v + 0.5) - 0.5) / gl - 0.0025;\n        return vec2(fillD(d), 0.0);\n    }\n    if (type == 3) {                               // halftone shock rings\n        float v = 0.5 + 0.5 * sin(r * 10.0 - gT * 3.0 + fbm(c * 2.5 + sd) * 4.0);\n        v = v * (1.0 - smoothstep(0.25, 0.95, r)) + 0.2 * gKick;\n        return vec2(halftone(c, v, 0.016), 0.0);\n    }\n    if (type == 4) {                               // sunburst\n        float a = atan(c.y, c.x);\n        float N = 18.0 + 2.0 * floor(h11(sd * 2.9) * 6.0);\n        float u = a / TAU * N + gT * 0.15 + 0.25 * sin(r * 7.0 - gT * 2.5);\n        float d = (abs(fract(u) - 0.5) - 0.25) * TAU * r / N;\n        return vec2(fillD(d) * smoothstep(0.0, 0.04, r), 0.0);\n    }\n    if (type == 6) {                               // op-art moire\n        vec2 a = vec2(sin(gT * 0.6), cos(gT * 0.45)) * 0.2;\n        vec2 b = vec2(cos(gT * 0.37 + 1.0), sin(gT * 0.52)) * 0.22;\n        float k = 30.0;\n        float m1 = fillD((abs(fract(length(c - a) * k) - 0.5) - 0.25) / k);\n        float m2 = fillD((abs(fract(length(c - b) * k) - 0.5) - 0.25) / k);\n        return vec2(m1 + m2 - 2.0 * m1 * m2, 0.0);\n    }\n    // 5: plain stock with drifting sparkles\n    vec2 g = c * 6.0 + vec2(0.0, gT * 0.2);\n    vec2 id = floor(g), f = fract(g) - 0.5;\n    float h = h21(id + sd);\n    if (h > 0.78) {\n        vec2 o = (h22(id + sd) - 0.5) * 0.4;\n        float s = 0.18 * (0.6 + 0.4 * sin(gT * 4.0 + h * 40.0));\n        return vec2(fillD(sdStar(rot(gT * (h - 0.9) * 4.0) * (f - o), s, 4.0, 2.3) / 6.0), 0.0);\n    }\n    return vec2(0.0);\n}\n\n// ====================================================================\n//  HERO GRAPHICS  ->  (ink sdf, silhouette sdf)\n// ====================================================================\nvec3 smileyShape(vec2 p, float R, bool filled) {      // (ink, face, features)\n    float face = length(p) - R;\n    float bl = 1.0 - smoothstep(0.0, 0.05, abs(fract(gBeat * 0.25 + 0.4) - 0.05));\n    vec2 ep = vec2(abs(p.x) - 0.33 * R, p.y - 0.2 * R);\n    float eye = sdEll(ep, vec2(0.1, mix(0.19, 0.03, bl)) * R);\n    float ta = 1.0 + 0.25 * gKick;\n    float mouth = sdArc(vec2(p.x, -p.y), vec2(sin(ta), cos(ta)), 0.58 * R, 0.06 * R);\n    float feat = min(eye, mouth);\n    float ink = filled ? max(face, -feat) : min(abs(face) - 0.045 * R, feat);\n    return vec3(ink, face, feat);\n}\n\nvec2 globe(vec2 p, float R, Scene s) {\n    float r = length(p);\n    float sil = r - R;\n    float lw = R * 0.018;\n    float ink = abs(sil) - lw * 1.3;\n    if (r < R) {\n        float z = sqrt(max(R * R - r * r, 0.0)) / R;\n        float ay = gT * 0.6 + s.sd, ax = 0.35 + 0.25 * sin(gT * 0.3);\n        float lonN = 10.0 + 2.0 * floor(h11(s.sd) * 3.0);\n        for (int k = 0; k < 2; k++) {\n            vec3 q = vec3(p / R, k == 0 ? z : -z);\n            q.yz = rot(ax) * q.yz;\n            q.xz = rot(ay) * q.xz;\n            float lat = asin(clamp(q.y, -1.0, 1.0));\n            float lon = atan(q.x, q.z);\n            float dLon = abs(fract(lon / TAU * lonN + 0.5) - 0.5) * TAU / lonN * cos(lat) * R;\n            float dLat = abs(fract(lat / PI * 8.0 + 0.5) - 0.5) * PI / 8.0 * R;\n            ink = min(ink, min(dLon, dLat) - (k == 0 ? lw : lw * 0.45));\n        }\n    }\n    return vec2(ink, sil);\n}\n\nvec2 burst(vec2 p, float R, Scene s) {\n    float n = floor(9.0 + 10.0 * h11(s.sd * 1.7));\n    float m = mix(2.1, 3.2, h11(s.sd * 2.3));\n    float r = length(p);\n    float st = sdStar(rot(gT * 0.4 + gKick * 0.2) * p, R * (0.9 + 0.1 * gKick), n, m);\n    float ink = max(st, -(r - R * 0.38));\n    ink = min(ink, r - R * 0.28);\n    ink = min(ink, abs(r - R * 1.1) - R * 0.022);\n    return vec2(ink, r - R * 1.14);\n}\n\nvec2 butterfly(vec2 p, float R) {\n    float flap = 0.72 + 0.28 * cos(gBeat * PI);\n    p.x /= flap;\n    vec2 q = vec2(abs(p.x), p.y);\n    vec2 a = rot(-0.5) * (q - vec2(0.46, 0.24) * R);\n    vec2 b = rot(0.6) * (q - vec2(0.3, -0.3) * R);\n    float up = sdEll(a, vec2(0.46, 0.34) * R);\n    float lo = sdEll(b, vec2(0.3, 0.22) * R);\n    float body = sdEll(p - vec2(0.0, -0.02 * R), vec2(0.06, 0.42) * R);\n    float shape = smin(smin(up, lo, 0.06 * R), body, 0.04 * R);\n    shape = min(shape, sdSeg(q, vec2(0.02, 0.36) * R, vec2(0.16, 0.62) * R) - 0.016 * R);\n    float holes = min(sdEll(a + vec2(0.03, 0.0) * R, vec2(0.27, 0.17) * R), sdEll(b, vec2(0.15, 0.1) * R));\n    return vec2(max(shape, -holes), shape) * flap;\n}\n\nvec2 cubeProj(vec3 q, float a1, float a2, float R) {\n    q.xz = rot(a1) * q.xz;\n    q.yz = rot(a2) * q.yz;\n    return q.xy * (3.0 / (4.0 + q.z)) * R * 0.62;\n}\nvec2 cube(vec2 p, float R, Scene s) {\n    float d = 1e2;\n    for (int c = 0; c < 2; c++) {\n        float sc = c == 0 ? 1.0 : 0.5;\n        float a1 = gT * (c == 0 ? 0.7 : -1.1) + s.sd, a2 = gT * (c == 0 ? 0.45 : -0.8) + 1.0;\n        for (int e = 0; e < 12; e++) {                 // 4 edges along each axis\n            float fe = float(e);\n            float ax = floor(fe / 4.0);\n            float j = fe - ax * 4.0;\n            float u = mod(j, 2.0) * 2.0 - 1.0, v = floor(j / 2.0) * 2.0 - 1.0;\n            vec3 ea = ax < 0.5 ? vec3(-1.0, u, v) : (ax < 1.5 ? vec3(u, -1.0, v) : vec3(u, v, -1.0));\n            vec3 eb = ax < 0.5 ? vec3( 1.0, u, v) : (ax < 1.5 ? vec3(u,  1.0, v) : vec3(u, v,  1.0));\n            d = min(d, sdSeg(p, cubeProj(ea * sc, a1, a2, R), cubeProj(eb * sc, a1, a2, R)));\n        }\n    }\n    float ink = d - R * 0.02;\n    return vec2(ink, ink);\n}\n\nvec2 swarm(vec2 p, float R, Scene s) {\n    float ink = 1e2, sil = 1e2;\n    for (int i = 0; i < 5; i++) {\n        float fi = float(i);\n        vec2 o = vec2(sin(gT * (0.6 + 0.13 * fi) + fi * 2.4 + s.sd), cos(gT * (0.47 + 0.11 * fi) + fi * 1.7)) * R * vec2(0.75, 0.7);\n        float r = R * (0.22 + 0.1 * h11(fi + s.sd)) * (1.0 + 0.1 * gKick);\n        vec3 sm = smileyShape(rot(sin(gT * 1.3 + fi) * 0.6) * (p - o), r, true);\n        ink = min(ink, sm.x);\n        sil = min(sil, sm.y);\n    }\n    return vec2(ink, sil);\n}\n\nvec2 vinyl(vec2 p, float R) {\n    float r = length(p);\n    float sil = r - R;\n    float gs = R * 0.04;\n    float a = atan(p.y, p.x);\n    float shine = 1.0 - smoothstep(0.0, 0.3, abs(mod(a - 0.8 + PI * 0.5, PI) - PI * 0.5));\n    float groove = abs(fract(r / gs + 0.5) - 0.5) * gs - gs * (0.1 + 0.25 * shine);\n    groove = max(groove, max(R * 0.42 - r, r - R * 0.95));\n    float ink = max(max(sil, -groove), -(r - R * 0.36));\n    vec2 lp = rot(gT * 3.49) * p;                       // two-tone label spinning at 33 rpm\n    ink = min(ink, max(r - R * 0.3, lp.y));\n    ink = max(ink, -(length(lp - vec2(0.0, -0.16 * R)) - 0.045 * R));\n    ink = min(ink, length(lp - vec2(0.0, 0.16 * R)) - 0.045 * R);\n    ink = max(ink, -(r - R * 0.025));\n    ink = min(ink, abs(r - R * 0.33) - R * 0.006);\n    return vec2(ink, sil);\n}\n\nvec2 heroSD(vec2 p, float R, Scene s) {\n    p = rot(0.15 * sin(gT * 0.9 + s.sd) * gChaos) * p;\n    p *= 1.0 - 0.06 * gKick;\n    if (s.hero == 0) return smileyShape(p, R, h11(s.sd * 4.4) < 0.5).xy;\n    if (s.hero == 1) return globe(p, R, s);\n    if (s.hero == 2) return burst(p, R, s);\n    if (s.hero == 3) return butterfly(p, R);\n    if (s.hero == 4) return cube(p, R, s);\n    if (s.hero == 5) return swarm(p, R, s);\n    return vinyl(p, R);\n}\n\nfloat echoRings(float d, vec2 p, float R) {   // wobbly contour echoes around a shape\n    if (d <= 0.0) return 0.0;\n    float sp = R * 0.1;\n    float an = atan(p.y, p.x);\n    float wob = (sin(an * 6.0 + gT * 3.0) * 0.3 + sin(an * 11.0 - gT * 4.0) * 0.15) * (0.4 + gChaos);\n    float dd = d + wob * sp * smoothstep(0.0, R * 0.6, d);\n    float ring = abs(fract(dd / sp - gT * 0.6 + 0.5) - 0.5) * sp;\n    float lw = sp * 0.2 * smoothstep(sp * 0.3, sp * 1.1, dd) * (1.0 - smoothstep(sp * 4.0, sp * 6.0, dd));\n    return lw > 0.0 ? fillD(ring - lw) : 0.0;\n}\n\nvoid drawHero(inout vec3 col, vec2 p, float R, Scene s, vec3 back, vec3 ink, vec3 ech, bool echo) {\n    vec2 h = heroSD(p, R, s);\n    if (echo) paint(col, ech, echoRings(h.y, p, R));\n    paint(col, back, fillD(min(h.y, h.x - R * 0.03)));   // knock-out halo\n    paint(col, ink, fillD(h.x));\n}\n\n// ====================================================================\n//  PHOTO PANELS (halftoned crowd + lasers, or your own input)\n// ====================================================================\nfloat crowd(vec2 q, float asp, float sd, float ph) {    // q: x 0..asp, y 0..1\n    float px = gPX / ph;\n    float v = 0.25 + 0.45 * fbm(q * vec2(3.0, 2.0) + vec2(gT * 0.15, sd));\n    vec2 dq = q - vec2(asp * (0.5 + 0.35 * sin(gT * 0.6 + sd)), 1.1);\n    float fan = abs(fract(atan(dq.x, -dq.y) * 3.0 + gT * 0.5) - 0.5);\n    v += (1.0 - smoothstep(0.02, 0.1, fan)) * (0.5 + 0.5 * gKick) * smoothstep(-0.2, 0.8, q.y);\n    float sil = 1e2;\n    for (int i = 0; i < 8; i++) {\n        float fi = float(i);\n        float x = ((fi + 0.5) / 8.0 + (h11(fi + sd * 13.0) - 0.5) * 0.08) * asp;\n        float jump = abs(sin(gBeat * PI + fi * 1.3)) * 0.06;\n        float y = 0.3 + h11(fi * 3.1 + sd) * 0.12 + jump;\n        float r = 0.06 + 0.025 * h11(fi * 7.7 + sd);\n        sil = min(sil, length((q - vec2(x, y)) * vec2(1.0, 0.85)) - r);\n        sil = min(sil, sdRBox(q - vec2(x, y - r - 0.25), vec2(r * 1.7, 0.25), r));\n        if (h11(fi * 5.3 + sd) > 0.45) {\n            vec2 hand = vec2(x + 0.1 * sin(gT * 2.5 + fi), y + 0.28);\n            sil = min(sil, sdSeg(q, vec2(x + r * 0.8, y - r), hand) - 0.02);\n        }\n    }\n    return mix(v, 0.03, clamp(0.5 - sil / px, 0.0, 1.0));\n}\n\n// zine layout photo panels: top-left (top = true) or bottom-left, as (x0, y0, x1, y1)\nvec4 photoRect(bool top) {\n    float x0 = 0.052, iw = gW - 2.0 * x0;\n    return top ? vec4(x0, 0.6, x0 + iw * 0.45, 1.0 - x0) : vec4(x0, x0, x0 + iw * 0.55, 0.318);\n}\n\nvoid photoPanel(inout vec3 col, vec2 P, vec4 rc, float sd) {\n    vec2 a = rc.xy, b = rc.zw;\n    float bd = sdBox(P - (a + b) * 0.5, (b - a) * 0.5);\n    if (bd < 0.006) {\n        float ph = b.y - a.y;\n        float v = gPhoto >= 0.0 ? gPhoto : crowd((P - a) / ph, (b.x - a.x) / ph, sd, ph);\n        paint(col, cI, halftone(P, v, 0.0085) * fillD(bd));\n        paint(col, cI, strokeD(bd, 0.0016));\n    }\n}\n\n// ====================================================================\n//  SCENE GENERATION\n// ====================================================================\nScene makeScene(float id) {\n    Scene s;\n    s.sd    = mod(id * 7.31, 97.0) + h11(id) * 13.0;\n    s.lay   = gLay >= 0 ? gLay : pickI(6, h21(vec2(id, 1.1)));\n    s.pal   = pickI(12, h21(vec2(id, 2.2)));\n    s.sty   = pickI(5, h21(vec2(id, 3.3)));\n    s.hero  = pickI(7, h21(vec2(id, 4.4)));\n    s.bg    = sel(pickI(6, h21(vec2(id, 5.5))), 0, 1, 2, 3, 4, 6, 6);\n    s.head  = G_HEAD  + pickI(N_HEAD,  h21(vec2(id, 6.6)));\n    s.head2 = G_HEAD2 + pickI(N_HEAD2, h21(vec2(id, 7.7)));\n    s.tag   = G_TAG   + pickI(N_TAG,   h21(vec2(id, 8.8)));\n    int i0  = pickI(N_INFO, h21(vec2(id, 9.9)));\n    s.i0    = G_INFO + i0;\n    s.i1    = G_INFO + imod(i0 + 1 + pickI(N_INFO - 1, h21(vec2(id, 10.1))), N_INFO);\n    s.dj    = pickI(N_DJ, h21(vec2(id, 11.1)));\n    s.quad  = pickI(N_QUAD, h21(vec2(id, 12.1)));\n    s.date  = G_DATE  + pickI(N_DATE,  h21(vec2(id, 13.1)));\n    s.place = G_PLACE + pickI(N_PLACE, h21(vec2(id, 14.1)));\n    s.hour  = G_HOUR  + pickI(N_HOUR,  h21(vec2(id, 15.1)));\n    s.yr    = G_YEAR  + pickI(N_YEAR,  h21(vec2(id, 16.1)));\n    s.marq  = G_MARQ  + pickI(N_MARQ,  h21(vec2(id, 17.1)));\n    s.echo  = h21(vec2(id, 18.1)) < 0.5;\n    s.inv   = h21(vec2(id, 19.1)) < 0.2;\n    float hb = h21(vec2(id, 20.1)), hc = h21(vec2(id, 21.1)), hd = h21(vec2(id, 22.1));\n    if (s.lay == 1) {\n        s.bg   = sel(pickI(4, hb), 5, 3, 2, 6, 0, 0, 0);\n        s.hero = sel(pickI(5, hc), 3, 2, 0, 6, 3, 0, 0);\n        s.pal  = sel(pickI(7, hd), 3, 2, 0, 4, 6, 9, 11);\n        s.echo = true; s.inv = false;\n    }\n    if (s.lay == 2) { s.bg = 1; s.pal = sel(pickI(5, hd), 5, 11, 7, 10, 2, 0, 0); s.inv = false; }\n    if (s.lay == 3) { s.bg = 5; s.pal = sel(pickI(6, hd), 8, 1, 10, 5, 7, 4, 0); s.inv = false; }\n    if (s.lay == 4) {\n        s.bg   = sel(pickI(4, hb), 2, 2, 6, 0, 0, 0, 0);\n        s.hero = sel(pickI(5, hc), 1, 4, 3, 0, 1, 0, 0);\n        s.pal  = sel(pickI(6, hd), 7, 10, 5, 1, 8, 11, 0);\n        s.inv  = false;\n    }\n    if (s.lay == 5) s.pal = sel(pickI(7, hd), 1, 0, 2, 3, 4, 8, 9);\n    return s;\n}\n\n// ====================================================================\n//  LAYOUTS  =  a shapes pass + a list of text items\n// ====================================================================\n\n// ---- 0: header slab, hero over pattern, info footer, sticker badge ----\nvoid shapesHeader(inout vec3 col, vec2 P, Scene s) {\n    float W = gW, cx = W * 0.5, m = 0.035, sc = min(W / 0.8, 1.0);\n    float slab = sdRBox(P - vec2(cx, 0.875), vec2(cx - m, 0.085), 0.015);\n    paint(col, cP, fillD(slab - 0.007));\n    paint(col, cI, fillD(slab));\n    paint(col, cP, fillD(P.y - 0.205));\n    paint(col, cI, strokeD(P.y - 0.205, 0.0025));\n    vec2 bc = P - vec2(W - m - 0.075 * sc, 0.29);\n    float bd = sdStar(rot(gT * 0.5) * bc, 0.07 * sc * (1.0 + 0.06 * gKick), 14.0, 5.0);\n    paint(col, cA, fillD(bd));\n    paint(col, cI, strokeD(bd, 0.0015));\n}\n\n// ---- 1: flat stock, hero with echo contours, two-line headline, date pill ----\nvoid shapesWicked(inout vec3 col, vec2 P, Scene s) {\n    float W = gW, cx = W * 0.5, m = 0.04;\n    float dw = min(W * 0.5, (10.0 - 1.0 / 6.0) * 0.022 / 1.3) * 0.5 + 0.02;   // dates are 10 chars\n    vec2 dp = P - vec2(cx, 0.105);\n    paint(col, cI, strokeD(sdRBox(dp, vec2(dw, 0.02), 0.02), 0.0025));\n    paint(col, cI, fillD(max(abs(dp.y) - 0.0012, max(dw + 0.015 - abs(dp.x), abs(dp.x) - (cx - m)))));\n    paint(col, cI, strokeD(length(vec2(abs(dp.x) - (cx - m), dp.y)) - 0.004, 0.0012));\n}\n\n// ---- 2: acid - box tunnel, coin smileys, waving word stack, info box ----\nvoid shapesAcid(inout vec3 col, vec2 P, Scene s) {\n    float W = gW, m = 0.035, sc = min(W / 0.8, 1.0);\n    vec2 cq = P - vec2(m, 0.36);                                  // fading checker strip\n    if (cq.x > 0.0 && cq.x < W * 0.44 && cq.y > 0.0 && cq.y < 0.1) {\n        vec2 g = cq / 0.025 + vec2(gT * 1.5, 0.0);\n        float fw = PI / 0.025 * gPX;\n        float v = clamp(sin(g.x * PI) / fw, -1.0, 1.0) * clamp(sin(g.y * PI) / fw, -1.0, 1.0);\n        paint(col, accOn(), (0.5 + 0.5 * v) * (1.0 - smoothstep(0.0, W * 0.44, cq.x)));\n    }\n    for (int i = 0; i < 2; i++) {                                 // tumbling coin smileys\n        float fi = float(i);\n        vec2 c = vec2(W * (0.22 + 0.1 * fi), 0.64 - 0.17 * fi) + vec2(sin(gT * 0.9 + fi * 2.0), cos(gT * 0.7 + fi)) * 0.03;\n        float R = (i == 0 ? 0.13 : 0.095) * sc * (1.0 + 0.06 * gKick);\n        float tilt = sin(gT * 1.2 + fi * 1.7) * 0.9;\n        vec2 p = rot(0.4 * sin(gT * 0.8 + fi)) * (P - c);\n        p.x /= max(cos(tilt), 0.25);\n        paint(col, cA, fillD(smileyShape(p + vec2(sin(tilt) * 0.16, -0.1) * R, R, true).y));\n        vec3 sm = smileyShape(p, R, true);\n        paint(col, cI, fillD(sm.y));\n        paint(col, cP, fillD(max(sm.z, sm.y)));\n    }\n    float tbd = sdRBox(P - vec2(W * 0.5, 0.93), vec2(W * 0.5 - m, 0.026), 0.008);   // window bar\n    paint(col, cP, fillD(tbd));\n    paint(col, cI, strokeD(tbd, 0.002));\n    vec2 xp = P - vec2(W - m - 0.022, 0.93);\n    paint(col, cI, fillD(min(sdSeg(xp, vec2(-0.008), vec2(0.008)), sdSeg(xp, vec2(-0.008, 0.008), vec2(0.008, -0.008))) - 0.0018));\n    vec2 b0 = vec2(m, 0.05), b1 = vec2(W * 0.46, 0.33);           // info box\n    float bd = sdRBox(P - (b0 + b1) * 0.5, (b1 - b0) * 0.5, 0.012);\n    paint(col, cP, fillD(bd));\n    paint(col, cI, strokeD(bd, 0.0022));\n    for (int i = 0; i < 3; i++) {                                 // sparkles\n        float fi = float(i);\n        float r = 0.022 * (0.7 + 0.5 * abs(sin(gT * 2.0 + fi * 2.0)));\n        paint(col, accOn(), fillD(sdStar(P - vec2(W * (0.52 + 0.17 * fi), 0.86 - 0.05 * fi), r, 4.0, 2.3)));\n    }\n}\n\n// ---- 3: the lineup IS the smiley ----\n\n// ---- 4: contour field, side spine with vertical title ----\nvoid shapesVertical(inout vec3 col, vec2 P, Scene s) {\n    float W = gW, m = 0.03, sx0 = W * 0.76, sw = W - m - sx0;\n    paint(col, cP, fillD(sdBox(P - vec2(sx0 + sw * 0.5, 0.5), vec2(sw * 0.5, 0.5 - m))));\n    vec2 bc = vec2(m + 0.075, m + 0.05);\n    float bd = sdBox(P - bc, vec2(0.075, 0.05));\n    paint(col, cP, fillD(bd));\n    paint(col, accOn(), strokeD(bd, 0.002));\n    paint(col, cP, fillD(sdBox(P - vec2(sx0 * 0.5, 0.95), vec2(sx0 * 0.5 - m, 0.018))));\n}\n\n// ---- 5: zine grid - marquee border, halftone photos, outline type, barcodes ----\nvoid gridRowB(vec2 P, Scene s, float x0, float iw, float yb0, float yb1, out int w, out vec2 org, out vec2 cs, out int i) {\n    int qi = imod(s.quad + 1 + pickI(N_QUAD - 1, h11(s.sd)), N_QUAD);\n    float lh = (yb1 - yb0) / 4.0;\n    cs = vec2(min(iw * 0.74 / (quadMax(qi) - 1.0 / 6.0), lh * 0.86), lh * 0.86);\n    i = int(clamp(floor((yb1 - P.y) / lh), 0.0, 3.0));\n    w = G_QUAD + qi * 4 + i;\n    org = vec2(x0, yb1 - lh * float(i + 1) + lh * 0.07);\n}\nvoid shapesGrid(inout vec3 col, vec2 P, Scene s) {\n    float W = gW, m0 = 0.012, bw = 0.028;\n    vec2 cp = vec2(min(P.x, W - P.x), min(P.y, 1.0 - P.y)) - vec2(m0 + bw * 0.5);\n    paint(col, cI, fillD(sdStar(rot(gT) * cp, bw * 0.45, 4.0, 2.3)));\n    float x0 = m0 + bw + 0.012, x1 = W - x0, y0 = x0, y1 = 1.0 - x0, iw = x1 - x0, g = 0.012;\n    float ya = 0.6, xa = x0 + iw * 0.45, yb0 = 0.33, yb1 = ya - g, yc1 = yb0 - g, xc = x0 + iw * 0.55;\n    paint(col, cI, strokeD(sdBox(P - vec2(W * 0.5, 0.5), vec2(W * 0.5 - x0 + 0.006, 0.5 - x0 + 0.006)), 0.0015));\n    bool top = P.y > 0.45;\n    photoPanel(col, P, photoRect(top), s.sd + (top ? 0.0 : 7.0));\n    vec2 ta = vec2(xa + g, ya + (y1 - ya) * 0.32), tb = vec2(x1, y1);\n    paint(col, cI, fillD(sdRBox(P - (ta + tb) * 0.5, (tb - ta) * 0.5, 0.03)));\n    vec2 ia = vec2(xa + g, ya), ib = vec2(x1, ta.y - g);\n    vec2 ic = (ia + ib) * 0.5, ih = (ib - ia) * 0.5;\n    paint(col, cI, strokeD(sdBox(P - ic, ih), 0.0015));\n    float isz = ih.y * 0.75;\n    vec2 icc = vec2(ib.x - ih.y, ic.y);\n    paint(col, cI, strokeD(sdBox(P - icc, vec2(isz)), 0.0015));\n    paint(col, cI, fillD(sdStar(rot(gT * 0.8) * (P - icc), isz * 0.85, 4.0, 2.3)));\n    vec2 na = vec2(xc + g, y0), nb = vec2(x1, yc1);\n    paint(col, cI, strokeD(sdBox(P - (na + nb) * 0.5, (nb - na) * 0.5), 0.0015));\n}\n\n// Text items are table-style: branches only set the few values that differ,\n// then one tItem() call (branches that compute whole items each cost the\n// WebGL compiler ~0.2 s; branches that pick values are nearly free).\n// Fitted text: sz = (bw, bh / st, bh, st). Fixed cell: (1e3, cell w, cell h, 1e3).\nvoid itemHeader(int k, vec2 P, Scene s) {\n    float W = gW, cx = W * 0.5, m = 0.035, sc = min(W / 0.8, 1.0);\n    vec2 p = P, anc = vec2(cx, 0.068), aln = vec2(0.5);\n    float bw = W - 2.0 * m, bh = 0.022, st = 1.3, cxm = -1.0;\n    int w = s.i1, sty = 0;\n    vec3 col = cI;\n    if (k == 0) { anc.y = 0.875; bw = (cx - m) * 1.84; bh = 0.13; w = s.head; sty = s.sty; col = cP; gTWob = 1.0; }\n    else if (k == 1) { anc.y = 0.162; bh = 0.038; w = s.tag; }\n    else if (k == 2) { anc.y = 0.108; bh = 0.026; w = s.i0; }\n    else if (k == 4) {                                    // lineup ticker\n        anc = vec2(m, 0.016); aln = vec2(0.0); bw = 1e3; cxm = 0.0125; bh = 0.016; st = 1e3; w = W_LINEUP; col = accOn();\n        gTScr = gT * 3.0; gTRep = true; gTA = fillD(abs(P.x - cx) - (cx - m));\n    } else if (k == 5) {                                  // year on the sticker\n        p = rot(-0.25) * (P - vec2(W - m - 0.075 * sc, 0.29)); anc = vec2(0.0);\n        bw = 0.084 * sc; bh = 0.042 * sc; st = 1.2; w = s.yr; col = inkOn(cA);\n    }\n    tItem(p, anc, aln, w, vec4(bw, cxm < 0.0 ? bh / st : cxm, bh, st), sty, col);\n}\n\nvoid itemWicked(int k, vec2 P, Scene s) {\n    float W = gW;\n    vec2 anc = vec2(W * 0.5, 0.032);\n    float bw = W - 0.08, bh = 0.016, st = 1.3;\n    int w = s.i0, sty = 0;\n    if (k == 0) { anc.y = 0.958; w = s.i1; }\n    else if (k == 1) {                                    // three DJ columns, picked by x\n        float i = clamp(floor(P.x / W * 3.0), 0.0, 2.0);\n        anc = vec2(W * (0.2 + 0.3 * i), 0.905); bw = W * 0.26; bh = 0.026; w = G_DJ + imod(s.dj + int(i), N_DJ);\n    }\n    else if (k == 2) { anc.y = 0.305; bh = 0.085; st = 1.15; w = s.head;  sty = s.sty; gTWob = 1.0; }\n    else if (k == 3) { anc.y = 0.215; bh = 0.085; st = 1.15; w = s.head2; sty = s.sty; gTWob = 1.0; }\n    else if (k == 4) { anc.y = 0.153; bw = W * 0.7; bh = 0.02;  w = s.tag; }\n    else if (k == 5) { anc.y = 0.105; bw = W * 0.5; bh = 0.022; w = s.date; }\n    else if (k == 6) { anc.y = 0.058; w = s.place; }\n    tItem(P, anc, vec2(0.5), w, vec4(bw, bh / st, bh, st), sty, cI);\n}\n\nvoid itemAcid(int k, vec2 P, Scene s) {\n    float W = gW, m = 0.035;\n    vec2 p = P, anc = vec2(W * 0.5 - 0.03, 0.93), aln = vec2(0.5);\n    float bw = W - 2.0 * m - 0.1, bh = 0.02, st = 1.3, cxm = -1.0;\n    int w = s.tag, sty = 0;\n    vec3 col = accOn();\n    if (k == 0) {                                         // the waving stack: one row per pixel\n        float x0 = W * 0.5, x1 = W - m, rowH = 0.75 / 9.0;\n        float yy = P.y - 0.05 + gT * 0.4 * rowH;\n        float row = floor(yy / rowH);\n        float wv = sin(row * 0.9 - gT * 3.0) * 0.5 + 0.5;            // slide left/right\n        p = vec2(P.x, yy - row * rowH + sin(P.x * 30.0 + gT * 4.0 + row) * 0.003);\n        anc = vec2(x0 + (x1 - x0) * wv, rowH * 0.04); aln = vec2(wv, 0.0);\n        bw = x1 - x0; bh = rowH * 0.92; cxm = bh / 0.75; st = 1e3;   // full row height, any width\n        w = (P.x < x0 - 0.01 || P.x > x1 + 0.01 || P.y < 0.05 || P.y > 0.8) ? -1 : s.head;\n        sty = mod(row, 3.0) < 1.0 ? 2 : 0;\n        col = mix(cI, accOn(), 0.5 + 0.5 * sin(row * 0.7 - gT * 2.0));\n    } else if (k == 2) {                                  // info box line, picked by y\n        float lh = 0.0625;\n        float i = clamp(floor((0.315 - P.y) / lh), 0.0, 3.0);\n        int ii = int(i);\n        anc = vec2(m + 0.015, 0.315 - lh * (i + 0.9)); aln = vec2(0.0);\n        bw = W * 0.46 - m - 0.03; bh = lh * (ii == 3 ? 0.85 : 0.6); st = 1.25;\n        w = ii == 0 ? s.date : (ii == 1 ? s.place : (ii == 2 ? s.hour : s.head));\n        col = mod(i, 2.0) < 0.5 ? cI : accOn();\n    }\n    tItem(p, anc, aln, w, vec4(bw, cxm < 0.0 ? bh / st : cxm, bh, st), sty, col);\n}\n\nvoid itemSmiley(int k, vec2 P, Scene s) {\n    float W = gW, cx = W * 0.5, sc = min(W / 0.8, 1.0);\n    vec2 p = P, anc = vec2(cx, 0.972), aln = vec2(0.5);\n    float bw = W * 0.5, bh = 0.022, st = 1.3, cxm = -1.0;\n    int w = s.head, sty = 0;\n    vec3 col = cI;\n    if (k == 0) {                                         // lineup rows clipped to the face\n        float R = min(W * 0.47, 0.44) * (1.0 + 0.03 * gKick);\n        vec2 c = P - vec2(cx, 0.53);\n        vec3 sm = smileyShape(rot(0.08 * sin(gT * 0.7)) * c, R, true);\n        float rowH = 2.0 * R / 26.0;\n        float row = floor((c.y + R) / rowH);\n        float hr = h21(vec2(row, s.sd));\n        bool big = hr > 0.78;\n        p = c; anc = vec2(-W, -R + row * rowH + rowH * 0.08); aln = vec2(0.0);\n        bw = 1e3; cxm = rowH * ((big ? 1.05 : 0.5) + 0.1 * hr); bh = rowH * 0.84; st = 1e3;\n        w = W_LINEUP; sty = big && s.sty != 2 ? s.sty : 0; col = hr > 0.9 ? accOn() : cI;\n        gTScr = hr * 300.0 + (mod(row, 2.0) < 0.5 ? 1.0 : -1.0) * gT * (1.2 + 2.0 * hr);\n        gTRep = true; gTA = fillD(sm.y) * fillD(-(sm.z - R * 0.05));\n    }\n    else if (k == 1) { anc = vec2(W - 0.13 * sc, 0.075); bw = 0.2 * sc; bh = 0.09; st = 1.25; w = s.yr; gTWob = 1.0; }\n    else if (k == 3) { anc = vec2(0.03); aln = vec2(0.0); bw = W * 0.45; bh = 0.02; w = s.date; }\n    tItem(p, anc, aln, w, vec4(bw, cxm < 0.0 ? bh / st : cxm, bh, st), sty, col);\n}\n\nvoid itemVertical(int k, vec2 P, Scene s) {\n    float W = gW, m = 0.03, sx0 = W * 0.76, sw = W - m - sx0;\n    vec2 p = P, anc = vec2(sx0 * 0.5, 0.95), aln = vec2(0.5);\n    float bw = sx0 - 2.0 * m - 0.02, bh = 0.02, st = 1.3, cxm = -1.0;\n    int w = s.tag, sty = 0;\n    vec3 col = accOn();\n    if (k == 0) {                                         // title reading down the spine\n        p = vec2(1.0 - m - 0.025 - P.y, P.x - sx0 - sw * 0.06); anc = vec2(0.0); aln = vec2(0.0);\n        bw = 1.0 - 2.0 * m - 0.05; bh = sw * 0.6; st = 1.1; w = s.head; sty = s.sty;\n    } else if (k == 1) {                                  // marquee down the spine\n        p = vec2(1.0 - P.y, P.x - sx0 - sw * 0.72); anc = vec2(0.0); aln = vec2(0.0);\n        bw = 1e3; cxm = sw * 0.16; bh = sw * 0.2; st = 1e3; w = s.marq; col = cI;\n        gTScr = gT * 2.0; gTRep = true;\n        gTA = fillD(sdBox(P - vec2(sx0 + sw * 0.5, 0.5), vec2(sw * 0.5, 0.5 - m)));\n    }\n    else if (k == 2) { anc = vec2(m + 0.075, m + 0.05); bw = 0.12; bh = 0.06; st = 1.2; w = s.yr; }\n    tItem(p, anc, aln, w, vec4(bw, cxm < 0.0 ? bh / st : cxm, bh, st), sty, col);\n}\n\nvoid itemGrid(int k, vec2 P, Scene s) {\n    float W = gW, m0 = 0.012, bw0 = 0.028;\n    float x0 = m0 + bw0 + 0.012, x1 = W - x0, y0 = x0, y1 = 1.0 - x0, iw = x1 - x0, g = 0.012;\n    float ya = 0.6, xa = x0 + iw * 0.45, yb0 = 0.33, yb1 = ya - g, yc1 = yb0 - g, xc = x0 + iw * 0.55;\n    float tay = ya + (y1 - ya) * 0.32;                    // bottom of the title slab\n    vec2 p = P, anc = vec2(0.0), aln = vec2(0.0);\n    float bw = 1e3, bh = 1.0, st = 1e3, cxm = 1.0;        // fixed cells unless set\n    int w = -1, sty = 0;\n    vec3 col = cI;\n    if (k == 0) {                                         // marquee crawling around the border\n        float dl = P.x, dr = W - P.x, db = P.y, dt = 1.0 - P.y;\n        float e = min(min(dl, dr), min(db, dt));\n        float sa = e == dt ? P.x : (e == dr ? W + 1.0 - P.y : (e == db ? 2.0 * W + 1.0 - P.x : 2.0 * W + 1.0 + P.y));\n        float ch = bw0 * 0.72;\n        p = vec2(sa, m0 + bw0 - e); anc = vec2(0.0, (bw0 - ch) * 0.5); cxm = ch / 1.25; bh = ch;\n        w = (e < m0 || e > m0 + bw0 || (min(dl, dr) < m0 + bw0 && min(db, dt) < m0 + bw0)) ? -1 : s.marq;\n        gTScr = gT * 2.5; gTRep = true;\n    } else if (k == 1) {                                  // title slab, right aligned\n        float lh = (y1 - tay - 0.02) / 4.0;\n        float i = clamp(floor((y1 - 0.01 - P.y) / lh), 0.0, 3.0);\n        anc = vec2(x1 - 0.015, y1 - 0.01 - lh * (i + 1.0) + lh * 0.06); aln = vec2(1.0, 0.0);\n        cxm = min((x1 - xa - g - 0.03) / (quadMax(s.quad) - 1.0 / 6.0), lh * 0.8); bh = lh * 0.88;\n        w = P.x < xa + g ? -1 : G_QUAD + s.quad * 4 + int(i); col = cP;\n    } else if (k == 2) {                                  // info strip, three small lines\n        float ihy = (tay - g - ya) * 0.5, lx = xa + g + 0.008;\n        float i = clamp(floor((tay - g - ihy * 0.12 - P.y) / (ihy * 0.6)), 0.0, 2.0);\n        int ii = int(i);\n        anc = vec2(lx, tay - g - ihy * 0.12 - ihy * 0.6 * (i + 1.0));\n        bw = x1 - ihy * 1.75 - 0.01 - lx; bh = ihy * 0.4; st = 1.3; cxm = bh / st;\n        w = (P.x < xa + g || P.y < ya || P.y > tay - g) ? -1 : (ii == 0 ? s.tag : (ii == 1 ? s.i0 : s.hour));\n    } else if (k == 3) {                                  // outlined lines (+ barcode in the renderer)\n        int ww, i; vec2 org, cs;\n        gridRowB(P, s, x0, iw, yb0, yb1, ww, org, cs, i);\n        anc = org; cxm = cs.x; bh = cs.y; sty = 2;\n        w = (P.y < yb0 || P.y > yb1) ? -1 : ww;\n    } else {                                              // NO SLEEP stack, scrolling\n        vec2 na = vec2(xc + g, y0), nb = vec2(x1, yc1);\n        float lh = (nb.y - na.y) / 6.0;\n        float yy = P.y - na.y + gT * 0.5 * lh;\n        p = vec2(P.x, yy - floor(yy / lh) * lh); anc = vec2(na.x + 0.008, lh * 0.5); aln = vec2(0.0, 0.5);\n        bw = nb.x - na.x - 0.016; cxm = 1e3; bh = lh * 0.84; st = 1.8;\n        w = W_NOSLEEP; gTA = fillD(sdBox(P - (na + nb) * 0.5, (nb - na) * 0.5) + 0.003);\n    }\n    tItem(p, anc, aln, w, vec4(bw, cxm, bh, st), sty, col);\n}\n\n// which text item (if any) can cover this pixel - text lines never overlap\nint textSlot(vec2 P, Scene s) {\n    float W = gW, sc = min(W / 0.8, 1.0);\n    if (s.lay == 0) {\n        if (P.y > 0.6) return 0;\n        if (length(P - vec2(W - 0.035 - 0.075 * sc, 0.29)) < 0.09 * sc) return 5;\n        if (P.y > 0.135) return 1;\n        if (P.y > 0.088) return 2;\n        if (P.y > 0.045) return 3;\n        return 4;\n    }\n    if (s.lay == 1) {\n        if (P.y > 0.935) return 0;\n        if (P.y > 0.8) return 1;\n        if (P.y > 0.26) return 2;\n        if (P.y > 0.18) return 3;\n        if (P.y > 0.128) return 4;\n        if (P.y > 0.08) return 5;\n        if (P.y > 0.045) return 6;\n        return 7;\n    }\n    if (s.lay == 2) return P.y > 0.86 ? 1 : (P.x > W * 0.48 ? 0 : 2);\n    if (s.lay == 3) {\n        if (length(P - vec2(W * 0.5, 0.53)) < min(W * 0.47, 0.44) * 1.05) return 0;\n        if (P.y > 0.9) return 2;\n        return P.x > W * 0.5 ? 1 : 3;\n    }\n    if (s.lay == 4) {\n        float sx0 = W * 0.76, sw = W - 0.03 - sx0;\n        if (P.x > sx0) return P.x < sx0 + sw * 0.69 ? 0 : 1;\n        return P.y > 0.85 ? 3 : 2;\n    }\n    float m0 = 0.012, bw = 0.028, x0 = m0 + bw + 0.012;        // 5: zine grid\n    if (min(min(P.x, W - P.x), min(P.y, 1.0 - P.y)) < m0 + bw + 0.004) return 0;\n    if (P.y > 0.594) return P.y > 0.6 + (0.4 - x0) * 0.32 ? 1 : 2;\n    return P.y > 0.33 ? 3 : 4;\n}\n\nvoid textItem(int k, vec2 P, Scene s) {\n    if (s.lay == 0) itemHeader(k, P, s);\n    else if (s.lay == 1) itemWicked(k, P, s);\n    else if (s.lay == 2) itemAcid(k, P, s);\n    else if (s.lay == 3) itemSmiley(k, P, s);\n    else if (s.lay == 4) itemVertical(k, P, s);\n    else itemGrid(k, P, s);\n}\n\nvec3 renderScene(vec2 P, float id) {\n    Scene s = makeScene(id);\n    // chaos: re-roll pieces of the poster on the beat\n    float bt = floor(gBeat), b2 = floor(gBeat * 0.5);\n    if (h21(vec2(bt, id + 0.5)) < gChaos * 0.4) s.head = G_HEAD + pickI(N_HEAD, h21(vec2(bt, id + 1.5)));\n    if (h21(vec2(bt, id + 2.5)) < gChaos * 0.3) s.sty = pickI(5, h21(vec2(bt, id + 3.5)));\n    if (h21(vec2(b2, id + 4.5)) < gChaos * 0.3) s.pal = pickI(12, h21(vec2(b2, id + 5.5)));\n    if (h21(vec2(floor(gBeat * 2.0), id + 6.5)) < gChaos * 0.12) s.inv = !s.inv;\n    if (s.lay == 0 && h21(vec2(b2, id + 7.5)) < gChaos * 0.35) s.hero = pickI(7, h21(vec2(b2, id + 8.5)));\n    if (s.lay == 0 && h21(vec2(b2, id + 9.5)) < gChaos * 0.3) s.bg = sel(pickI(6, h21(vec2(b2, id + 10.5))), 0, 1, 2, 3, 4, 6, 6);\n    setPal(s.pal, s.inv);\n\n    float W = gW, cx = W * 0.5, sc = min(W / 0.8, 1.0), sx0 = W * 0.76;\n    vec3 col = cP;\n    if (s.lay != 5) {                                             // shared background\n        vec2 bc = s.lay == 1 ? vec2(cx, 0.6) : (s.lay == 2 ? vec2(cx, 0.56) : (s.lay == 4 ? vec2(W * 0.4, 0.55) : vec2(cx, 0.49)));\n        vec2 bg = background(P - bc, s.bg, s.sd);\n        vec3 bcol = s.lay == 1 ? mix(cP, cI, 0.16) : (s.lay == 3 ? cA : mix(cI, cA, bg.y));\n        paint(col, bcol, bg.x * (s.lay == 3 ? 0.7 : 1.0));\n    }\n    if (s.lay == 0 || s.lay == 1 || s.lay == 4) {                 // shared hero\n        vec2 hc = s.lay == 0 ? vec2(cx, 0.49) : (s.lay == 1 ? vec2(cx, 0.6) : vec2(sx0 * 0.5, 0.56));\n        float R = s.lay == 0 ? 0.23 * sc : (s.lay == 1 ? 0.19 * sc : min(sx0 * 0.42, 0.3));\n        vec3 ink = s.lay == 4 ? accOn() : cI;\n        drawHero(col, P - hc, R, s, cP, ink, ink, s.echo);\n    }\n    if (s.lay == 0) shapesHeader(col, P, s);\n    else if (s.lay == 1) shapesWicked(col, P, s);\n    else if (s.lay == 2) shapesAcid(col, P, s);\n    else if (s.lay == 4) shapesVertical(col, P, s);\n    else if (s.lay == 5) shapesGrid(col, P, s);\n\n    gTScr = 0.0; gTWob = 0.0; gTA = 1.0; gTRep = false; tW = -1;\n    int slot = textSlot(P, s);\n    textItem(slot, P, s);                                         // the one text line here\n    if (tW >= 0 && gTA > 0.0) {\n        vec2 wi = wordInfo(float(tW));\n        float L1 = wi.y - 1.0 / 6.0;\n        float cxs = min(tSz.x / L1, tSz.y);\n        vec2 cs = vec2(cxs, min(tSz.z, cxs * tSz.w));\n        vec2 org = tAnc - vec2(L1 * cs.x, cs.y) * tAln;\n        vec2 p = tP;\n        p.y += sin(p.x * 18.0 + gT * 5.0) * cs.y * 0.05 * gChaos * gTWob;\n        vec3 sh = styShape(tSty);\n        vec2 off = vec2(0.9, -0.7) * (1.0 + 1.5 * gKick) * cs / vec2(6.0, 5.0);\n        for (int k = 0; k < 2; k++) {                             // 0: style-4 drop shadow, 1: ink\n            if (k == 0 && tSty != 4) continue;\n            float d = sdText(k == 0 ? p - off : p, org, cs, wi.x, wi.y, gTScr, gTRep, sh);\n            paint(col, k == 0 ? cA : tCol, (k == 0 ? fillD(d) : textMask(d, tSty, cs)) * gTA);\n        }\n        if (s.lay == 5 && slot == 3) {                            // zine: barcode trailing the outline type\n            float u = 0.0035, bx0 = org.x + L1 * cs.x + 0.014;\n            if (P.x > bx0 && P.x < gW - 0.052 && P.y > org.y && P.y < org.y + cs.y) {\n                float bxx = (P.x - bx0) / u + floor(gT * 6.0) * 3.0 * gChaos;\n                float hb = h21(vec2(floor(bxx), org.y * 97.0 + s.sd));\n                float wf = hb > 0.45 ? 0.3 + 0.6 * h11(hb * 91.0) : 0.0;\n                paint(col, cI, wf > 0.0 ? fillD((abs(fract(bxx) - 0.5) - 0.5 * wf) * u) : 0.0);\n            }\n        }\n    }\n    return col;\n}\n\n// ====================================================================\n//  ENTRY:  fragCoord / res in pixels, tm in seconds.\n//  firstIn = poster shown at tm = 0, holdIn = stay on that poster,\n//  layIn = force a layout 0..5 (< 0 = generator picks).\n// ====================================================================\nvec3 rave(vec2 fragCoord, vec2 res, float tm, float bpmIn, float chaosIn, float seedIn, float kickIn, float firstIn, bool holdIn, int layIn) {\n    gT     = tm;\n    gBeat  = tm * bpmIn / 60.0;\n    gChaos = clamp(chaosIn, 0.0, 1.0) * smoothstep(0.0, 2.0, gBeat);   // calm first frame (poster grabs)\n    gLay   = layIn;\n    // portrait / square canvases are the poster; wider ones hang a 4:5 poster on a wall\n    float asp = res.x / res.y;\n    bool wall = asp > 1.05;\n    float ps = wall ? 0.92 : 1.0;\n    gW  = wall ? 0.8 : asp;\n    gPX = 1.0 / (res.y * ps);\n    vec2 Q  = vec2((fragCoord.x / res.x - 0.5) * asp, fragCoord.y / res.y - 0.5);\n    vec2 P  = Q / ps + vec2(gW * 0.5, 0.5);\n    vec2 uv = P / vec2(gW, 1.0);                                  // poster-relative 0..1\n\n    gPhoto = -1.0;                                                // sample the photo input up front,\n#ifdef RAVE_INPUT                                                 // outside any branch or loop\n    vec4 pr = photoRect(P.y > 0.45);\n    gPhoto = RAVE_INPUT(clamp((P - pr.xy) / (pr.zw - pr.xy), 0.0, 1.0));\n#endif\n\n    float s16 = floor(gBeat * 4.0);\n    if (h11(s16 * 2.71 + 0.3) < gChaos * 0.12) {                 // stutter: freeze on a 16th\n        gBeat = s16 * 0.25;\n        gT = gBeat * 60.0 / bpmIn;\n    }\n    gKick = max(exp(-fract(gBeat) * 6.0), clamp(kickIn, 0.0, 1.0));\n\n    vec2 ctr = vec2(gW * 0.5, 0.5);                               // kick punch + shake\n    P = ctr + (P - ctr) / (1.0 + 0.035 * gKick * gChaos);\n    P += (h22(vec2(mod(floor(gT * 24.0), 997.0), 1.0)) - 0.5) * 0.006 * gChaos * gKick;\n    gRough = (vnoise(P * 520.0 + mod(floor(gT * 12.0), 500.0) * 7.13) - 0.5) * 2.2 * gPX * (0.5 + gChaos);\n\n    // new poster every 2 bars; the last beat flickers with the next one\n    float sid = floor(firstIn) + floor(seedIn) * 101.0;\n    if (!holdIn) {\n        sid += floor(gBeat / 8.0);\n        if (mod(gBeat, 8.0) > 7.0 && h11(s16 * 1.31) < 0.3 + 0.6 * gChaos) sid += 1.0;\n    }\n\n    bool split = false;                                           // horizontal tear bands\n    if (h11(s16 * 0.731 + 3.7) < gChaos * 0.5) {\n        float nb = floor(mix(5.0, 28.0, h11(s16 + 9.1)));\n        float band = floor(uv.y * nb);\n        float hb = h21(vec2(band, s16));\n        if (hb < 0.15 + 0.3 * gChaos) {\n            P.x += (h21(vec2(band, s16 + 1.0)) - 0.5) * 0.3 * gChaos;\n            if (hb < 0.1 * gChaos + 0.03) sid += floor(1.0 + h21(vec2(band, s16 + 2.0)) * 5.0);\n            split = hb > 0.12;\n        }\n    }\n\n    vec3 col = renderScene(P, sid);\n    if (split) col = mix(col, col.gbr, 0.7);                      // misprinted ink in the tears\n\n    float s8 = floor(gBeat * 2.0);                                // block inversions\n    for (int i = 0; i < 3; i++) {\n        float fi = float(i);\n        vec4 hb = vec4(h21(vec2(s8, fi)), h21(vec2(s8, fi + 0.5)), h21(vec2(s8, fi + 0.7)), h21(vec2(s8, fi + 0.9)));\n        if (hb.x < gChaos * 0.3) {\n            vec2 a = hb.yz * vec2(gW, 1.0) - 0.1;\n            vec2 sz = vec2(0.1 + 0.4 * hb.w, 0.015 + 0.09 * hb.y);\n            if (all(greaterThan(P, a)) && all(lessThan(P, a + sz))) col = 1.0 - col;\n        }\n    }\n    if (fract(gBeat / 4.0) < 0.035 && h11(floor(gBeat / 4.0) + 0.3) < gChaos * 0.5) col = 1.0 - col;   // downbeat strobe\n\n    // print finish: grain, paper mottle, fold creases, vignette\n    col += (h21(fragCoord + fract(gT * 13.7) * vec2(97.0, 53.0)) - 0.5) * 0.05;\n    col *= 0.93 + 0.07 * fbm(uv * vec2(gW, 1.0) * 5.0 + seedIn);\n    float cr = exp(-abs(uv.x - 0.5) * 500.0) + 0.7 * (exp(-abs(uv.y - 0.333) * 500.0) + exp(-abs(uv.y - 0.666) * 500.0));\n    col *= (1.0 - 0.07 * cr) * (1.0 + 0.015 * sign(uv.x - 0.5));\n    col *= 1.0 - 0.2 * pow(length(uv - 0.5) * 1.25, 2.5);\n    if (wall) {                                                   // dark wall + drop shadow\n        vec2 hw = vec2(gW * 0.5, 0.5);\n        vec3 wc = vec3(0.075, 0.07, 0.068) * (0.75 + 0.5 * vnoise(Q * 40.0)) * (1.0 - 0.5 * length(Q));\n        wc *= 1.0 - 0.55 * exp(-max(sdBox(P - hw - vec2(0.012, -0.018), hw), 0.0) * 40.0);\n        col = mix(wc, col, clamp(0.5 - sdBox(P - hw, hw) / gPX, 0.0, 1.0));\n    }\n    return clamp(col, 0.0, 1.0);\n}\n\nvoid main() {\n    vec3 c = rave(isf_FragNormCoord.xy * RENDERSIZE, RENDERSIZE, TIME, bpm, chaos, seed, kick, firstPoster, holdPoster, layoutLock);\n    gl_FragColor = vec4(c, 1.0);\n}\n",
    "generator": {
      "model": "Claude-Opus-5.5",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}