void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.y;

    vec2 board1Center = vec2(1.0 + 0.6 * sin(1.4*iTime), 0.5 + 0.5*cos(1.4*iTime));
    vec2 board2Center = vec2(1.2 + 0.5 * sin(2.2*iTime), 0.3 + 0.4*cos(2.2*iTime));

    float board1RingSize = 0.07;
    float board1PulseSpeed = 5.0f;
    float board2RingSize = 0.07;

    float intensity = 1.0 - mod(-board1PulseSpeed*iTime + distance(board1Center, uv)/board1RingSize, 1.0);
    float intensityXor = mod(-board1PulseSpeed*iTime + distance(board1Center, uv)/board1RingSize, 1.0);

    vec2 board2DistortUv = vec2(uv.x + 0.2*sin(iTime+3.0*uv.x), uv.y + 0.2*sin(1.1*iTime+2.0*uv.y));
    float xorPhase = floor(mod(distance(board2Center, board2DistortUv)/board2RingSize, 2.0));

    fragColor = vec4(intensity*xorPhase + intensityXor*(1.0-xorPhase), 0.8*intensity*xorPhase + intensityXor*(1.0-xorPhase), intensity*xorPhase + intensityXor*(1.0-xorPhase), 1.0 );

}


