function constructSpiderWeb() {

    const spokes = 9;
    const spokeSamples = 75;
    const rings = 6;
    const curveSamples = 22;

    const spokePointCount = spokes * spokeSamples;
    const curvePointCount = spokes * rings * curveSamples;
    const totalPoints = spokePointCount + curvePointCount;

    setupGrid(1, totalPoints, 1);

    Runtime.metadata.title = "Funebra Curved Spider Web";
    Runtime.stateVisuals = false;
    Runtime.expressions.size = "3";
    Runtime.expressions.opacity = "1";
    Runtime.expressions.scale = "1";

    document.getElementById("state-visuals").checked = false;

    document.body.style.background = "#ffffff";
    document.getElementById("scene").style.background = "#ffffff";

    document.getElementById("scodeX").value = `
const S = 9;
const SP = 75;
const R = 6;
const CP = 22;
const spokeTotal = S * SP;

const innerRadius = 38;
const outerRadius = min(width, height) * 0.48;

function spokeAngle(s) {
    return -PI / 2
         + s / S * PI * 2
         + sin(s * 2.17) * 0.09;
}

function spokeLength(s) {
    return outerRadius *
        (0.82 + 0.16 * (0.5 + 0.5 * sin(s * 1.91)));
}

if (o < spokeTotal) {
    const s = floor(o / SP);
    const u = (o % SP) / (SP - 1);
    const angle = spokeAngle(s);
    const radius = innerRadius + u * (spokeLength(s) - innerRadius);

    return centerX + cos(angle) * radius;
}

const q = o - spokeTotal;
const ring = floor(q / (S * CP));
const segment = floor(q / CP) % S;
const u = (q % CP) / (CP - 1);

const s1 = segment;
const s2 = (segment + 1) % S;

let a1 = spokeAngle(s1);
let a2 = spokeAngle(s2);

if (s2 === 0) a2 += PI * 2;

const angle = a1 + (a2 - a1) * u;

const ringLevel = (ring + 1) / R;
const r1 = innerRadius +
    ringLevel * (spokeLength(s1) - innerRadius) * 0.82;
const r2 = innerRadius +
    ringLevel * (spokeLength(s2) - innerRadius) * 0.82;

const baseRadius = r1 + (r2 - r1) * u;
const sag = (16 + ring * 7) * sin(PI * u);
const radius = baseRadius - sag;

return centerX + cos(angle) * radius;
`;

    document.getElementById("scodeY").value = `
const S = 9;
const SP = 75;
const R = 6;
const CP = 22;
const spokeTotal = S * SP;

const innerRadius = 38;
const outerRadius = min(width, height) * 0.48;

function spokeAngle(s) {
    return -PI / 2
         + s / S * PI * 2
         + sin(s * 2.17) * 0.09;
}

function spokeLength(s) {
    return outerRadius *
        (0.82 + 0.16 * (0.5 + 0.5 * sin(s * 1.91)));
}

if (o < spokeTotal) {
    const s = floor(o / SP);
    const u = (o % SP) / (SP - 1);
    const angle = spokeAngle(s);
    const radius = innerRadius + u * (spokeLength(s) - innerRadius);

    return centerY + sin(angle) * radius;
}

const q = o - spokeTotal;
const ring = floor(q / (S * CP));
const segment = floor(q / CP) % S;
const u = (q % CP) / (CP - 1);

const s1 = segment;
const s2 = (segment + 1) % S;

let a1 = spokeAngle(s1);
let a2 = spokeAngle(s2);

if (s2 === 0) a2 += PI * 2;

const angle = a1 + (a2 - a1) * u;

const ringLevel = (ring + 1) / R;
const r1 = innerRadius +
    ringLevel * (spokeLength(s1) - innerRadius) * 0.82;
const r2 = innerRadius +
    ringLevel * (spokeLength(s2) - innerRadius) * 0.82;

const baseRadius = r1 + (r2 - r1) * u;
const sag = (16 + ring * 7) * sin(PI * u);
const radius = baseRadius - sag;

return centerY + sin(angle) * radius;
`;

    document.getElementById("scodeZ").value = "0";
    document.getElementById("itext").value = '"•"';
    document.getElementById("clor").value = '"#111111"';

    ActiveProgram.markDirty();
    Runtime.geometryDirty = true;
    updateSceneFromEditor();
    updateMetadataDisplay();
}

constructSpiderWeb();