
out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
bool test_half_b() {
    bool ok = true;
    mat2 m1 = mat2(1.0, 2.0, 3.0, 4.0);
    ok = ok && m1 == mat2(1.0, 2.0, 3.0, 4.0);
    mat2 m3 = m1;
    ok = ok && m3 == mat2(1.0, 2.0, 3.0, 4.0);
    mat2 m4 = mat2(6.0);
    ok = ok && m4 == mat2(6.0, 0.0, 0.0, 6.0);
    m3 *= m4;
    ok = ok && m3 == mat2(6.0, 12.0, 18.0, 24.0);
    mat2 m5 = mat2(m1[1].y);
    ok = ok && m5 == mat2(4.0, 0.0, 0.0, 4.0);
    m1 += m5;
    ok = ok && m1 == mat2(5.0, 2.0, 3.0, 8.0);
    mat2 m7 = mat2(5.0, 6.0, 7.0, 8.0);
    ok = ok && m7 == mat2(5.0, 6.0, 7.0, 8.0);
    mat3 m9 = mat3(9.0);
    ok = ok && m9 == mat3(9.0, 0.0, 0.0, 0.0, 9.0, 0.0, 0.0, 0.0, 9.0);
    mat4 m10 = mat4(11.0);
    ok = ok && m10 == mat4(11.0, 0.0, 0.0, 0.0, 0.0, 11.0, 0.0, 0.0, 0.0, 0.0, 11.0, 0.0, 0.0, 0.0, 0.0, 11.0);
    mat4 m11 = mat4(20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0);
    m11 -= m10;
    ok = ok && m11 == mat4(9.0, 20.0, 20.0, 20.0, 20.0, 9.0, 20.0, 20.0, 20.0, 20.0, 9.0, 20.0, 20.0, 20.0, 20.0, 9.0);
    return ok;
}
bool test_comma_b() {
    mat2 x;
    mat2 y;
    return ((x = mat2(1.0, 2.0, 3.0, 4.0), y = mat2(1.0, 2.0, 3.0, 4.0)), x == y);
}
vec4 main() {
    bool _0_ok = true;
    mat2 _1_m1 = mat2(1.0, 2.0, 3.0, 4.0);
    _0_ok = _0_ok && _1_m1 == mat2(1.0, 2.0, 3.0, 4.0);
    mat2 _2_m3 = _1_m1;
    _0_ok = _0_ok && _2_m3 == mat2(1.0, 2.0, 3.0, 4.0);
    const mat2 _3_m4 = mat2(6.0);
    _2_m3 *= _3_m4;
    _0_ok = _0_ok && _2_m3 == mat2(6.0, 12.0, 18.0, 24.0);
    mat2 _4_m5 = mat2(_1_m1[1].y);
    _0_ok = _0_ok && _4_m5 == mat2(4.0, 0.0, 0.0, 4.0);
    _1_m1 += _4_m5;
    _0_ok = _0_ok && _1_m1 == mat2(5.0, 2.0, 3.0, 8.0);
    const mat4 _7_m10 = mat4(11.0);
    mat4 _8_m11 = mat4(20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0);
    _8_m11 -= _7_m10;
    _0_ok = _0_ok && _8_m11 == mat4(9.0, 20.0, 20.0, 20.0, 20.0, 9.0, 20.0, 20.0, 20.0, 20.0, 9.0, 20.0, 20.0, 20.0, 20.0, 9.0);
    return (_0_ok && test_half_b()) && test_comma_b() ? colorGreen : colorRed;
}
