diagnostic(off, derivative_uniformity);
diagnostic(off, chromium.unreachable_code);
enable f16;
struct _GlobalUniforms {
  colorRed: vec4<f16>,
  colorGreen: vec4<f16>,
};
@group(0) @binding(0) var<uniform> _globalUniforms : _GlobalUniforms;
const kZero: i32 = 0;
fn return_loop_ii(five: i32) -> i32 {
  {
    {
      var i: i32 = kZero;
      for (; i < 10; i = i + i32(1)) {
        {
          if i == five {
            {
              return i;
            }
          }
        }
      }
    }
    return 0;
  }
}
const kTen: i32 = 10;
fn continue_loop_ii(five: i32) -> i32 {
  {
    var sum: i32 = 0;
    {
      var i: i32 = 0;
      for (; i < kTen; i = i + i32(1)) {
        {
          if i < five {
            {
              continue;
            }
          }
          sum = sum + i;
        }
      }
    }
    return sum;
  }
}
fn break_loop_ii(five: i32) -> i32 {
  {
    var sum: i32 = 0;
    const kOne: i32 = 1;
    {
      var i: i32 = 0;
      for (; i < 10; i = i + kOne) {
        {
          if i > five {
            {
              break;
            }
          }
          sum = sum + i;
        }
      }
    }
    return sum;
  }
}
fn loop_operator_le_b() -> bool {
  {
    var result: vec4<i32> = vec4<i32>(8);
    {
      var i: i32 = 0;
      for (; i <= 0; i = i + i32(1)) {
        {
          result = result + vec4<i32>(1);
        }
      }
    }
    {
      var i: i32 = 1;
      for (; i <= 3; i = i + i32(1)) {
        {
          result = vec4<i32>(result.yzw, i);
        }
      }
    }
    return all(result == vec4<i32>(9, 1, 2, 3));
  }
}
fn loop_operator_lt_b() -> bool {
  {
    var result: vec4<i32> = vec4<i32>(8);
    {
      var i: i32 = 0;
      for (; i < 1; i = i + i32(1)) {
        {
          result = result + vec4<i32>(1);
        }
      }
    }
    {
      var i: i32 = 1;
      for (; i < 4; i = i + i32(1)) {
        {
          result = vec4<i32>(result.yzw, i);
        }
      }
    }
    return all(result == vec4<i32>(9, 1, 2, 3));
  }
}
fn loop_operator_ge_b() -> bool {
  {
    var result: vec4<i32> = vec4<i32>(8);
    {
      var i: i32 = 0;
      for (; i >= 0; i = i - i32(1)) {
        {
          result = result + vec4<i32>(1);
        }
      }
    }
    {
      var i: i32 = 3;
      for (; i >= 1; i = i - i32(1)) {
        {
          result = vec4<i32>(result.yzw, i);
        }
      }
    }
    return all(result == vec4<i32>(9, 3, 2, 1));
  }
}
fn loop_operator_gt_b() -> bool {
  {
    var result: vec4<i32> = vec4<i32>(8);
    {
      var i: i32 = 1;
      for (; i > 0; i = i - i32(1)) {
        {
          result = result + vec4<i32>(1);
        }
      }
    }
    {
      var i: i32 = 3;
      for (; i > 0; i = i - i32(1)) {
        {
          result = vec4<i32>(result.yzw, i);
        }
      }
    }
    return all(result == vec4<i32>(9, 3, 2, 1));
  }
}
fn loop_operator_ne_b() -> bool {
  {
    var result: vec4<i32> = vec4<i32>(8);
    {
      var i: i32 = 1;
      for (; i != 2; i = i + i32(1)) {
        {
          result = result + vec4<i32>(1);
        }
      }
    }
    {
      var i: i32 = 1;
      for (; i != 4; i = i + i32(1)) {
        {
          result = vec4<i32>(result.yzw, i);
        }
      }
    }
    return all(result == vec4<i32>(9, 1, 2, 3));
  }
}
fn loop_operator_eq_b() -> bool {
  {
    var result: vec4<i32> = vec4<i32>(9);
    {
      var i: i32 = 1;
      for (; i == 1; i = i + i32(1)) {
        {
          result = vec4<i32>(result.yzw, i);
        }
      }
    }
    return all(result == vec4<i32>(9, 9, 9, 1));
  }
}
fn _skslMain(pos: vec2<f32>) -> vec4<f16> {
  {
    let five: i32 = i32(clamp(pos.x, f32(_globalUniforms.colorGreen.y), f32(_globalUniforms.colorGreen.w))) * 5;
    var _skTemp0: vec4<f16>;
    var _skTemp1: bool;
    var _skTemp2: bool;
    var _skTemp3: bool;
    var _skTemp4: bool;
    var _skTemp5: bool;
    var _skTemp6: bool;
    var _skTemp7: bool;
    var _skTemp8: bool;
    if return_loop_ii(five) == 5 {
      _skTemp8 = (continue_loop_ii(five) == 35);
    } else {
      _skTemp8 = false;
    }
    if _skTemp8 {
      _skTemp7 = (break_loop_ii(5) == 15);
    } else {
      _skTemp7 = false;
    }
    if _skTemp7 {
      _skTemp6 = loop_operator_le_b();
    } else {
      _skTemp6 = false;
    }
    if _skTemp6 {
      _skTemp5 = loop_operator_lt_b();
    } else {
      _skTemp5 = false;
    }
    if _skTemp5 {
      _skTemp4 = loop_operator_ge_b();
    } else {
      _skTemp4 = false;
    }
    if _skTemp4 {
      _skTemp3 = loop_operator_gt_b();
    } else {
      _skTemp3 = false;
    }
    if _skTemp3 {
      _skTemp2 = loop_operator_eq_b();
    } else {
      _skTemp2 = false;
    }
    if _skTemp2 {
      _skTemp1 = loop_operator_ne_b();
    } else {
      _skTemp1 = false;
    }
    if _skTemp1 {
      _skTemp0 = _globalUniforms.colorGreen;
    } else {
      _skTemp0 = _globalUniforms.colorRed;
    }
    return _skTemp0;
  }
}
@fragment fn main(@location(0) _coords: vec2<f32>) -> @location(0) vec4<f16> {
  return _skslMain(_coords);
}
