Problem: You're given the centers of three equal sides of a strictly convex tetragon. Your task is to restore the initial tetragon.

Input

The first input line contains one number T — amount of tests (1 ≤ T ≤ 5·104). Each of the following T lines contains numbers x1, y1, x2, y2, x3, y3 — coordinates of different points that are the centers of three equal sides (non-negative integer numbers, not exceeding 10).

Output

For each test output two lines. If the required tetragon exists, output in the first line YES, in the second line — four pairs of numbers — coordinates of the polygon's vertices in clockwise or counter-clockwise order. Don't forget, please, that the tetragon should be strictly convex, i.e. no 3 of its points lie on one line. Output numbers with 9 characters after a decimal point.

If the required tetragon doen't exist, output NO in the first line, and leave the second line empty.

Examples

Input

3
1 1 2 2 3 3
0 1 1 0 2 2
9 3 7 9 9 8


Output

NO

YES
3.5 1.5 0.5 2.5 -0.5 -0.5 2.5 0.5
NO

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
const double EPS = 1e-6;
struct Point {
  double x, y;
  Point() {}
  Point(double _x, double _y) : x(_x), y(_y) {}
  Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }
  Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
  Point operator/(const double &b) const { return Point(x / b, y / b); }
  Point operator*(const double &b) const { return Point(x * b, y * b); }
  double det(const Point &b) const { return x * b.y - b.x * y; }
  double dot(const Point &b) const { return x * b.x + y * b.y; }
  void scan() { scanf("%lf %lf", &x, &y); }
  void print() { printf("%.9lf %.9lf", x, y); }
  Point rot() const { return Point(-y, x); }
  double len() const { return sqrt(x * x + y * y); }
};
struct Line {
  Point base, dir;
  Line() {}
  Line(const Point &_base, const Point &_dir) : base(_base), dir(_dir) {}
};
Line get_mid(Point a, Point b) {
  Point base = (a + b) / 2;
  return Line(base, (a - b).rot());
}
Point p[6];
bool check() {
  for (int i = 0; i < 4; i++)
    for (int j = i + 1; j < 4; j++)
      for (int k = j + 1; k < 4; k++)
        if (fabs((p[i] - p[j]).det(p[i] - p[k])) < EPS) return false;
  p[4] = p[0];
  p[5] = p[1];
  int cnt[2] = {0, 0};
  for (int i = 0; i < 4; i++)
    cnt[(p[i + 2] - p[i + 1]).det(p[i + 1] - p[i]) > 0]++;
  return cnt[0] == 0 || cnt[0] == 4;
}
bool get_ans(Point a, Point b, Point c) {
  Line l0 = get_mid(a, b), l1 = get_mid(c, a);
  Point q = a * 2 - l0.base - l1.base;
  double k0 = l0.dir.det(l1.dir);
  double k1 = l1.dir.det(l0.dir);
  if (fabs(k0) < EPS || fabs(k1) < EPS) return false;
  double t0 = q.det(l1.dir) / k0;
  double t1 = q.det(l0.dir) / k1;
  p[0] = l0.dir * t0 + l0.base;
  p[1] = l1.dir * t1 + l1.base;
  p[3] = p[0] + (b - p[0]) * 2;
  p[2] = p[1] + (c - p[1]) * 2;
  return check();
}
int main() {
  Point a, b, c;
  int kase;
  scanf("%d", &kase);
  for (int i = 0; i < kase; i++) {
    a.scan();
    b.scan();
    c.scan();
    bool succ = false;
    if (get_ans(a, b, c))
      succ = true;
    else if (get_ans(b, a, c))
      succ = true;
    else if (get_ans(c, a, b))
      succ = true;
    if (succ) {
      puts("YES");
      for (int j = 0; j < 4; j++) {
        if (j) printf(" ");
        p[j].print();
      }
      puts("");
    } else
      puts("NO\n");
  }
  return 0;
}