Browse Source

kdtree intersection calculation and visualization

Kajetan Johannes Hammerle 9 months ago
parent
commit
1a4aaf2763

+ 78 - 9
client/Game.cpp

@@ -1,5 +1,6 @@
 #include <cmath>
 #include <vector>
+#include <fstream>
 
 #include "client/Game.h"
 #include "client/utils/Utils.h"
@@ -7,9 +8,30 @@
 #include "common/utils/String.h"
 #include "common/utils/Random.h"
 #include "math/Quaternion.h"
+#include "rendering/wrapper/GLWrapper.h"
+
+static float readFloat(std::ifstream& in) {
+    float f;
+    in >> f;
+    in.get();
+    return f;
+}
+
+static Vector3 readVector3(std::ifstream& in) {
+    float x = readFloat(in);
+    float y = readFloat(in);
+    float z = readFloat(in);
+    return Vector3(x, y, z);
+}
+
+static Vector2 readVector2(std::ifstream& in) {
+    float x = readFloat(in);
+    float y = readFloat(in);
+    return Vector2(x, y);
+}
 
 Game::Game(const Control& control, const Clock& fps, const Clock& tps, RenderSettings& renderSettings,
-        const WindowSize& size) :
+        const WindowSize& size, const char* file) :
 control(control), fps(fps), tps(tps), renderSettings(renderSettings), size(size), world(blockRegistry),
 worldRenderer(world), pointIndex(0), moveSpeed(0.125f), movedLength(0.0f), mode(Mode::AUTO) {
     Random r(0);
@@ -36,20 +58,45 @@ worldRenderer(world), pointIndex(0), moveSpeed(0.125f), movedLength(0.0f), mode(
     updateDistances();
 
     std::vector<KDTree::Triangle> data;
+
+    (void) readFloat;
+
+    std::ifstream in;
+    in.open(file);
+    if(in.good()) {
+        while(true) {
+            Vector3 a = readVector3(in);
+            Vector2 ta = readVector2(in);
+
+            Vector3 b = readVector3(in);
+            Vector2 tb = readVector2(in);
+
+            Vector3 c = readVector3(in);
+            Vector2 tc = readVector2(in);
+
+            if(in.eof()) {
+                break;
+            }
+
+            data.push_back(KDTree::Triangle(a, b, c));
+            treeData.add(Triangle(Vertex(a, ta), Vertex(b, tb), Vertex(c, tc)));
+        }
+    }
+
     //generateSphere(data);
-    generateRandom(data);
+    //generateRandom(data);
 
-    for(KDTree::Triangle& t : data) {
+    /*for(KDTree::Triangle& t : data) {
         treeData.add(Triangle(
                 Vertex(t[0], Vector2(8.0f / 16.0f, 0.0f)),
                 Vertex(t[1], Vector2(9.0f / 16.0f, 0.0f)),
                 Vertex(t[2], Vector2(9.0f / 16.0f, 1.0f / 16.0f))
                 ));
-    }
+    }*/
     treeData.build();
 
     kdTree.build(data);
-    kdTree.fillLines(lines, data);
+    kdTree.fillLines(lines);
 }
 
 void Game::tick() {
@@ -158,18 +205,36 @@ void Game::tick() {
 
         float x = (control.buttons.getX() - hWidth) / hWidth;
         float y = -(control.buttons.getY() - hHeight) / hHeight;
-        
+
         float aspect = hWidth / hHeight;
         float tan = tanf((0.5f * 60.0f) * M_PI / 180.0f);
         float q = 1.0f / tan;
-        
+
         Vector3 direction(x / (q / aspect), y / q, 1.0f);
         direction.normalize();
         direction = m * direction;
 
         clickLine.clear();
         clickLine.add(pos, pos + direction * 100.0f, 0xFF00FF);
+
+        if(kdTree.findIntersection(pos, direction)) {
+            KDTree::Triangle t = kdTree.getIntersectedTriangle();
+
+            clickLine.add(t[0], t[1], 0xFFFF00);
+            clickLine.add(t[1], t[2], 0xFFFF00);
+            clickLine.add(t[2], t[0], 0xFFFF00);
+
+            Vector3 hit = kdTree.getIntersection();
+            float diff = 0.2f;
+
+            clickLine.add(hit - Vector3(diff, 0.0f, 0.0f), hit + Vector3(diff, 0.0f, 0.0f), 0x00FF00);
+            clickLine.add(hit - Vector3(0.0f, diff, 0.0f), hit + Vector3(0.0f, diff, 0.0f), 0x00FF00);
+            clickLine.add(hit - Vector3(0.0f, 0.0f, diff), hit + Vector3(0.0f, 0.0f, diff), 0x00FF00);
+        }
+
         clickLine.build();
+
+        kdTree.fillLines(lines);
     }
 }
 
@@ -203,7 +268,11 @@ void Game::renderWorldLines(float lag, Renderer& renderer) const {
     (void) lag;
     renderer.translateTo(0.0f, 0.0f, 0.0f);
     renderer.update();
-    lines.draw();
+    if(control.keys.kdTree.isDown()) {
+        GLWrapper::setLineThickness(1.0f);
+        lines.draw();
+    }
+    GLWrapper::setLineThickness(5.0f);
     clickLine.draw();
 }
 
@@ -346,7 +415,7 @@ void Game::generateRandom(std::vector<KDTree::Triangle>& data) {
     float radius = 25.0f;
     float diff = 5.0f;
     Random r(0);
-    for(int i = 0; i < 7; i++) {
+    for(int i = 0; i < 10000; i++) {
         Vector3 a(r.nextFloat() * radius, r.nextFloat() * radius, r.nextFloat() * radius);
         Vector3 b = a + Vector3(r.nextFloat() * diff, r.nextFloat() * diff, r.nextFloat() * diff);
         Vector3 c = a + Vector3(r.nextFloat() * diff, r.nextFloat() * diff, r.nextFloat() * diff);

+ 1 - 1
client/Game.h

@@ -18,7 +18,7 @@
 class Game final {
 public:
     Game(const Control& control, const Clock& fps, const Clock& tps, RenderSettings& renderSettings,
-            const WindowSize& size);
+            const WindowSize& size, const char* file);
 
     void tick();
     void renderWorld(float lag, Renderer& renderer) const;

+ 3 - 3
client/Main.cpp

@@ -50,8 +50,8 @@ void initCallbacks(Window& w, WindowSize& size, Framebuffers& framebuffers, Cont
     });
 }
 
-int main() {
-    if(GLFWWrapper::hasError()) {
+int main(int argAmount, const char** args) {
+    if(argAmount < 2 || GLFWWrapper::hasError()) {
         return 0;
     }
 
@@ -77,7 +77,7 @@ int main() {
     Control control;
     Clock fps;
     Clock tps;
-    static Game game(control, fps, tps, renderSettings, size);
+    static Game game(control, fps, tps, renderSettings, size, args[1]);
 
     initCallbacks(window, size, framebuffers, control);
     window.show();

+ 2 - 1
client/input/Keys.cpp

@@ -25,7 +25,7 @@ std::ostream& operator<<(std::ostream& os, const Keys::Key& k) {
 
 Keys::Keys() : left(keys[0]), right(keys[1]), up(keys[2]), down(keys[3]), jump(keys[4]), sneak(keys[5]),
 camLeft(keys[6]), camRight(keys[7]), camUp(keys[8]), camDown(keys[9]), test(keys[10]), test2(keys[11]), test3(keys[12]),
-test4(keys[13]), test5(keys[14]), test6(keys[15]), factor(keys[16]) {
+test4(keys[13]), test5(keys[14]), test6(keys[15]), factor(keys[16]), kdTree(keys[17]) {
     keys[0].glfwKey = GLFW_KEY_A;
     keys[1].glfwKey = GLFW_KEY_D;
     keys[2].glfwKey = GLFW_KEY_W;
@@ -43,6 +43,7 @@ test4(keys[13]), test5(keys[14]), test6(keys[15]), factor(keys[16]) {
     keys[14].glfwKey = GLFW_KEY_H;
     keys[15].glfwKey = GLFW_KEY_U;
     keys[16].glfwKey = GLFW_KEY_F;
+    keys[17].glfwKey = GLFW_KEY_K;
 }
 
 void Keys::release(int key) {

+ 2 - 1
client/input/Keys.h

@@ -31,7 +31,7 @@ public:
     };
 
 private:
-    Key keys[17];
+    Key keys[18];
 
 public:
     Keys();
@@ -52,6 +52,7 @@ public:
     const Key& test5;
     const Key& test6;
     const Key& factor;
+    const Key& kdTree;
 
     void release(int key);
     void press(int key);

+ 1 - 1
client/math/Plane.cpp

@@ -8,7 +8,7 @@ void Plane::set(const Vector3& va, const Vector3& vb, const Vector3& vc) {
     Vector3 h2 = vc - va;
     abc = h1.cross(h2);
     abc.normalize();
-    d = -h1.dot(va);
+    d = -abc.dot(va);
 }
 
 float Plane::getSignedDistance(const Vector3& v) const {

+ 24 - 0
client/rendering/Mesh.cpp

@@ -1,3 +1,5 @@
+#include <fstream>
+
 #include "client/rendering/Mesh.h"
 
 Mesh::Mesh() {
@@ -24,4 +26,26 @@ void Mesh::build() {
 void Mesh::draw() const {
     vertexBuffer.bindArray();
     vertexBuffer.draw(buffer.getLength() * 3);
+}
+
+void Mesh::save() {
+    std::ofstream out;
+    out.open("scene");
+    for(Triangle& t : buffer) {
+        out << t.a.position[0] << ", ";
+        out << t.a.position[1] << ", ";
+        out << t.a.position[2] << ", ";
+        out << t.a.texture[0] << ", ";
+        out << t.a.texture[1] << "\n";
+        out << t.b.position[0] << ", ";
+        out << t.b.position[1] << ", ";
+        out << t.b.position[2] << ", ";
+        out << t.b.texture[0] << ", ";
+        out << t.b.texture[1] << "\n";
+        out << t.c.position[0] << ", ";
+        out << t.c.position[1] << ", ";
+        out << t.c.position[2] << ", ";
+        out << t.c.texture[0] << ", ";
+        out << t.c.texture[1] << "\n";
+    }
 }

+ 1 - 0
client/rendering/Mesh.h

@@ -14,6 +14,7 @@ public:
     void clear();
     void build();
     void draw() const;
+    void save();
 
 private:
     VertexBuffer vertexBuffer;

+ 1 - 1
client/rendering/Triangle.h

@@ -7,7 +7,7 @@ struct Triangle final {
     Triangle();
     Triangle(const Vertex& a, const Vertex& b, const Vertex& c);
 
-private:
+//private:
     Vertex a;
     Vector3 normalA;
     Vector3 tangentA;

+ 4 - 0
client/rendering/wrapper/GLWrapper.cpp

@@ -56,4 +56,8 @@ void GLWrapper::enableBlending() {
 
 void GLWrapper::disableBlending() {
     glDisable(GL_BLEND);
+}
+
+void GLWrapper::setLineThickness(float f) {
+    glLineWidth(f);
 }

+ 1 - 0
client/rendering/wrapper/GLWrapper.h

@@ -8,6 +8,7 @@ namespace GLWrapper {
     void prepareMainFramebuffer();
     void enableBlending();
     void disableBlending();
+    void setLineThickness(float f);
 }
 
 #endif

+ 182 - 65
common/utils/KDTree.cpp

@@ -22,10 +22,9 @@ const Vector3& KDTree::Triangle::getMid() const {
     return mid;
 }
 
-KDTree::Node::Node() : splitDim(0), splitValue(0.0f), lessEqual(nullptr), greater(nullptr) {
-}
-
-KDTree::KDTree() {
+KDTree::Node::Node() : splitDim(0), splitValue(0.0f), color(0xFFFFFF) {
+    childs[0] = nullptr;
+    childs[1] = nullptr;
 }
 
 KDTree::~KDTree() {
@@ -33,17 +32,28 @@ KDTree::~KDTree() {
 }
 
 void KDTree::clean(Node* n) {
-    if(n->lessEqual != nullptr) {
-        clean(n->lessEqual);
+    if(n->childs[0] != nullptr) {
+        clean(n->childs[0]);
     }
-    if(n->greater != nullptr) {
-        clean(n->greater);
+    if(n->childs[1] != nullptr) {
+        clean(n->childs[1]);
     }
-    delete n->lessEqual;
-    delete n->greater;
+    delete n->childs[0];
+    delete n->childs[1];
 }
 
 void KDTree::build(std::vector<KDTree::Triangle>& data) {
+    if(data.size() == 0) {
+        return;
+    }
+    min = data[0][0];
+    max = data[0][0];
+    for(const Triangle& t : data) {
+        for(const Vector3& v : t.data()) {
+            min.set(std::min(min[0], v[0]), std::min(min[1], v[1]), std::min(min[2], v[2]));
+            max.set(std::max(max[0], v[0]), std::max(max[1], v[1]), std::max(max[2], v[2]));
+        }
+    }
     build(&root, data);
 }
 
@@ -117,88 +127,195 @@ void KDTree::build(Node* n, std::vector<KDTree::Triangle>& data) {
     }
     // recursive calls
     if(lessEqualData.size() > 0) {
-        n->lessEqual = new Node();
-        build(n->lessEqual, lessEqualData);
+        n->childs[0] = new Node();
+        build(n->childs[0], lessEqualData);
     }
     if(greaterData.size() > 0) {
-        n->greater = new Node();
-        build(n->greater, greaterData);
+        n->childs[1] = new Node();
+        build(n->childs[1], greaterData);
     }
 }
 
-void KDTree::fillLines(Lines& lines, const std::vector<KDTree::Triangle>& data) {
-    if(data.size() == 0) {
-        return;
-    }
-    Vector3 min = data[0][0];
-    Vector3 max = data[0][0];
-    for(const Triangle& t : data) {
-        for(const Vector3& v : t.data()) {
-            min.set(std::min(min[0], v[0]), std::min(min[1], v[1]), std::min(min[2], v[2]));
-            max.set(std::max(max[0], v[0]), std::max(max[1], v[1]), std::max(max[2], v[2]));
-        }
-    }
-
-    lines.add(Vector3(min[0], min[1], min[2]), Vector3(max[0], min[1], min[2]), 0xFFFFFF);
-    lines.add(Vector3(min[0], min[1], min[2]), Vector3(min[0], min[1], max[2]), 0xFFFFFF);
-    lines.add(Vector3(max[0], min[1], min[2]), Vector3(max[0], min[1], max[2]), 0xFFFFFF);
-    lines.add(Vector3(min[0], min[1], max[2]), Vector3(max[0], min[1], max[2]), 0xFFFFFF);
+void KDTree::fillLines(Lines& lines) const {
+    lines.clear();
+    lines.add(Vector3(min[0], min[1], min[2]), Vector3(max[0], min[1], min[2]), root.color);
+    lines.add(Vector3(min[0], min[1], min[2]), Vector3(min[0], min[1], max[2]), root.color);
+    lines.add(Vector3(max[0], min[1], min[2]), Vector3(max[0], min[1], max[2]), root.color);
+    lines.add(Vector3(min[0], min[1], max[2]), Vector3(max[0], min[1], max[2]), root.color);
 
-    lines.add(Vector3(min[0], min[1], min[2]), Vector3(min[0], max[1], min[2]), 0xFFFFFF);
-    lines.add(Vector3(max[0], min[1], min[2]), Vector3(max[0], max[1], min[2]), 0xFFFFFF);
-    lines.add(Vector3(min[0], min[1], max[2]), Vector3(min[0], max[1], max[2]), 0xFFFFFF);
-    lines.add(Vector3(max[0], min[1], max[2]), Vector3(max[0], max[1], max[2]), 0xFFFFFF);
+    lines.add(Vector3(min[0], min[1], min[2]), Vector3(min[0], max[1], min[2]), root.color);
+    lines.add(Vector3(max[0], min[1], min[2]), Vector3(max[0], max[1], min[2]), root.color);
+    lines.add(Vector3(min[0], min[1], max[2]), Vector3(min[0], max[1], max[2]), root.color);
+    lines.add(Vector3(max[0], min[1], max[2]), Vector3(max[0], max[1], max[2]), root.color);
 
-    lines.add(Vector3(min[0], max[1], min[2]), Vector3(max[0], max[1], min[2]), 0xFFFFFF);
-    lines.add(Vector3(min[0], max[1], min[2]), Vector3(min[0], max[1], max[2]), 0xFFFFFF);
-    lines.add(Vector3(max[0], max[1], min[2]), Vector3(max[0], max[1], max[2]), 0xFFFFFF);
-    lines.add(Vector3(min[0], max[1], max[2]), Vector3(max[0], max[1], max[2]), 0xFFFFFF);
+    lines.add(Vector3(min[0], max[1], min[2]), Vector3(max[0], max[1], min[2]), root.color);
+    lines.add(Vector3(min[0], max[1], min[2]), Vector3(min[0], max[1], max[2]), root.color);
+    lines.add(Vector3(max[0], max[1], min[2]), Vector3(max[0], max[1], max[2]), root.color);
+    lines.add(Vector3(min[0], max[1], max[2]), Vector3(max[0], max[1], max[2]), root.color);
 
     fillLines(lines, &root, min, max);
 
     lines.build();
 }
 
-void KDTree::fillLines(Lines& lines, Node* n, const Vector3& min, const Vector3& max) {
-    if(n->lessEqual == nullptr && n->greater == nullptr) {
+void KDTree::fillLines(Lines& lines, const Node* n, const Vector3& min, const Vector3& max) const {
+    if(n->childs[0] == nullptr && n->childs[1] == nullptr) {
         return;
     }
     switch(n->splitDim) {
         case 0:
-            lines.add(Vector3(n->splitValue, min[1], min[2]), Vector3(n->splitValue, max[1], min[2]), 0xFFFFFF);
-            lines.add(Vector3(n->splitValue, max[1], min[2]), Vector3(n->splitValue, max[1], max[2]), 0xFFFFFF);
-            lines.add(Vector3(n->splitValue, max[1], max[2]), Vector3(n->splitValue, min[1], max[2]), 0xFFFFFF);
-            lines.add(Vector3(n->splitValue, min[1], max[2]), Vector3(n->splitValue, min[1], min[2]), 0xFFFFFF);
-            if(n->lessEqual != nullptr) {
-                fillLines(lines, n->lessEqual, min, Vector3(n->splitValue, max[1], max[2]));
+            lines.add(Vector3(n->splitValue, min[1], min[2]), Vector3(n->splitValue, max[1], min[2]), n->color);
+            lines.add(Vector3(n->splitValue, max[1], min[2]), Vector3(n->splitValue, max[1], max[2]), n->color);
+            lines.add(Vector3(n->splitValue, max[1], max[2]), Vector3(n->splitValue, min[1], max[2]), n->color);
+            lines.add(Vector3(n->splitValue, min[1], max[2]), Vector3(n->splitValue, min[1], min[2]), n->color);
+            if(n->childs[0] != nullptr) {
+                fillLines(lines, n->childs[0], min, Vector3(n->splitValue, max[1], max[2]));
             }
-            if(n->greater != nullptr) {
-                fillLines(lines, n->greater, Vector3(n->splitValue, min[1], min[2]), max);
+            if(n->childs[1] != nullptr) {
+                fillLines(lines, n->childs[1], Vector3(n->splitValue, min[1], min[2]), max);
             }
             break;
         case 1:
-            lines.add(Vector3(min[0], n->splitValue, min[2]), Vector3(max[0], n->splitValue, min[2]), 0xFFFFFF);
-            lines.add(Vector3(min[0], n->splitValue, min[2]), Vector3(min[0], n->splitValue, max[2]), 0xFFFFFF);
-            lines.add(Vector3(max[0], n->splitValue, min[2]), Vector3(max[0], n->splitValue, max[2]), 0xFFFFFF);
-            lines.add(Vector3(min[0], n->splitValue, max[2]), Vector3(max[0], n->splitValue, max[2]), 0xFFFFFF);
-            if(n->lessEqual != nullptr) {
-                fillLines(lines, n->lessEqual, min, Vector3(max[0], n->splitValue, max[2]));
+            lines.add(Vector3(min[0], n->splitValue, min[2]), Vector3(max[0], n->splitValue, min[2]), n->color);
+            lines.add(Vector3(min[0], n->splitValue, min[2]), Vector3(min[0], n->splitValue, max[2]), n->color);
+            lines.add(Vector3(max[0], n->splitValue, min[2]), Vector3(max[0], n->splitValue, max[2]), n->color);
+            lines.add(Vector3(min[0], n->splitValue, max[2]), Vector3(max[0], n->splitValue, max[2]), n->color);
+            if(n->childs[0] != nullptr) {
+                fillLines(lines, n->childs[0], min, Vector3(max[0], n->splitValue, max[2]));
             }
-            if(n->greater != nullptr) {
-                fillLines(lines, n->greater, Vector3(min[0], n->splitValue, min[2]), max);
+            if(n->childs[1] != nullptr) {
+                fillLines(lines, n->childs[1], Vector3(min[0], n->splitValue, min[2]), max);
             }
             break;
         case 2:
-            lines.add(Vector3(min[0], min[1], n->splitValue), Vector3(min[0], max[1], n->splitValue), 0xFFFFFF);
-            lines.add(Vector3(min[0], max[1], n->splitValue), Vector3(max[0], max[1], n->splitValue), 0xFFFFFF);
-            lines.add(Vector3(max[0], max[1], n->splitValue), Vector3(max[0], min[1], n->splitValue), 0xFFFFFF);
-            lines.add(Vector3(max[0], min[1], n->splitValue), Vector3(min[0], min[1], n->splitValue), 0xFFFFFF);
-            if(n->lessEqual != nullptr) {
-                fillLines(lines, n->lessEqual, min, Vector3(max[0], max[1], n->splitValue));
+            lines.add(Vector3(min[0], min[1], n->splitValue), Vector3(min[0], max[1], n->splitValue), n->color);
+            lines.add(Vector3(min[0], max[1], n->splitValue), Vector3(max[0], max[1], n->splitValue), n->color);
+            lines.add(Vector3(max[0], max[1], n->splitValue), Vector3(max[0], min[1], n->splitValue), n->color);
+            lines.add(Vector3(max[0], min[1], n->splitValue), Vector3(min[0], min[1], n->splitValue), n->color);
+            if(n->childs[0] != nullptr) {
+                fillLines(lines, n->childs[0], min, Vector3(max[0], max[1], n->splitValue));
             }
-            if(n->greater != nullptr) {
-                fillLines(lines, n->greater, Vector3(min[0], min[1], n->splitValue), max);
+            if(n->childs[1] != nullptr) {
+                fillLines(lines, n->childs[1], Vector3(min[0], min[1], n->splitValue), max);
             }
             break;
     }
+}
+
+void KDTree::cleanVisited(Node* n) {
+    if(n->childs[0] != nullptr) {
+        cleanVisited(n->childs[0]);
+    }
+    if(n->childs[1] != nullptr) {
+        cleanVisited(n->childs[1]);
+    }
+    n->color = 0xFFFFFF;
+}
+
+bool KDTree::findIntersection(const Vector3& pos, const Vector3& direction) {
+    minDistance = 9999999.0f;
+    original = pos;
+    cleanVisited(&root);
+
+    float t = 0.0f;
+    for(int i = 0; i < 3; i++) {
+        if(direction[i] == 0.0f) {
+            continue;
+        }
+        t = std::max(t, std::abs((min[i] - pos[i]) / direction[i]));
+        t = std::max(t, std::abs((max[i] - pos[i]) / direction[i]));
+    }
+    
+    return findIntersection(&root, pos, direction, t);
+}
+
+Vector3 KDTree::getIntersection() const {
+    return intersection;
+}
+
+KDTree::Triangle KDTree::getIntersectedTriangle() const {
+    return intersectionTriangle;
+}
+
+bool KDTree::findIntersection(Node* n, const Vector3& pos, const Vector3& direction, float tMax) {
+    if(n == nullptr) {
+        return false;
+    }
+    n->color = 0x00FFFF;
+    int dim = n->splitDim;
+    // lessEqual = 0
+    // greater = 1
+    bool r = false;
+    bool first = pos[dim] > n->splitValue;
+    if(direction[dim] == 0.0f) {
+        r = findIntersection(n->childs[first], pos, direction, tMax);
+    } else {
+        float t = (n->splitValue - pos[dim]) / direction[dim];
+        if(t >= 0.0f && t < tMax) {
+            r = findIntersection(n->childs[first], pos, direction, t);
+            r = findIntersection(n->childs[!first], pos + t * direction, direction, tMax - t) || r;
+        } else {
+            r = findIntersection(n->childs[first], pos, direction, tMax);
+        }
+    }
+
+    for(KDTree::Triangle& tri : n->data) {
+        float t = testIntersection(pos, direction, tri);
+        if(t < 0.0f) {
+            continue;
+        }
+        Vector3 i = pos + t * direction;
+        float distance = static_cast<Vector3> (original - i).squareLength();
+        if(distance > minDistance) {
+            continue;
+        }
+        intersectionTriangle = tri;
+        intersection = i;
+        minDistance = distance;
+        r = true;
+    }
+    return r;
+}
+
+float KDTree::orient(const Vector3& a, const Vector3& b, const Vector3& c, const Vector3& d) const {
+    return static_cast<Vector3> (a - d).dot(static_cast<Vector3> (b - d).cross(c - d));
+}
+
+float KDTree::testIntersection(const Vector3& pos, const Vector3& direction, const KDTree::Triangle& t) const {
+    const float eps = 0.0001f;
+    Vector3 h1 = t[1] - t[0];
+    Vector3 h2 = t[2] - t[0];
+    Vector3 abc = h1.cross(h2);
+    abc.normalize();
+    float d = -abc.dot(t[0]);
+
+    float check = abc.dot(direction);
+    if(std::abs(check) < eps) {
+        return -1.0f;
+    }
+    float factor = -(abc.dot(pos) + d) / check;
+    Vector3 inter = pos + factor * direction;
+
+    int sideA = 0;
+    int sideB = 0;
+
+    for(int i = 0; i < 3; i++) {
+        const Vector3& a = t[i];
+        const Vector3& b = t[(i + 1) % 3];
+        const Vector3 c = t[i] + abc;
+        float o = orient(a, b, c, inter);
+        if(o < -eps) {
+            sideA++;
+        } else if(o > eps) {
+            sideB++;
+        } else {
+            sideA++;
+            sideB++;
+        }
+    }
+
+    if(sideA >= 3 || sideB >= 3) {
+        return factor;
+    }
+    return -1.0f;
 }

+ 22 - 5
common/utils/KDTree.h

@@ -13,6 +13,7 @@ struct KDTree final {
         Array<Vector3, 3> v;
         Vector3 mid;
     public:
+        Triangle() = default;
         Triangle(const Vector3& a, const Vector3& b, const Vector3& c);
         const Array<Vector3, 3>& data() const;
         const Vector3& operator[](int index) const;
@@ -25,15 +26,22 @@ private:
         std::vector<Triangle> data;
         int splitDim;
         float splitValue;
-        Node* lessEqual;
-        Node* greater;
+        Node* childs[2];
+        int color;
         Node();
     };
 
     Node root;
+    
+    float minDistance;
+    Vector3 intersection;
+    KDTree::Triangle intersectionTriangle;
+    Vector3 original;
+    Vector3 min;
+    Vector3 max;
 
 public:
-    KDTree();
+    KDTree() = default;
     ~KDTree();
     KDTree(const KDTree& other) = delete;
     KDTree(KDTree&& other) = delete;
@@ -41,12 +49,21 @@ public:
     KDTree& operator=(KDTree&& other) = delete;
 
     void build(std::vector<KDTree::Triangle>& data);
-    void fillLines(Lines& lines, const std::vector<KDTree::Triangle>& data);
+    void fillLines(Lines& lines) const;
+    bool findIntersection(const Vector3& pos, const Vector3& direction);
+    Vector3 getIntersection() const;
+    KDTree::Triangle getIntersectedTriangle() const;
+    
 private:
     void clean(Node* n);
+    void cleanVisited(Node* n);
     float median(std::vector<KDTree::Triangle>& data, int dim) const;
     void build(Node* n, std::vector<KDTree::Triangle>& data);
-    void fillLines(Lines& lines, Node* n, const Vector3& min, const Vector3& max);
+    void fillLines(Lines& lines, const Node* n, const Vector3& min, const Vector3& max) const;
+    bool findIntersection(Node* n, const Vector3& pos, const Vector3& direction, float tMax);
+    
+    float orient(const Vector3& a, const Vector3& b, const Vector3& c, const Vector3& d) const;
+    float testIntersection(const Vector3& pos, const Vector3& direction, const KDTree::Triangle& t) const;
 };
 
 #endif

+ 19572 - 0
resources/scene

@@ -0,0 +1,19572 @@
+0, 0, 0, 0.125, 0
+1, 0, 0, 0.1875, 0
+0, 0, 1, 0.125, 0.0625
+1, 0, 0, 0.1875, 0
+1, 0, 1, 0.1875, 0.0625
+0, 0, 1, 0.125, 0.0625
+0, 0, 1, 0.125, 0
+1, 0, 1, 0.1875, 0
+0, 0, 2, 0.125, 0.0625
+1, 0, 1, 0.1875, 0
+1, 0, 2, 0.1875, 0.0625
+0, 0, 2, 0.125, 0.0625
+0, 0, 2, 0.125, 0
+1, 0, 2, 0.1875, 0
+0, 0, 3, 0.125, 0.0625
+1, 0, 2, 0.1875, 0
+1, 0, 3, 0.1875, 0.0625
+0, 0, 3, 0.125, 0.0625
+0, 0, 3, 0.125, 0
+1, 0, 3, 0.1875, 0
+0, 0, 4, 0.125, 0.0625
+1, 0, 3, 0.1875, 0
+1, 0, 4, 0.1875, 0.0625
+0, 0, 4, 0.125, 0.0625
+0, 0, 4, 0.125, 0
+1, 0, 4, 0.1875, 0
+0, 0, 5, 0.125, 0.0625
+1, 0, 4, 0.1875, 0
+1, 0, 5, 0.1875, 0.0625
+0, 0, 5, 0.125, 0.0625
+0, 0, 5, 0.125, 0
+1, 0, 5, 0.1875, 0
+0, 0, 6, 0.125, 0.0625
+1, 0, 5, 0.1875, 0
+1, 0, 6, 0.1875, 0.0625
+0, 0, 6, 0.125, 0.0625
+0, 0, 6, 0.125, 0
+1, 0, 6, 0.1875, 0
+0, 0, 7, 0.125, 0.0625
+1, 0, 6, 0.1875, 0
+1, 0, 7, 0.1875, 0.0625
+0, 0, 7, 0.125, 0.0625
+0, 0, 7, 0.125, 0
+1, 0, 7, 0.1875, 0
+0, 0, 8, 0.125, 0.0625
+1, 0, 7, 0.1875, 0
+1, 0, 8, 0.1875, 0.0625
+0, 0, 8, 0.125, 0.0625
+0, 0, 8, 0.125, 0
+1, 0, 8, 0.1875, 0
+0, 0, 9, 0.125, 0.0625
+1, 0, 8, 0.1875, 0
+1, 0, 9, 0.1875, 0.0625
+0, 0, 9, 0.125, 0.0625
+0, 0, 9, 0.125, 0
+1, 0, 9, 0.1875, 0
+0, 0, 10, 0.125, 0.0625
+1, 0, 9, 0.1875, 0
+1, 0, 10, 0.1875, 0.0625
+0, 0, 10, 0.125, 0.0625
+0, 0, 10, 0.125, 0
+1, 0, 10, 0.1875, 0
+0, 0, 11, 0.125, 0.0625
+1, 0, 10, 0.1875, 0
+1, 0, 11, 0.1875, 0.0625
+0, 0, 11, 0.125, 0.0625
+0, 0, 11, 0.125, 0
+1, 0, 11, 0.1875, 0
+0, 0, 12, 0.125, 0.0625
+1, 0, 11, 0.1875, 0
+1, 0, 12, 0.1875, 0.0625
+0, 0, 12, 0.125, 0.0625
+0, 0, 12, 0.125, 0
+1, 0, 12, 0.1875, 0
+0, 0, 13, 0.125, 0.0625
+1, 0, 12, 0.1875, 0
+1, 0, 13, 0.1875, 0.0625
+0, 0, 13, 0.125, 0.0625
+0, 0, 13, 0.125, 0
+1, 0, 13, 0.1875, 0
+0, 0, 14, 0.125, 0.0625
+1, 0, 13, 0.1875, 0
+1, 0, 14, 0.1875, 0.0625
+0, 0, 14, 0.125, 0.0625
+0, 0, 14, 0.125, 0
+1, 0, 14, 0.1875, 0
+0, 0, 15, 0.125, 0.0625
+1, 0, 14, 0.1875, 0
+1, 0, 15, 0.1875, 0.0625
+0, 0, 15, 0.125, 0.0625
+0, 0, 15, 0.125, 0
+1, 0, 15, 0.1875, 0
+0, 0, 16, 0.125, 0.0625
+1, 0, 15, 0.1875, 0
+1, 0, 16, 0.1875, 0.0625
+0, 0, 16, 0.125, 0.0625
+0, 0, 16, 0.125, 0
+1, 0, 16, 0.1875, 0
+0, 0, 17, 0.125, 0.0625
+1, 0, 16, 0.1875, 0
+1, 0, 17, 0.1875, 0.0625
+0, 0, 17, 0.125, 0.0625
+0, 0, 17, 0.125, 0
+1, 0, 17, 0.1875, 0
+0, 0, 18, 0.125, 0.0625
+1, 0, 17, 0.1875, 0
+1, 0, 18, 0.1875, 0.0625
+0, 0, 18, 0.125, 0.0625
+0, 0, 18, 0.125, 0
+1, 0, 18, 0.1875, 0
+0, 0, 19, 0.125, 0.0625
+1, 0, 18, 0.1875, 0
+1, 0, 19, 0.1875, 0.0625
+0, 0, 19, 0.125, 0.0625
+0, 0, 19, 0.125, 0
+1, 0, 19, 0.1875, 0
+0, 0, 20, 0.125, 0.0625
+1, 0, 19, 0.1875, 0
+1, 0, 20, 0.1875, 0.0625
+0, 0, 20, 0.125, 0.0625
+0, 0, 20, 0.125, 0
+1, 0, 20, 0.1875, 0
+0, 0, 21, 0.125, 0.0625
+1, 0, 20, 0.1875, 0
+1, 0, 21, 0.1875, 0.0625
+0, 0, 21, 0.125, 0.0625
+0, 0, 21, 0.125, 0
+1, 0, 21, 0.1875, 0
+0, 0, 22, 0.125, 0.0625
+1, 0, 21, 0.1875, 0
+1, 0, 22, 0.1875, 0.0625
+0, 0, 22, 0.125, 0.0625
+0, 0, 22, 0.125, 0
+1, 0, 22, 0.1875, 0
+0, 0, 23, 0.125, 0.0625
+1, 0, 22, 0.1875, 0
+1, 0, 23, 0.1875, 0.0625
+0, 0, 23, 0.125, 0.0625
+0, 0, 23, 0.125, 0
+1, 0, 23, 0.1875, 0
+0, 0, 24, 0.125, 0.0625
+1, 0, 23, 0.1875, 0
+1, 0, 24, 0.1875, 0.0625
+0, 0, 24, 0.125, 0.0625
+0, 0, 24, 0.125, 0
+1, 0, 24, 0.1875, 0
+0, 0, 25, 0.125, 0.0625
+1, 0, 24, 0.1875, 0
+1, 0, 25, 0.1875, 0.0625
+0, 0, 25, 0.125, 0.0625
+0, 0, 25, 0.125, 0
+1, 0, 25, 0.1875, 0
+0, 0, 26, 0.125, 0.0625
+1, 0, 25, 0.1875, 0
+1, 0, 26, 0.1875, 0.0625
+0, 0, 26, 0.125, 0.0625
+0, 0, 26, 0.125, 0
+1, 0, 26, 0.1875, 0
+0, 0, 27, 0.125, 0.0625
+1, 0, 26, 0.1875, 0
+1, 0, 27, 0.1875, 0.0625
+0, 0, 27, 0.125, 0.0625
+0, 0, 27, 0.125, 0
+1, 0, 27, 0.1875, 0
+0, 0, 28, 0.125, 0.0625
+1, 0, 27, 0.1875, 0
+1, 0, 28, 0.1875, 0.0625
+0, 0, 28, 0.125, 0.0625
+0, 0, 28, 0.125, 0
+1, 0, 28, 0.1875, 0
+0, 0, 29, 0.125, 0.0625
+1, 0, 28, 0.1875, 0
+1, 0, 29, 0.1875, 0.0625
+0, 0, 29, 0.125, 0.0625
+0, 0, 29, 0.125, 0
+1, 0, 29, 0.1875, 0
+0, 0, 30, 0.125, 0.0625
+1, 0, 29, 0.1875, 0
+1, 0, 30, 0.1875, 0.0625
+0, 0, 30, 0.125, 0.0625
+0, 0, 30, 0.125, 0
+1, 0, 30, 0.1875, 0
+0, 0, 31, 0.125, 0.0625
+1, 0, 30, 0.1875, 0
+1, 0, 31, 0.1875, 0.0625
+0, 0, 31, 0.125, 0.0625
+0, 0, 31, 0.125, 0
+1, 0, 31, 0.1875, 0
+0, 0, 32, 0.125, 0.0625
+1, 0, 31, 0.1875, 0
+1, 0, 32, 0.1875, 0.0625
+0, 0, 32, 0.125, 0.0625
+0, 11, 3, 0.25, 0
+0, 11, 4, 0.25, 0.0625
+1, 11, 3, 0.3125, 0
+1, 11, 3, 0.3125, 0
+0, 11, 4, 0.25, 0.0625
+1, 11, 4, 0.3125, 0.0625
+0, 11, 4, 0.25, 0
+0, 11, 5, 0.25, 0.0625
+1, 11, 4, 0.3125, 0
+1, 11, 4, 0.3125, 0
+0, 11, 5, 0.25, 0.0625
+1, 11, 5, 0.3125, 0.0625
+0, 12, 2, 0.25, 0
+0, 12, 3, 0.25, 0.0625
+1, 12, 2, 0.3125, 0
+1, 12, 2, 0.3125, 0
+0, 12, 3, 0.25, 0.0625
+1, 12, 3, 0.3125, 0.0625
+0, 11, 3, 0.1875, 0.0625
+1, 11, 3, 0.25, 0.0625
+0, 12, 3, 0.1875, 0
+1, 12, 3, 0.25, 0
+0, 12, 3, 0.1875, 0
+1, 11, 3, 0.25, 0.0625
+0, 12, 5, 0.25, 0
+0, 12, 6, 0.25, 0.0625
+1, 12, 5, 0.3125, 0
+1, 12, 5, 0.3125, 0
+0, 12, 6, 0.25, 0.0625
+1, 12, 6, 0.3125, 0.0625
+0, 11, 5, 0.25, 0.0625
+0, 12, 5, 0.25, 0
+1, 11, 5, 0.1875, 0.0625
+1, 12, 5, 0.1875, 0
+1, 11, 5, 0.1875, 0.0625
+0, 12, 5, 0.25, 0
+0, 13, 1, 0.25, 0
+0, 13, 2, 0.25, 0.0625
+1, 13, 1, 0.3125, 0
+1, 13, 1, 0.3125, 0
+0, 13, 2, 0.25, 0.0625
+1, 13, 2, 0.3125, 0.0625
+0, 12, 2, 0.1875, 0.0625
+1, 12, 2, 0.25, 0.0625
+0, 13, 2, 0.1875, 0
+1, 13, 2, 0.25, 0
+0, 13, 2, 0.1875, 0
+1, 12, 2, 0.25, 0.0625
+0, 13, 6, 0.25, 0
+0, 13, 7, 0.25, 0.0625
+1, 13, 6, 0.3125, 0
+1, 13, 6, 0.3125, 0
+0, 13, 7, 0.25, 0.0625
+1, 13, 7, 0.3125, 0.0625
+0, 12, 6, 0.1875, 0.0625
+0, 12, 7, 0.25, 0.0625
+0, 13, 6, 0.1875, 0
+0, 12, 7, 0.25, 0.0625
+0, 13, 7, 0.25, 0
+0, 13, 6, 0.1875, 0
+0, 12, 6, 0.25, 0.0625
+0, 13, 6, 0.25, 0
+1, 12, 6, 0.1875, 0.0625
+1, 13, 6, 0.1875, 0
+1, 12, 6, 0.1875, 0.0625
+0, 13, 6, 0.25, 0
+0, 13, 16, 0.25, 0
+0, 13, 17, 0.25, 0.0625
+1, 13, 16, 0.3125, 0
+1, 13, 16, 0.3125, 0
+0, 13, 17, 0.25, 0.0625
+1, 13, 17, 0.3125, 0.0625
+0, 13, 17, 0.25, 0
+0, 13, 18, 0.25, 0.0625
+1, 13, 17, 0.3125, 0
+1, 13, 17, 0.3125, 0
+0, 13, 18, 0.25, 0.0625
+1, 13, 18, 0.3125, 0.0625
+0, 13, 1, 0.1875, 0.0625
+1, 13, 1, 0.25, 0.0625
+0, 14, 1, 0.1875, 0
+1, 14, 1, 0.25, 0
+0, 14, 1, 0.1875, 0
+1, 13, 1, 0.25, 0.0625
+0, 14, 7, 0.25, 0
+0, 14, 8, 0.25, 0.0625
+1, 14, 7, 0.3125, 0
+1, 14, 7, 0.3125, 0
+0, 14, 8, 0.25, 0.0625
+1, 14, 8, 0.3125, 0.0625
+0, 13, 7, 0.1875, 0.0625
+0, 13, 8, 0.25, 0.0625
+0, 14, 7, 0.1875, 0
+0, 13, 8, 0.25, 0.0625
+0, 14, 8, 0.25, 0
+0, 14, 7, 0.1875, 0
+0, 13, 7, 0.25, 0.0625
+0, 14, 7, 0.25, 0
+1, 13, 7, 0.1875, 0.0625
+1, 14, 7, 0.1875, 0
+1, 13, 7, 0.1875, 0.0625
+0, 14, 7, 0.25, 0
+0, 14, 8, 0.25, 0
+0, 14, 9, 0.25, 0.0625
+1, 14, 8, 0.3125, 0
+1, 14, 8, 0.3125, 0
+0, 14, 9, 0.25, 0.0625
+1, 14, 9, 0.3125, 0.0625
+0, 14, 15, 0.25, 0
+0, 14, 16, 0.25, 0.0625
+1, 14, 15, 0.3125, 0
+1, 14, 15, 0.3125, 0
+0, 14, 16, 0.25, 0.0625
+1, 14, 16, 0.3125, 0.0625
+0, 13, 15, 0.1875, 0.0625
+0, 13, 16, 0.25, 0.0625
+0, 14, 15, 0.1875, 0
+0, 13, 16, 0.25, 0.0625
+0, 14, 16, 0.25, 0
+0, 14, 15, 0.1875, 0
+0, 13, 16, 0.1875, 0.0625
+1, 13, 16, 0.25, 0.0625
+0, 14, 16, 0.1875, 0
+1, 14, 16, 0.25, 0
+0, 14, 16, 0.1875, 0
+1, 13, 16, 0.25, 0.0625
+0, 14, 18, 0.25, 0
+0, 14, 19, 0.25, 0.0625
+1, 14, 18, 0.3125, 0
+1, 14, 18, 0.3125, 0
+0, 14, 19, 0.25, 0.0625
+1, 14, 19, 0.3125, 0.0625
+0, 13, 18, 0.1875, 0.0625
+0, 13, 19, 0.25, 0.0625
+0, 14, 18, 0.1875, 0
+0, 13, 19, 0.25, 0.0625
+0, 14, 19, 0.25, 0
+0, 14, 18, 0.1875, 0
+0, 13, 18, 0.25, 0.0625
+0, 14, 18, 0.25, 0
+1, 13, 18, 0.1875, 0.0625
+1, 14, 18, 0.1875, 0
+1, 13, 18, 0.1875, 0.0625
+0, 14, 18, 0.25, 0
+0, 13, 19, 0.1875, 0.0625
+0, 13, 20, 0.25, 0.0625
+0, 14, 19, 0.1875, 0
+0, 13, 20, 0.25, 0.0625
+0, 14, 20, 0.25, 0
+0, 14, 19, 0.1875, 0
+0, 15, 0, 0.25, 0
+0, 15, 1, 0.25, 0.0625
+1, 15, 0, 0.3125, 0
+1, 15, 0, 0.3125, 0
+0, 15, 1, 0.25, 0.0625
+1, 15, 1, 0.3125, 0.0625
+1, 14, 0, 0.25, 0.0625
+1, 15, 0, 0.25, 0
+1, 14, 1, 0.1875, 0.0625
+1, 14, 1, 0.1875, 0.0625
+1, 15, 0, 0.25, 0
+1, 15, 1, 0.1875, 0
+0, 14, 1, 0.1875, 0.0625
+1, 14, 1, 0.25, 0.0625
+0, 15, 1, 0.1875, 0
+1, 15, 1, 0.25, 0
+0, 15, 1, 0.1875, 0
+1, 14, 1, 0.25, 0.0625
+0, 15, 9, 0.25, 0
+0, 15, 10, 0.25, 0.0625
+1, 15, 9, 0.3125, 0
+1, 15, 9, 0.3125, 0
+0, 15, 10, 0.25, 0.0625
+1, 15, 10, 0.3125, 0.0625
+0, 14, 9, 0.1875, 0.0625
+0, 14, 10, 0.25, 0.0625
+0, 15, 9, 0.1875, 0
+0, 14, 10, 0.25, 0.0625
+0, 15, 10, 0.25, 0
+0, 15, 9, 0.1875, 0
+0, 14, 9, 0.25, 0.0625
+0, 15, 9, 0.25, 0
+1, 14, 9, 0.1875, 0.0625
+1, 15, 9, 0.1875, 0
+1, 14, 9, 0.1875, 0.0625
+0, 15, 9, 0.25, 0
+0, 15, 10, 0.25, 0
+0, 15, 11, 0.25, 0.0625
+1, 15, 10, 0.3125, 0
+1, 15, 10, 0.3125, 0
+0, 15, 11, 0.25, 0.0625
+1, 15, 11, 0.3125, 0.0625
+0, 15, 14, 0.25, 0
+0, 15, 15, 0.25, 0.0625
+1, 15, 14, 0.3125, 0
+1, 15, 14, 0.3125, 0
+0, 15, 15, 0.25, 0.0625
+1, 15, 15, 0.3125, 0.0625
+0, 14, 14, 0.1875, 0.0625
+0, 14, 15, 0.25, 0.0625
+0, 15, 14, 0.1875, 0
+0, 14, 15, 0.25, 0.0625
+0, 15, 15, 0.25, 0
+0, 15, 14, 0.1875, 0
+0, 14, 15, 0.1875, 0.0625
+1, 14, 15, 0.25, 0.0625
+0, 15, 15, 0.1875, 0
+1, 15, 15, 0.25, 0
+0, 15, 15, 0.1875, 0
+1, 14, 15, 0.25, 0.0625
+0, 15, 19, 0.25, 0
+0, 15, 20, 0.25, 0.0625
+1, 15, 19, 0.3125, 0
+1, 15, 19, 0.3125, 0
+0, 15, 20, 0.25, 0.0625
+1, 15, 20, 0.3125, 0.0625
+0, 14, 19, 0.1875, 0.0625
+0, 14, 20, 0.25, 0.0625
+0, 15, 19, 0.1875, 0
+0, 14, 20, 0.25, 0.0625
+0, 15, 20, 0.25, 0
+0, 15, 19, 0.1875, 0
+0, 14, 19, 0.25, 0.0625
+0, 15, 19, 0.25, 0
+1, 14, 19, 0.1875, 0.0625
+1, 15, 19, 0.1875, 0
+1, 14, 19, 0.1875, 0.0625
+0, 15, 19, 0.25, 0
+0, 16, 11, 0.25, 0
+0, 16, 12, 0.25, 0.0625
+1, 16, 11, 0.3125, 0
+1, 16, 11, 0.3125, 0
+0, 16, 12, 0.25, 0.0625
+1, 16, 12, 0.3125, 0.0625
+0, 15, 11, 0.1875, 0.0625
+0, 15, 12, 0.25, 0.0625
+0, 16, 11, 0.1875, 0
+0, 15, 12, 0.25, 0.0625
+0, 16, 12, 0.25, 0
+0, 16, 11, 0.1875, 0
+0, 15, 11, 0.25, 0.0625
+0, 16, 11, 0.25, 0
+1, 15, 11, 0.1875, 0.0625
+1, 16, 11, 0.1875, 0
+1, 15, 11, 0.1875, 0.0625
+0, 16, 11, 0.25, 0
+0, 16, 12, 0.25, 0
+0, 16, 13, 0.25, 0.0625
+1, 16, 12, 0.3125, 0
+1, 16, 12, 0.3125, 0
+0, 16, 13, 0.25, 0.0625
+1, 16, 13, 0.3125, 0.0625
+0, 15, 12, 0.1875, 0.0625
+0, 15, 13, 0.25, 0.0625
+0, 16, 12, 0.1875, 0
+0, 15, 13, 0.25, 0.0625
+0, 16, 13, 0.25, 0
+0, 16, 12, 0.1875, 0
+0, 16, 13, 0.25, 0
+0, 16, 14, 0.25, 0.0625
+1, 16, 13, 0.3125, 0
+1, 16, 13, 0.3125, 0
+0, 16, 14, 0.25, 0.0625
+1, 16, 14, 0.3125, 0.0625
+0, 15, 13, 0.1875, 0.0625
+0, 15, 14, 0.25, 0.0625
+0, 16, 13, 0.1875, 0
+0, 15, 14, 0.25, 0.0625
+0, 16, 14, 0.25, 0
+0, 16, 13, 0.1875, 0
+0, 15, 14, 0.1875, 0.0625
+1, 15, 14, 0.25, 0.0625
+0, 16, 14, 0.1875, 0
+1, 16, 14, 0.25, 0
+0, 16, 14, 0.1875, 0
+1, 15, 14, 0.25, 0.0625
+0, 16, 20, 0.25, 0
+0, 16, 21, 0.25, 0.0625
+1, 16, 20, 0.3125, 0
+1, 16, 20, 0.3125, 0
+0, 16, 21, 0.25, 0.0625
+1, 16, 21, 0.3125, 0.0625
+0, 15, 20, 0.1875, 0.0625
+0, 15, 21, 0.25, 0.0625
+0, 16, 20, 0.1875, 0
+0, 15, 21, 0.25, 0.0625
+0, 16, 21, 0.25, 0
+0, 16, 20, 0.1875, 0
+0, 15, 20, 0.25, 0.0625
+0, 16, 20, 0.25, 0
+1, 15, 20, 0.1875, 0.0625
+1, 16, 20, 0.1875, 0
+1, 15, 20, 0.1875, 0.0625
+0, 16, 20, 0.25, 0
+0, 16, 25, 0.25, 0
+0, 16, 26, 0.25, 0.0625
+1, 16, 25, 0.3125, 0
+1, 16, 25, 0.3125, 0
+0, 16, 26, 0.25, 0.0625
+1, 16, 26, 0.3125, 0.0625
+1, 15, 25, 0.25, 0.0625
+1, 16, 25, 0.25, 0
+1, 15, 26, 0.1875, 0.0625
+1, 15, 26, 0.1875, 0.0625
+1, 16, 25, 0.25, 0
+1, 16, 26, 0.1875, 0
+0, 16, 26, 0.25, 0
+0, 16, 27, 0.25, 0.0625
+1, 16, 26, 0.3125, 0
+1, 16, 26, 0.3125, 0
+0, 16, 27, 0.25, 0.0625
+1, 16, 27, 0.3125, 0.0625
+1, 15, 26, 0.25, 0.0625
+1, 16, 26, 0.25, 0
+1, 15, 27, 0.1875, 0.0625
+1, 15, 27, 0.1875, 0.0625
+1, 16, 26, 0.25, 0
+1, 16, 27, 0.1875, 0
+0, 16, 27, 0.25, 0
+0, 16, 28, 0.25, 0.0625
+1, 16, 27, 0.3125, 0
+1, 16, 27, 0.3125, 0
+0, 16, 28, 0.25, 0.0625
+1, 16, 28, 0.3125, 0.0625
+1, 15, 27, 0.25, 0.0625
+1, 16, 27, 0.25, 0
+1, 15, 28, 0.1875, 0.0625
+1, 15, 28, 0.1875, 0.0625
+1, 16, 27, 0.25, 0
+1, 16, 28, 0.1875, 0
+0, 16, 28, 0.25, 0
+0, 16, 29, 0.25, 0.0625
+1, 16, 28, 0.3125, 0
+1, 16, 28, 0.3125, 0
+0, 16, 29, 0.25, 0.0625
+1, 16, 29, 0.3125, 0.0625
+1, 15, 28, 0.25, 0.0625
+1, 16, 28, 0.25, 0
+1, 15, 29, 0.1875, 0.0625
+1, 15, 29, 0.1875, 0.0625
+1, 16, 28, 0.25, 0
+1, 16, 29, 0.1875, 0
+0, 16, 29, 0.25, 0
+0, 16, 30, 0.25, 0.0625
+1, 16, 29, 0.3125, 0
+1, 16, 29, 0.3125, 0
+0, 16, 30, 0.25, 0.0625
+1, 16, 30, 0.3125, 0.0625
+1, 15, 29, 0.25, 0.0625
+1, 16, 29, 0.25, 0
+1, 15, 30, 0.1875, 0.0625
+1, 15, 30, 0.1875, 0.0625
+1, 16, 29, 0.25, 0
+1, 16, 30, 0.1875, 0
+0, 16, 30, 0.25, 0
+0, 16, 31, 0.25, 0.0625
+1, 16, 30, 0.3125, 0
+1, 16, 30, 0.3125, 0
+0, 16, 31, 0.25, 0.0625
+1, 16, 31, 0.3125, 0.0625
+1, 15, 30, 0.25, 0.0625
+1, 16, 30, 0.25, 0
+1, 15, 31, 0.1875, 0.0625
+1, 15, 31, 0.1875, 0.0625
+1, 16, 30, 0.25, 0
+1, 16, 31, 0.1875, 0
+0, 16, 31, 0.25, 0
+0, 16, 32, 0.25, 0.0625
+1, 16, 31, 0.3125, 0
+1, 16, 31, 0.3125, 0
+0, 16, 32, 0.25, 0.0625
+1, 16, 32, 0.3125, 0.0625
+1, 15, 31, 0.25, 0.0625
+1, 16, 31, 0.25, 0
+1, 15, 32, 0.1875, 0.0625
+1, 15, 32, 0.1875, 0.0625
+1, 16, 31, 0.25, 0
+1, 16, 32, 0.1875, 0
+0, 15, 32, 0.1875, 0.0625
+1, 15, 32, 0.25, 0.0625
+0, 16, 32, 0.1875, 0
+1, 16, 32, 0.25, 0
+0, 16, 32, 0.1875, 0
+1, 15, 32, 0.25, 0.0625
+0, 17, 21, 0.25, 0
+0, 17, 22, 0.25, 0.0625
+1, 17, 21, 0.3125, 0
+1, 17, 21, 0.3125, 0
+0, 17, 22, 0.25, 0.0625
+1, 17, 22, 0.3125, 0.0625
+0, 16, 21, 0.1875, 0.0625
+0, 16, 22, 0.25, 0.0625
+0, 17, 21, 0.1875, 0
+0, 16, 22, 0.25, 0.0625
+0, 17, 22, 0.25, 0
+0, 17, 21, 0.1875, 0
+0, 16, 21, 0.25, 0.0625
+0, 17, 21, 0.25, 0
+1, 16, 21, 0.1875, 0.0625
+1, 17, 21, 0.1875, 0
+1, 16, 21, 0.1875, 0.0625
+0, 17, 21, 0.25, 0
+0, 17, 22, 0.25, 0
+0, 17, 23, 0.25, 0.0625
+1, 17, 22, 0.3125, 0
+1, 17, 22, 0.3125, 0
+0, 17, 23, 0.25, 0.0625
+1, 17, 23, 0.3125, 0.0625
+0, 17, 23, 0.25, 0
+0, 17, 24, 0.25, 0.0625
+1, 17, 23, 0.3125, 0
+1, 17, 23, 0.3125, 0
+0, 17, 24, 0.25, 0.0625
+1, 17, 24, 0.3125, 0.0625
+1, 16, 23, 0.25, 0.0625
+1, 17, 23, 0.25, 0
+1, 16, 24, 0.1875, 0.0625
+1, 16, 24, 0.1875, 0.0625
+1, 17, 23, 0.25, 0
+1, 17, 24, 0.1875, 0
+0, 17, 24, 0.25, 0
+0, 17, 25, 0.25, 0.0625
+1, 17, 24, 0.3125, 0
+1, 17, 24, 0.3125, 0
+0, 17, 25, 0.25, 0.0625
+1, 17, 25, 0.3125, 0.0625
+1, 16, 24, 0.25, 0.0625
+1, 17, 24, 0.25, 0
+1, 16, 25, 0.1875, 0.0625
+1, 16, 25, 0.1875, 0.0625
+1, 17, 24, 0.25, 0
+1, 17, 25, 0.1875, 0
+0, 16, 25, 0.1875, 0.0625
+1, 16, 25, 0.25, 0.0625
+0, 17, 25, 0.1875, 0
+1, 17, 25, 0.25, 0
+0, 17, 25, 0.1875, 0
+1, 16, 25, 0.25, 0.0625
+1, 0, 0, 0.125, 0
+2, 0, 0, 0.1875, 0
+1, 0, 1, 0.125, 0.0625
+2, 0, 0, 0.1875, 0
+2, 0, 1, 0.1875, 0.0625
+1, 0, 1, 0.125, 0.0625
+1, 0, 1, 0.125, 0
+2, 0, 1, 0.1875, 0
+1, 0, 2, 0.125, 0.0625
+2, 0, 1, 0.1875, 0
+2, 0, 2, 0.1875, 0.0625
+1, 0, 2, 0.125, 0.0625
+1, 0, 2, 0.125, 0
+2, 0, 2, 0.1875, 0
+1, 0, 3, 0.125, 0.0625
+2, 0, 2, 0.1875, 0
+2, 0, 3, 0.1875, 0.0625
+1, 0, 3, 0.125, 0.0625
+1, 0, 3, 0.125, 0
+2, 0, 3, 0.1875, 0
+1, 0, 4, 0.125, 0.0625
+2, 0, 3, 0.1875, 0
+2, 0, 4, 0.1875, 0.0625
+1, 0, 4, 0.125, 0.0625
+1, 0, 4, 0.125, 0
+2, 0, 4, 0.1875, 0
+1, 0, 5, 0.125, 0.0625
+2, 0, 4, 0.1875, 0
+2, 0, 5, 0.1875, 0.0625
+1, 0, 5, 0.125, 0.0625
+1, 0, 5, 0.125, 0
+2, 0, 5, 0.1875, 0
+1, 0, 6, 0.125, 0.0625
+2, 0, 5, 0.1875, 0
+2, 0, 6, 0.1875, 0.0625
+1, 0, 6, 0.125, 0.0625
+1, 0, 6, 0.125, 0
+2, 0, 6, 0.1875, 0
+1, 0, 7, 0.125, 0.0625
+2, 0, 6, 0.1875, 0
+2, 0, 7, 0.1875, 0.0625
+1, 0, 7, 0.125, 0.0625
+1, 0, 7, 0.125, 0
+2, 0, 7, 0.1875, 0
+1, 0, 8, 0.125, 0.0625
+2, 0, 7, 0.1875, 0
+2, 0, 8, 0.1875, 0.0625
+1, 0, 8, 0.125, 0.0625
+1, 0, 8, 0.125, 0
+2, 0, 8, 0.1875, 0
+1, 0, 9, 0.125, 0.0625
+2, 0, 8, 0.1875, 0
+2, 0, 9, 0.1875, 0.0625
+1, 0, 9, 0.125, 0.0625
+1, 0, 9, 0.125, 0
+2, 0, 9, 0.1875, 0
+1, 0, 10, 0.125, 0.0625
+2, 0, 9, 0.1875, 0
+2, 0, 10, 0.1875, 0.0625
+1, 0, 10, 0.125, 0.0625
+1, 0, 10, 0.125, 0
+2, 0, 10, 0.1875, 0
+1, 0, 11, 0.125, 0.0625
+2, 0, 10, 0.1875, 0
+2, 0, 11, 0.1875, 0.0625
+1, 0, 11, 0.125, 0.0625
+1, 0, 11, 0.125, 0
+2, 0, 11, 0.1875, 0
+1, 0, 12, 0.125, 0.0625
+2, 0, 11, 0.1875, 0
+2, 0, 12, 0.1875, 0.0625
+1, 0, 12, 0.125, 0.0625
+1, 0, 12, 0.125, 0
+2, 0, 12, 0.1875, 0
+1, 0, 13, 0.125, 0.0625
+2, 0, 12, 0.1875, 0
+2, 0, 13, 0.1875, 0.0625
+1, 0, 13, 0.125, 0.0625
+1, 0, 13, 0.125, 0
+2, 0, 13, 0.1875, 0
+1, 0, 14, 0.125, 0.0625
+2, 0, 13, 0.1875, 0
+2, 0, 14, 0.1875, 0.0625
+1, 0, 14, 0.125, 0.0625
+1, 0, 14, 0.125, 0
+2, 0, 14, 0.1875, 0
+1, 0, 15, 0.125, 0.0625
+2, 0, 14, 0.1875, 0
+2, 0, 15, 0.1875, 0.0625
+1, 0, 15, 0.125, 0.0625
+1, 0, 15, 0.125, 0
+2, 0, 15, 0.1875, 0
+1, 0, 16, 0.125, 0.0625
+2, 0, 15, 0.1875, 0
+2, 0, 16, 0.1875, 0.0625
+1, 0, 16, 0.125, 0.0625
+1, 0, 16, 0.125, 0
+2, 0, 16, 0.1875, 0
+1, 0, 17, 0.125, 0.0625
+2, 0, 16, 0.1875, 0
+2, 0, 17, 0.1875, 0.0625
+1, 0, 17, 0.125, 0.0625
+1, 0, 17, 0.125, 0
+2, 0, 17, 0.1875, 0
+1, 0, 18, 0.125, 0.0625
+2, 0, 17, 0.1875, 0
+2, 0, 18, 0.1875, 0.0625
+1, 0, 18, 0.125, 0.0625
+1, 0, 18, 0.125, 0
+2, 0, 18, 0.1875, 0
+1, 0, 19, 0.125, 0.0625
+2, 0, 18, 0.1875, 0
+2, 0, 19, 0.1875, 0.0625
+1, 0, 19, 0.125, 0.0625
+1, 0, 19, 0.125, 0
+2, 0, 19, 0.1875, 0
+1, 0, 20, 0.125, 0.0625
+2, 0, 19, 0.1875, 0
+2, 0, 20, 0.1875, 0.0625
+1, 0, 20, 0.125, 0.0625
+1, 0, 20, 0.125, 0
+2, 0, 20, 0.1875, 0
+1, 0, 21, 0.125, 0.0625
+2, 0, 20, 0.1875, 0
+2, 0, 21, 0.1875, 0.0625
+1, 0, 21, 0.125, 0.0625
+1, 0, 21, 0.125, 0
+2, 0, 21, 0.1875, 0
+1, 0, 22, 0.125, 0.0625
+2, 0, 21, 0.1875, 0
+2, 0, 22, 0.1875, 0.0625
+1, 0, 22, 0.125, 0.0625
+1, 0, 22, 0.125, 0
+2, 0, 22, 0.1875, 0
+1, 0, 23, 0.125, 0.0625
+2, 0, 22, 0.1875, 0
+2, 0, 23, 0.1875, 0.0625
+1, 0, 23, 0.125, 0.0625
+1, 0, 23, 0.125, 0
+2, 0, 23, 0.1875, 0
+1, 0, 24, 0.125, 0.0625
+2, 0, 23, 0.1875, 0
+2, 0, 24, 0.1875, 0.0625
+1, 0, 24, 0.125, 0.0625
+1, 0, 24, 0.125, 0
+2, 0, 24, 0.1875, 0
+1, 0, 25, 0.125, 0.0625
+2, 0, 24, 0.1875, 0
+2, 0, 25, 0.1875, 0.0625
+1, 0, 25, 0.125, 0.0625
+1, 0, 25, 0.125, 0
+2, 0, 25, 0.1875, 0
+1, 0, 26, 0.125, 0.0625
+2, 0, 25, 0.1875, 0
+2, 0, 26, 0.1875, 0.0625
+1, 0, 26, 0.125, 0.0625
+1, 0, 26, 0.125, 0
+2, 0, 26, 0.1875, 0
+1, 0, 27, 0.125, 0.0625
+2, 0, 26, 0.1875, 0
+2, 0, 27, 0.1875, 0.0625
+1, 0, 27, 0.125, 0.0625
+1, 0, 27, 0.125, 0
+2, 0, 27, 0.1875, 0
+1, 0, 28, 0.125, 0.0625
+2, 0, 27, 0.1875, 0
+2, 0, 28, 0.1875, 0.0625
+1, 0, 28, 0.125, 0.0625
+1, 0, 28, 0.125, 0
+2, 0, 28, 0.1875, 0
+1, 0, 29, 0.125, 0.0625
+2, 0, 28, 0.1875, 0
+2, 0, 29, 0.1875, 0.0625
+1, 0, 29, 0.125, 0.0625
+1, 0, 29, 0.125, 0
+2, 0, 29, 0.1875, 0
+1, 0, 30, 0.125, 0.0625
+2, 0, 29, 0.1875, 0
+2, 0, 30, 0.1875, 0.0625
+1, 0, 30, 0.125, 0.0625
+1, 0, 30, 0.125, 0
+2, 0, 30, 0.1875, 0
+1, 0, 31, 0.125, 0.0625
+2, 0, 30, 0.1875, 0
+2, 0, 31, 0.1875, 0.0625
+1, 0, 31, 0.125, 0.0625
+1, 0, 31, 0.125, 0
+2, 0, 31, 0.1875, 0
+1, 0, 32, 0.125, 0.0625
+2, 0, 31, 0.1875, 0
+2, 0, 32, 0.1875, 0.0625
+1, 0, 32, 0.125, 0.0625
+1, 11, 3, 0.25, 0
+1, 11, 4, 0.25, 0.0625
+2, 11, 3, 0.3125, 0
+2, 11, 3, 0.3125, 0
+1, 11, 4, 0.25, 0.0625
+2, 11, 4, 0.3125, 0.0625
+1, 12, 2, 0.25, 0
+1, 12, 3, 0.25, 0.0625
+2, 12, 2, 0.3125, 0
+2, 12, 2, 0.3125, 0
+1, 12, 3, 0.25, 0.0625
+2, 12, 3, 0.3125, 0.0625
+1, 11, 3, 0.1875, 0.0625
+2, 11, 3, 0.25, 0.0625
+1, 12, 3, 0.1875, 0
+2, 12, 3, 0.25, 0
+1, 12, 3, 0.1875, 0
+2, 11, 3, 0.25, 0.0625
+1, 12, 4, 0.25, 0
+1, 12, 5, 0.25, 0.0625
+2, 12, 4, 0.3125, 0
+2, 12, 4, 0.3125, 0
+1, 12, 5, 0.25, 0.0625
+2, 12, 5, 0.3125, 0.0625
+1, 11, 4, 0.1875, 0.0625
+1, 11, 5, 0.25, 0.0625
+1, 12, 4, 0.1875, 0
+1, 11, 5, 0.25, 0.0625
+1, 12, 5, 0.25, 0
+1, 12, 4, 0.1875, 0
+1, 11, 4, 0.25, 0.0625
+1, 12, 4, 0.25, 0
+2, 11, 4, 0.1875, 0.0625
+2, 12, 4, 0.1875, 0
+2, 11, 4, 0.1875, 0.0625
+1, 12, 4, 0.25, 0
+1, 13, 1, 0.25, 0
+1, 13, 2, 0.25, 0.0625
+2, 13, 1, 0.3125, 0
+2, 13, 1, 0.3125, 0
+1, 13, 2, 0.25, 0.0625
+2, 13, 2, 0.3125, 0.0625
+2, 12, 1, 0.25, 0.0625
+2, 13, 1, 0.25, 0
+2, 12, 2, 0.1875, 0.0625
+2, 12, 2, 0.1875, 0.0625
+2, 13, 1, 0.25, 0
+2, 13, 2, 0.1875, 0
+1, 12, 2, 0.1875, 0.0625
+2, 12, 2, 0.25, 0.0625
+1, 13, 2, 0.1875, 0
+2, 13, 2, 0.25, 0
+1, 13, 2, 0.1875, 0
+2, 12, 2, 0.25, 0.0625
+1, 13, 5, 0.25, 0
+1, 13, 6, 0.25, 0.0625
+2, 13, 5, 0.3125, 0
+2, 13, 5, 0.3125, 0
+1, 13, 6, 0.25, 0.0625
+2, 13, 6, 0.3125, 0.0625
+1, 12, 5, 0.1875, 0.0625
+1, 12, 6, 0.25, 0.0625
+1, 13, 5, 0.1875, 0
+1, 12, 6, 0.25, 0.0625
+1, 13, 6, 0.25, 0
+1, 13, 5, 0.1875, 0
+1, 12, 5, 0.25, 0.0625
+1, 13, 5, 0.25, 0
+2, 12, 5, 0.1875, 0.0625
+2, 13, 5, 0.1875, 0
+2, 12, 5, 0.1875, 0.0625
+1, 13, 5, 0.25, 0
+1, 14, 0, 0.25, 0
+1, 14, 1, 0.25, 0.0625
+2, 14, 0, 0.3125, 0
+2, 14, 0, 0.3125, 0
+1, 14, 1, 0.25, 0.0625
+2, 14, 1, 0.3125, 0.0625
+2, 13, 0, 0.25, 0.0625
+2, 14, 0, 0.25, 0
+2, 13, 1, 0.1875, 0.0625
+2, 13, 1, 0.1875, 0.0625
+2, 14, 0, 0.25, 0
+2, 14, 1, 0.1875, 0
+1, 13, 1, 0.1875, 0.0625
+2, 13, 1, 0.25, 0.0625
+1, 14, 1, 0.1875, 0
+2, 14, 1, 0.25, 0
+1, 14, 1, 0.1875, 0
+2, 13, 1, 0.25, 0.0625
+1, 14, 6, 0.25, 0
+1, 14, 7, 0.25, 0.0625
+2, 14, 6, 0.3125, 0
+2, 14, 6, 0.3125, 0
+1, 14, 7, 0.25, 0.0625
+2, 14, 7, 0.3125, 0.0625
+1, 13, 6, 0.1875, 0.0625
+1, 13, 7, 0.25, 0.0625
+1, 14, 6, 0.1875, 0
+1, 13, 7, 0.25, 0.0625
+1, 14, 7, 0.25, 0
+1, 14, 6, 0.1875, 0
+1, 13, 6, 0.25, 0.0625
+1, 14, 6, 0.25, 0
+2, 13, 6, 0.1875, 0.0625
+2, 14, 6, 0.1875, 0
+2, 13, 6, 0.1875, 0.0625
+1, 14, 6, 0.25, 0
+1, 14, 15, 0.25, 0
+1, 14, 16, 0.25, 0.0625
+2, 14, 15, 0.3125, 0
+2, 14, 15, 0.3125, 0
+1, 14, 16, 0.25, 0.0625
+2, 14, 16, 0.3125, 0.0625
+1, 14, 16, 0.25, 0
+1, 14, 17, 0.25, 0.0625
+2, 14, 16, 0.3125, 0
+2, 14, 16, 0.3125, 0
+1, 14, 17, 0.25, 0.0625
+2, 14, 17, 0.3125, 0.0625
+1, 13, 16, 0.1875, 0.0625
+1, 13, 17, 0.25, 0.0625
+1, 14, 16, 0.1875, 0
+1, 13, 17, 0.25, 0.0625
+1, 14, 17, 0.25, 0
+1, 14, 16, 0.1875, 0
+1, 14, 17, 0.25, 0
+1, 14, 18, 0.25, 0.0625
+2, 14, 17, 0.3125, 0
+2, 14, 17, 0.3125, 0
+1, 14, 18, 0.25, 0.0625
+2, 14, 18, 0.3125, 0.0625
+1, 13, 17, 0.1875, 0.0625
+1, 13, 18, 0.25, 0.0625
+1, 14, 17, 0.1875, 0
+1, 13, 18, 0.25, 0.0625
+1, 14, 18, 0.25, 0
+1, 14, 17, 0.1875, 0
+2, 13, 31, 0.25, 0.0625
+2, 14, 31, 0.25, 0
+2, 13, 32, 0.1875, 0.0625
+2, 13, 32, 0.1875, 0.0625
+2, 14, 31, 0.25, 0
+2, 14, 32, 0.1875, 0
+1, 15, 7, 0.25, 0
+1, 15, 8, 0.25, 0.0625
+2, 15, 7, 0.3125, 0
+2, 15, 7, 0.3125, 0
+1, 15, 8, 0.25, 0.0625
+2, 15, 8, 0.3125, 0.0625
+1, 14, 7, 0.1875, 0.0625
+1, 14, 8, 0.25, 0.0625
+1, 15, 7, 0.1875, 0
+1, 14, 8, 0.25, 0.0625
+1, 15, 8, 0.25, 0
+1, 15, 7, 0.1875, 0
+1, 14, 7, 0.25, 0.0625
+1, 15, 7, 0.25, 0
+2, 14, 7, 0.1875, 0.0625
+2, 15, 7, 0.1875, 0
+2, 14, 7, 0.1875, 0.0625
+1, 15, 7, 0.25, 0
+1, 15, 8, 0.25, 0
+1, 15, 9, 0.25, 0.0625
+2, 15, 8, 0.3125, 0
+2, 15, 8, 0.3125, 0
+1, 15, 9, 0.25, 0.0625
+2, 15, 9, 0.3125, 0.0625
+1, 14, 8, 0.1875, 0.0625
+1, 14, 9, 0.25, 0.0625
+1, 15, 8, 0.1875, 0
+1, 14, 9, 0.25, 0.0625
+1, 15, 9, 0.25, 0
+1, 15, 8, 0.1875, 0
+1, 14, 15, 0.1875, 0.0625
+2, 14, 15, 0.25, 0.0625
+1, 15, 15, 0.1875, 0
+2, 15, 15, 0.25, 0
+1, 15, 15, 0.1875, 0
+2, 14, 15, 0.25, 0.0625
+1, 15, 18, 0.25, 0
+1, 15, 19, 0.25, 0.0625
+2, 15, 18, 0.3125, 0
+2, 15, 18, 0.3125, 0
+1, 15, 19, 0.25, 0.0625
+2, 15, 19, 0.3125, 0.0625
+1, 14, 18, 0.1875, 0.0625
+1, 14, 19, 0.25, 0.0625
+1, 15, 18, 0.1875, 0
+1, 14, 19, 0.25, 0.0625
+1, 15, 19, 0.25, 0
+1, 15, 18, 0.1875, 0
+1, 14, 18, 0.25, 0.0625
+1, 15, 18, 0.25, 0
+2, 14, 18, 0.1875, 0.0625
+2, 15, 18, 0.1875, 0
+2, 14, 18, 0.1875, 0.0625
+1, 15, 18, 0.25, 0
+1, 15, 25, 0.25, 0
+1, 15, 26, 0.25, 0.0625
+2, 15, 25, 0.3125, 0
+2, 15, 25, 0.3125, 0
+1, 15, 26, 0.25, 0.0625
+2, 15, 26, 0.3125, 0.0625
+1, 15, 26, 0.25, 0
+1, 15, 27, 0.25, 0.0625
+2, 15, 26, 0.3125, 0
+2, 15, 26, 0.3125, 0
+1, 15, 27, 0.25, 0.0625
+2, 15, 27, 0.3125, 0.0625
+2, 14, 26, 0.25, 0.0625
+2, 15, 26, 0.25, 0
+2, 14, 27, 0.1875, 0.0625
+2, 14, 27, 0.1875, 0.0625
+2, 15, 26, 0.25, 0
+2, 15, 27, 0.1875, 0
+1, 15, 27, 0.25, 0
+1, 15, 28, 0.25, 0.0625
+2, 15, 27, 0.3125, 0
+2, 15, 27, 0.3125, 0
+1, 15, 28, 0.25, 0.0625
+2, 15, 28, 0.3125, 0.0625
+1, 15, 28, 0.25, 0
+1, 15, 29, 0.25, 0.0625
+2, 15, 28, 0.3125, 0
+2, 15, 28, 0.3125, 0
+1, 15, 29, 0.25, 0.0625
+2, 15, 29, 0.3125, 0.0625
+1, 15, 29, 0.25, 0
+1, 15, 30, 0.25, 0.0625
+2, 15, 29, 0.3125, 0
+2, 15, 29, 0.3125, 0
+1, 15, 30, 0.25, 0.0625
+2, 15, 30, 0.3125, 0.0625
+2, 14, 29, 0.25, 0.0625
+2, 15, 29, 0.25, 0
+2, 14, 30, 0.1875, 0.0625
+2, 14, 30, 0.1875, 0.0625
+2, 15, 29, 0.25, 0
+2, 15, 30, 0.1875, 0
+1, 15, 30, 0.25, 0
+1, 15, 31, 0.25, 0.0625
+2, 15, 30, 0.3125, 0
+2, 15, 30, 0.3125, 0
+1, 15, 31, 0.25, 0.0625
+2, 15, 31, 0.3125, 0.0625
+2, 14, 30, 0.25, 0.0625
+2, 15, 30, 0.25, 0
+2, 14, 31, 0.1875, 0.0625
+2, 14, 31, 0.1875, 0.0625
+2, 15, 30, 0.25, 0
+2, 15, 31, 0.1875, 0
+1, 15, 31, 0.25, 0
+1, 15, 32, 0.25, 0.0625
+2, 15, 31, 0.3125, 0
+2, 15, 31, 0.3125, 0
+1, 15, 32, 0.25, 0.0625
+2, 15, 32, 0.3125, 0.0625
+2, 14, 31, 0.25, 0.0625
+2, 15, 31, 0.25, 0
+2, 14, 32, 0.1875, 0.0625
+2, 14, 32, 0.1875, 0.0625
+2, 15, 31, 0.25, 0
+2, 15, 32, 0.1875, 0
+1, 14, 32, 0.1875, 0.0625
+2, 14, 32, 0.25, 0.0625
+1, 15, 32, 0.1875, 0
+2, 15, 32, 0.25, 0
+1, 15, 32, 0.1875, 0
+2, 14, 32, 0.25, 0.0625
+1, 16, 9, 0.25, 0
+1, 16, 10, 0.25, 0.0625
+2, 16, 9, 0.3125, 0
+2, 16, 9, 0.3125, 0
+1, 16, 10, 0.25, 0.0625
+2, 16, 10, 0.3125, 0.0625
+1, 15, 9, 0.1875, 0.0625
+1, 15, 10, 0.25, 0.0625
+1, 16, 9, 0.1875, 0
+1, 15, 10, 0.25, 0.0625
+1, 16, 10, 0.25, 0
+1, 16, 9, 0.1875, 0
+1, 15, 9, 0.25, 0.0625
+1, 16, 9, 0.25, 0
+2, 15, 9, 0.1875, 0.0625
+2, 16, 9, 0.1875, 0
+2, 15, 9, 0.1875, 0.0625
+1, 16, 9, 0.25, 0
+1, 16, 10, 0.25, 0
+1, 16, 11, 0.25, 0.0625
+2, 16, 10, 0.3125, 0
+2, 16, 10, 0.3125, 0
+1, 16, 11, 0.25, 0.0625
+2, 16, 11, 0.3125, 0.0625
+1, 15, 10, 0.1875, 0.0625
+1, 15, 11, 0.25, 0.0625
+1, 16, 10, 0.1875, 0
+1, 15, 11, 0.25, 0.0625
+1, 16, 11, 0.25, 0
+1, 16, 10, 0.1875, 0
+1, 16, 14, 0.25, 0
+1, 16, 15, 0.25, 0.0625
+2, 16, 14, 0.3125, 0
+2, 16, 14, 0.3125, 0
+1, 16, 15, 0.25, 0.0625
+2, 16, 15, 0.3125, 0.0625
+1, 15, 14, 0.1875, 0.0625
+1, 15, 15, 0.25, 0.0625
+1, 16, 14, 0.1875, 0
+1, 15, 15, 0.25, 0.0625
+1, 16, 15, 0.25, 0
+1, 16, 14, 0.1875, 0
+1, 15, 15, 0.1875, 0.0625
+2, 15, 15, 0.25, 0.0625
+1, 16, 15, 0.1875, 0
+2, 16, 15, 0.25, 0
+1, 16, 15, 0.1875, 0
+2, 15, 15, 0.25, 0.0625
+1, 16, 19, 0.25, 0
+1, 16, 20, 0.25, 0.0625
+2, 16, 19, 0.3125, 0
+2, 16, 19, 0.3125, 0
+1, 16, 20, 0.25, 0.0625
+2, 16, 20, 0.3125, 0.0625
+1, 15, 19, 0.1875, 0.0625
+1, 15, 20, 0.25, 0.0625
+1, 16, 19, 0.1875, 0
+1, 15, 20, 0.25, 0.0625
+1, 16, 20, 0.25, 0
+1, 16, 19, 0.1875, 0
+1, 15, 19, 0.25, 0.0625
+1, 16, 19, 0.25, 0
+2, 15, 19, 0.1875, 0.0625
+2, 16, 19, 0.1875, 0
+2, 15, 19, 0.1875, 0.0625
+1, 16, 19, 0.25, 0
+1, 16, 23, 0.25, 0
+1, 16, 24, 0.25, 0.0625
+2, 16, 23, 0.3125, 0
+2, 16, 23, 0.3125, 0
+1, 16, 24, 0.25, 0.0625
+2, 16, 24, 0.3125, 0.0625
+1, 16, 24, 0.25, 0
+1, 16, 25, 0.25, 0.0625
+2, 16, 24, 0.3125, 0
+2, 16, 24, 0.3125, 0
+1, 16, 25, 0.25, 0.0625
+2, 16, 25, 0.3125, 0.0625
+2, 15, 24, 0.25, 0.0625
+2, 16, 24, 0.25, 0
+2, 15, 25, 0.1875, 0.0625
+2, 15, 25, 0.1875, 0.0625
+2, 16, 24, 0.25, 0
+2, 16, 25, 0.1875, 0
+1, 15, 25, 0.1875, 0.0625
+2, 15, 25, 0.25, 0.0625
+1, 16, 25, 0.1875, 0
+2, 16, 25, 0.25, 0
+1, 16, 25, 0.1875, 0
+2, 15, 25, 0.25, 0.0625
+1, 17, 11, 0.25, 0
+1, 17, 12, 0.25, 0.0625
+2, 17, 11, 0.3125, 0
+2, 17, 11, 0.3125, 0
+1, 17, 12, 0.25, 0.0625
+2, 17, 12, 0.3125, 0.0625
+1, 16, 11, 0.1875, 0.0625
+1, 16, 12, 0.25, 0.0625
+1, 17, 11, 0.1875, 0
+1, 16, 12, 0.25, 0.0625
+1, 17, 12, 0.25, 0
+1, 17, 11, 0.1875, 0
+1, 16, 11, 0.25, 0.0625
+1, 17, 11, 0.25, 0
+2, 16, 11, 0.1875, 0.0625
+2, 17, 11, 0.1875, 0
+2, 16, 11, 0.1875, 0.0625
+1, 17, 11, 0.25, 0
+1, 16, 12, 0.1875, 0.0625
+1, 16, 13, 0.25, 0.0625
+1, 17, 12, 0.1875, 0
+1, 16, 13, 0.25, 0.0625
+1, 17, 13, 0.25, 0
+1, 17, 12, 0.1875, 0
+1, 17, 13, 0.25, 0
+1, 17, 14, 0.25, 0.0625
+2, 17, 13, 0.3125, 0
+2, 17, 13, 0.3125, 0
+1, 17, 14, 0.25, 0.0625
+2, 17, 14, 0.3125, 0.0625
+1, 16, 13, 0.1875, 0.0625
+1, 16, 14, 0.25, 0.0625
+1, 17, 13, 0.1875, 0
+1, 16, 14, 0.25, 0.0625
+1, 17, 14, 0.25, 0
+1, 17, 13, 0.1875, 0
+1, 16, 14, 0.1875, 0.0625
+2, 16, 14, 0.25, 0.0625
+1, 17, 14, 0.1875, 0
+2, 17, 14, 0.25, 0
+1, 17, 14, 0.1875, 0
+2, 16, 14, 0.25, 0.0625
+1, 17, 20, 0.25, 0
+1, 17, 21, 0.25, 0.0625
+2, 17, 20, 0.3125, 0
+2, 17, 20, 0.3125, 0
+1, 17, 21, 0.25, 0.0625
+2, 17, 21, 0.3125, 0.0625
+1, 16, 20, 0.1875, 0.0625
+1, 16, 21, 0.25, 0.0625
+1, 17, 20, 0.1875, 0
+1, 16, 21, 0.25, 0.0625
+1, 17, 21, 0.25, 0
+1, 17, 20, 0.1875, 0
+1, 16, 20, 0.25, 0.0625
+1, 17, 20, 0.25, 0
+2, 16, 20, 0.1875, 0.0625
+2, 17, 20, 0.1875, 0
+2, 16, 20, 0.1875, 0.0625
+1, 17, 20, 0.25, 0
+1, 17, 22, 0.25, 0
+1, 17, 23, 0.25, 0.0625
+2, 17, 22, 0.3125, 0
+2, 17, 22, 0.3125, 0
+1, 17, 23, 0.25, 0.0625
+2, 17, 23, 0.3125, 0.0625
+1, 16, 23, 0.1875, 0.0625
+2, 16, 23, 0.25, 0.0625
+1, 17, 23, 0.1875, 0
+2, 17, 23, 0.25, 0
+1, 17, 23, 0.1875, 0
+2, 16, 23, 0.25, 0.0625
+1, 18, 12, 0.25, 0
+1, 18, 13, 0.25, 0.0625
+2, 18, 12, 0.3125, 0
+2, 18, 12, 0.3125, 0
+1, 18, 13, 0.25, 0.0625
+2, 18, 13, 0.3125, 0.0625
+1, 17, 12, 0.1875, 0.0625
+1, 17, 13, 0.25, 0.0625
+1, 18, 12, 0.1875, 0
+1, 17, 13, 0.25, 0.0625
+1, 18, 13, 0.25, 0
+1, 18, 12, 0.1875, 0
+1, 17, 13, 0.1875, 0.0625
+2, 17, 13, 0.25, 0.0625
+1, 18, 13, 0.1875, 0
+2, 18, 13, 0.25, 0
+1, 18, 13, 0.1875, 0
+2, 17, 13, 0.25, 0.0625
+1, 17, 12, 0.25, 0.0625
+1, 18, 12, 0.25, 0
+2, 17, 12, 0.1875, 0.0625
+2, 18, 12, 0.1875, 0
+2, 17, 12, 0.1875, 0.0625
+1, 18, 12, 0.25, 0
+1, 18, 21, 0.25, 0
+1, 18, 22, 0.25, 0.0625
+2, 18, 21, 0.3125, 0
+2, 18, 21, 0.3125, 0
+1, 18, 22, 0.25, 0.0625
+2, 18, 22, 0.3125, 0.0625
+1, 17, 21, 0.1875, 0.0625
+1, 17, 22, 0.25, 0.0625
+1, 18, 21, 0.1875, 0
+1, 17, 22, 0.25, 0.0625
+1, 18, 22, 0.25, 0
+1, 18, 21, 0.1875, 0
+2, 17, 21, 0.25, 0.0625
+2, 18, 21, 0.25, 0
+2, 17, 22, 0.1875, 0.0625
+2, 17, 22, 0.1875, 0.0625
+2, 18, 21, 0.25, 0
+2, 18, 22, 0.1875, 0
+1, 17, 22, 0.1875, 0.0625
+2, 17, 22, 0.25, 0.0625
+1, 18, 22, 0.1875, 0
+2, 18, 22, 0.25, 0
+1, 18, 22, 0.1875, 0
+2, 17, 22, 0.25, 0.0625
+1, 17, 21, 0.25, 0.0625
+1, 18, 21, 0.25, 0
+2, 17, 21, 0.1875, 0.0625
+2, 18, 21, 0.1875, 0
+2, 17, 21, 0.1875, 0.0625
+1, 18, 21, 0.25, 0
+2, 0, 0, 0.125, 0
+3, 0, 0, 0.1875, 0
+2, 0, 1, 0.125, 0.0625
+3, 0, 0, 0.1875, 0
+3, 0, 1, 0.1875, 0.0625
+2, 0, 1, 0.125, 0.0625
+2, 0, 1, 0.125, 0
+3, 0, 1, 0.1875, 0
+2, 0, 2, 0.125, 0.0625
+3, 0, 1, 0.1875, 0
+3, 0, 2, 0.1875, 0.0625
+2, 0, 2, 0.125, 0.0625
+2, 0, 2, 0.125, 0
+3, 0, 2, 0.1875, 0
+2, 0, 3, 0.125, 0.0625
+3, 0, 2, 0.1875, 0
+3, 0, 3, 0.1875, 0.0625
+2, 0, 3, 0.125, 0.0625
+2, 0, 3, 0.125, 0
+3, 0, 3, 0.1875, 0
+2, 0, 4, 0.125, 0.0625
+3, 0, 3, 0.1875, 0
+3, 0, 4, 0.1875, 0.0625
+2, 0, 4, 0.125, 0.0625
+2, 0, 4, 0.125, 0
+3, 0, 4, 0.1875, 0
+2, 0, 5, 0.125, 0.0625
+3, 0, 4, 0.1875, 0
+3, 0, 5, 0.1875, 0.0625
+2, 0, 5, 0.125, 0.0625
+2, 0, 5, 0.125, 0
+3, 0, 5, 0.1875, 0
+2, 0, 6, 0.125, 0.0625
+3, 0, 5, 0.1875, 0
+3, 0, 6, 0.1875, 0.0625
+2, 0, 6, 0.125, 0.0625
+2, 0, 6, 0.125, 0
+3, 0, 6, 0.1875, 0
+2, 0, 7, 0.125, 0.0625
+3, 0, 6, 0.1875, 0
+3, 0, 7, 0.1875, 0.0625
+2, 0, 7, 0.125, 0.0625
+2, 0, 7, 0.125, 0
+3, 0, 7, 0.1875, 0
+2, 0, 8, 0.125, 0.0625
+3, 0, 7, 0.1875, 0
+3, 0, 8, 0.1875, 0.0625
+2, 0, 8, 0.125, 0.0625
+2, 0, 8, 0.125, 0
+3, 0, 8, 0.1875, 0
+2, 0, 9, 0.125, 0.0625
+3, 0, 8, 0.1875, 0
+3, 0, 9, 0.1875, 0.0625
+2, 0, 9, 0.125, 0.0625
+2, 0, 9, 0.125, 0
+3, 0, 9, 0.1875, 0
+2, 0, 10, 0.125, 0.0625
+3, 0, 9, 0.1875, 0
+3, 0, 10, 0.1875, 0.0625
+2, 0, 10, 0.125, 0.0625
+2, 0, 10, 0.125, 0
+3, 0, 10, 0.1875, 0
+2, 0, 11, 0.125, 0.0625
+3, 0, 10, 0.1875, 0
+3, 0, 11, 0.1875, 0.0625
+2, 0, 11, 0.125, 0.0625
+2, 0, 11, 0.125, 0
+3, 0, 11, 0.1875, 0
+2, 0, 12, 0.125, 0.0625
+3, 0, 11, 0.1875, 0
+3, 0, 12, 0.1875, 0.0625
+2, 0, 12, 0.125, 0.0625
+2, 0, 12, 0.125, 0
+3, 0, 12, 0.1875, 0
+2, 0, 13, 0.125, 0.0625
+3, 0, 12, 0.1875, 0
+3, 0, 13, 0.1875, 0.0625
+2, 0, 13, 0.125, 0.0625
+2, 0, 13, 0.125, 0
+3, 0, 13, 0.1875, 0
+2, 0, 14, 0.125, 0.0625
+3, 0, 13, 0.1875, 0
+3, 0, 14, 0.1875, 0.0625
+2, 0, 14, 0.125, 0.0625
+2, 0, 14, 0.125, 0
+3, 0, 14, 0.1875, 0
+2, 0, 15, 0.125, 0.0625
+3, 0, 14, 0.1875, 0
+3, 0, 15, 0.1875, 0.0625
+2, 0, 15, 0.125, 0.0625
+2, 0, 15, 0.125, 0
+3, 0, 15, 0.1875, 0
+2, 0, 16, 0.125, 0.0625
+3, 0, 15, 0.1875, 0
+3, 0, 16, 0.1875, 0.0625
+2, 0, 16, 0.125, 0.0625
+2, 0, 16, 0.125, 0
+3, 0, 16, 0.1875, 0
+2, 0, 17, 0.125, 0.0625
+3, 0, 16, 0.1875, 0
+3, 0, 17, 0.1875, 0.0625
+2, 0, 17, 0.125, 0.0625
+2, 0, 17, 0.125, 0
+3, 0, 17, 0.1875, 0
+2, 0, 18, 0.125, 0.0625
+3, 0, 17, 0.1875, 0
+3, 0, 18, 0.1875, 0.0625
+2, 0, 18, 0.125, 0.0625
+2, 0, 18, 0.125, 0
+3, 0, 18, 0.1875, 0
+2, 0, 19, 0.125, 0.0625
+3, 0, 18, 0.1875, 0
+3, 0, 19, 0.1875, 0.0625
+2, 0, 19, 0.125, 0.0625
+2, 0, 19, 0.125, 0
+3, 0, 19, 0.1875, 0
+2, 0, 20, 0.125, 0.0625
+3, 0, 19, 0.1875, 0
+3, 0, 20, 0.1875, 0.0625
+2, 0, 20, 0.125, 0.0625
+2, 0, 20, 0.125, 0
+3, 0, 20, 0.1875, 0
+2, 0, 21, 0.125, 0.0625
+3, 0, 20, 0.1875, 0
+3, 0, 21, 0.1875, 0.0625
+2, 0, 21, 0.125, 0.0625
+2, 0, 21, 0.125, 0
+3, 0, 21, 0.1875, 0
+2, 0, 22, 0.125, 0.0625
+3, 0, 21, 0.1875, 0
+3, 0, 22, 0.1875, 0.0625
+2, 0, 22, 0.125, 0.0625
+2, 0, 22, 0.125, 0
+3, 0, 22, 0.1875, 0
+2, 0, 23, 0.125, 0.0625
+3, 0, 22, 0.1875, 0
+3, 0, 23, 0.1875, 0.0625
+2, 0, 23, 0.125, 0.0625
+2, 0, 23, 0.125, 0
+3, 0, 23, 0.1875, 0
+2, 0, 24, 0.125, 0.0625
+3, 0, 23, 0.1875, 0
+3, 0, 24, 0.1875, 0.0625
+2, 0, 24, 0.125, 0.0625
+2, 0, 24, 0.125, 0
+3, 0, 24, 0.1875, 0
+2, 0, 25, 0.125, 0.0625
+3, 0, 24, 0.1875, 0
+3, 0, 25, 0.1875, 0.0625
+2, 0, 25, 0.125, 0.0625
+2, 0, 25, 0.125, 0
+3, 0, 25, 0.1875, 0
+2, 0, 26, 0.125, 0.0625
+3, 0, 25, 0.1875, 0
+3, 0, 26, 0.1875, 0.0625
+2, 0, 26, 0.125, 0.0625
+2, 0, 26, 0.125, 0
+3, 0, 26, 0.1875, 0
+2, 0, 27, 0.125, 0.0625
+3, 0, 26, 0.1875, 0
+3, 0, 27, 0.1875, 0.0625
+2, 0, 27, 0.125, 0.0625
+2, 0, 27, 0.125, 0
+3, 0, 27, 0.1875, 0
+2, 0, 28, 0.125, 0.0625
+3, 0, 27, 0.1875, 0
+3, 0, 28, 0.1875, 0.0625
+2, 0, 28, 0.125, 0.0625
+2, 0, 28, 0.125, 0
+3, 0, 28, 0.1875, 0
+2, 0, 29, 0.125, 0.0625
+3, 0, 28, 0.1875, 0
+3, 0, 29, 0.1875, 0.0625
+2, 0, 29, 0.125, 0.0625
+2, 0, 29, 0.125, 0
+3, 0, 29, 0.1875, 0
+2, 0, 30, 0.125, 0.0625
+3, 0, 29, 0.1875, 0
+3, 0, 30, 0.1875, 0.0625
+2, 0, 30, 0.125, 0.0625
+2, 0, 30, 0.125, 0
+3, 0, 30, 0.1875, 0
+2, 0, 31, 0.125, 0.0625
+3, 0, 30, 0.1875, 0
+3, 0, 31, 0.1875, 0.0625
+2, 0, 31, 0.125, 0.0625
+2, 0, 31, 0.125, 0
+3, 0, 31, 0.1875, 0
+2, 0, 32, 0.125, 0.0625
+3, 0, 31, 0.1875, 0
+3, 0, 32, 0.1875, 0.0625
+2, 0, 32, 0.125, 0.0625
+2, 12, 1, 0.25, 0
+2, 12, 2, 0.25, 0.0625
+3, 12, 1, 0.3125, 0
+3, 12, 1, 0.3125, 0
+2, 12, 2, 0.25, 0.0625
+3, 12, 2, 0.3125, 0.0625
+2, 12, 2, 0.25, 0
+2, 12, 3, 0.25, 0.0625
+3, 12, 2, 0.3125, 0
+3, 12, 2, 0.3125, 0
+2, 12, 3, 0.25, 0.0625
+3, 12, 3, 0.3125, 0.0625
+2, 12, 3, 0.25, 0
+2, 12, 4, 0.25, 0.0625
+3, 12, 3, 0.3125, 0
+3, 12, 3, 0.3125, 0
+2, 12, 4, 0.25, 0.0625
+3, 12, 4, 0.3125, 0.0625
+2, 11, 3, 0.1875, 0.0625
+2, 11, 4, 0.25, 0.0625
+2, 12, 3, 0.1875, 0
+2, 11, 4, 0.25, 0.0625
+2, 12, 4, 0.25, 0
+2, 12, 3, 0.1875, 0
+2, 13, 0, 0.25, 0
+2, 13, 1, 0.25, 0.0625
+3, 13, 0, 0.3125, 0
+3, 13, 0, 0.3125, 0
+2, 13, 1, 0.25, 0.0625
+3, 13, 1, 0.3125, 0.0625
+2, 12, 1, 0.1875, 0.0625
+3, 12, 1, 0.25, 0.0625
+2, 13, 1, 0.1875, 0
+3, 13, 1, 0.25, 0
+2, 13, 1, 0.1875, 0
+3, 12, 1, 0.25, 0.0625
+2, 13, 4, 0.25, 0
+2, 13, 5, 0.25, 0.0625
+3, 13, 4, 0.3125, 0
+3, 13, 4, 0.3125, 0
+2, 13, 5, 0.25, 0.0625
+3, 13, 5, 0.3125, 0.0625
+2, 12, 4, 0.1875, 0.0625
+2, 12, 5, 0.25, 0.0625
+2, 13, 4, 0.1875, 0
+2, 12, 5, 0.25, 0.0625
+2, 13, 5, 0.25, 0
+2, 13, 4, 0.1875, 0
+2, 12, 4, 0.25, 0.0625
+2, 13, 4, 0.25, 0
+3, 12, 4, 0.1875, 0.0625
+3, 13, 4, 0.1875, 0
+3, 12, 4, 0.1875, 0.0625
+2, 13, 4, 0.25, 0
+2, 13, 31, 0.25, 0
+2, 13, 32, 0.25, 0.0625
+3, 13, 31, 0.3125, 0
+3, 13, 31, 0.3125, 0
+2, 13, 32, 0.25, 0.0625
+3, 13, 32, 0.3125, 0.0625
+2, 14, 5, 0.25, 0
+2, 14, 6, 0.25, 0.0625
+3, 14, 5, 0.3125, 0
+3, 14, 5, 0.3125, 0
+2, 14, 6, 0.25, 0.0625
+3, 14, 6, 0.3125, 0.0625
+2, 13, 5, 0.1875, 0.0625
+2, 13, 6, 0.25, 0.0625
+2, 14, 5, 0.1875, 0
+2, 13, 6, 0.25, 0.0625
+2, 14, 6, 0.25, 0
+2, 14, 5, 0.1875, 0
+2, 13, 5, 0.25, 0.0625
+2, 14, 5, 0.25, 0
+3, 13, 5, 0.1875, 0.0625
+3, 14, 5, 0.1875, 0
+3, 13, 5, 0.1875, 0.0625
+2, 14, 5, 0.25, 0
+2, 14, 26, 0.25, 0
+2, 14, 27, 0.25, 0.0625
+3, 14, 26, 0.3125, 0
+3, 14, 26, 0.3125, 0
+2, 14, 27, 0.25, 0.0625
+3, 14, 27, 0.3125, 0.0625
+2, 14, 29, 0.25, 0
+2, 14, 30, 0.25, 0.0625
+3, 14, 29, 0.3125, 0
+3, 14, 29, 0.3125, 0
+2, 14, 30, 0.25, 0.0625
+3, 14, 30, 0.3125, 0.0625
+2, 14, 30, 0.25, 0
+2, 14, 31, 0.25, 0.0625
+3, 14, 30, 0.3125, 0
+3, 14, 30, 0.3125, 0
+2, 14, 31, 0.25, 0.0625
+3, 14, 31, 0.3125, 0.0625
+3, 13, 30, 0.25, 0.0625
+3, 14, 30, 0.25, 0
+3, 13, 31, 0.1875, 0.0625
+3, 13, 31, 0.1875, 0.0625
+3, 14, 30, 0.25, 0
+3, 14, 31, 0.1875, 0
+2, 13, 31, 0.1875, 0.0625
+3, 13, 31, 0.25, 0.0625
+2, 14, 31, 0.1875, 0
+3, 14, 31, 0.25, 0
+2, 14, 31, 0.1875, 0
+3, 13, 31, 0.25, 0.0625
+2, 15, 6, 0.25, 0
+2, 15, 7, 0.25, 0.0625
+3, 15, 6, 0.3125, 0
+3, 15, 6, 0.3125, 0
+2, 15, 7, 0.25, 0.0625
+3, 15, 7, 0.3125, 0.0625
+2, 14, 6, 0.1875, 0.0625
+2, 14, 7, 0.25, 0.0625
+2, 15, 6, 0.1875, 0
+2, 14, 7, 0.25, 0.0625
+2, 15, 7, 0.25, 0
+2, 15, 6, 0.1875, 0
+2, 14, 6, 0.25, 0.0625
+2, 15, 6, 0.25, 0
+3, 14, 6, 0.1875, 0.0625
+3, 15, 6, 0.1875, 0
+3, 14, 6, 0.1875, 0.0625
+2, 15, 6, 0.25, 0
+2, 14, 15, 0.1875, 0.0625
+2, 14, 16, 0.25, 0.0625
+2, 15, 15, 0.1875, 0
+2, 14, 16, 0.25, 0.0625
+2, 15, 16, 0.25, 0
+2, 15, 15, 0.1875, 0
+2, 15, 16, 0.25, 0
+2, 15, 17, 0.25, 0.0625
+3, 15, 16, 0.3125, 0
+3, 15, 16, 0.3125, 0
+2, 15, 17, 0.25, 0.0625
+3, 15, 17, 0.3125, 0.0625
+2, 14, 16, 0.1875, 0.0625
+2, 14, 17, 0.25, 0.0625
+2, 15, 16, 0.1875, 0
+2, 14, 17, 0.25, 0.0625
+2, 15, 17, 0.25, 0
+2, 15, 16, 0.1875, 0
+2, 15, 17, 0.25, 0
+2, 15, 18, 0.25, 0.0625
+3, 15, 17, 0.3125, 0
+3, 15, 17, 0.3125, 0
+2, 15, 18, 0.25, 0.0625
+3, 15, 18, 0.3125, 0.0625
+2, 14, 17, 0.1875, 0.0625
+2, 14, 18, 0.25, 0.0625
+2, 15, 17, 0.1875, 0
+2, 14, 18, 0.25, 0.0625
+2, 15, 18, 0.25, 0
+2, 15, 17, 0.1875, 0
+2, 15, 24, 0.25, 0
+2, 15, 25, 0.25, 0.0625
+3, 15, 24, 0.3125, 0
+3, 15, 24, 0.3125, 0
+2, 15, 25, 0.25, 0.0625
+3, 15, 25, 0.3125, 0.0625
+2, 15, 25, 0.25, 0
+2, 15, 26, 0.25, 0.0625
+3, 15, 25, 0.3125, 0
+3, 15, 25, 0.3125, 0
+2, 15, 26, 0.25, 0.0625
+3, 15, 26, 0.3125, 0.0625
+2, 14, 26, 0.1875, 0.0625
+3, 14, 26, 0.25, 0.0625
+2, 15, 26, 0.1875, 0
+3, 15, 26, 0.25, 0
+2, 15, 26, 0.1875, 0
+3, 14, 26, 0.25, 0.0625
+2, 15, 27, 0.25, 0
+2, 15, 28, 0.25, 0.0625
+3, 15, 27, 0.3125, 0
+3, 15, 27, 0.3125, 0
+2, 15, 28, 0.25, 0.0625
+3, 15, 28, 0.3125, 0.0625
+2, 14, 27, 0.25, 0.0625
+2, 15, 27, 0.25, 0
+3, 14, 27, 0.1875, 0.0625
+3, 15, 27, 0.1875, 0
+3, 14, 27, 0.1875, 0.0625
+2, 15, 27, 0.25, 0
+2, 15, 28, 0.25, 0
+2, 15, 29, 0.25, 0.0625
+3, 15, 28, 0.3125, 0
+3, 15, 28, 0.3125, 0
+2, 15, 29, 0.25, 0.0625
+3, 15, 29, 0.3125, 0.0625
+2, 14, 29, 0.1875, 0.0625
+3, 14, 29, 0.25, 0.0625
+2, 15, 29, 0.1875, 0
+3, 15, 29, 0.25, 0
+2, 15, 29, 0.1875, 0
+3, 14, 29, 0.25, 0.0625
+2, 16, 7, 0.25, 0
+2, 16, 8, 0.25, 0.0625
+3, 16, 7, 0.3125, 0
+3, 16, 7, 0.3125, 0
+2, 16, 8, 0.25, 0.0625
+3, 16, 8, 0.3125, 0.0625
+2, 15, 7, 0.1875, 0.0625
+2, 15, 8, 0.25, 0.0625
+2, 16, 7, 0.1875, 0
+2, 15, 8, 0.25, 0.0625
+2, 16, 8, 0.25, 0
+2, 16, 7, 0.1875, 0
+2, 15, 7, 0.25, 0.0625
+2, 16, 7, 0.25, 0
+3, 15, 7, 0.1875, 0.0625
+3, 16, 7, 0.1875, 0
+3, 15, 7, 0.1875, 0.0625
+2, 16, 7, 0.25, 0
+2, 16, 8, 0.25, 0
+2, 16, 9, 0.25, 0.0625
+3, 16, 8, 0.3125, 0
+3, 16, 8, 0.3125, 0
+2, 16, 9, 0.25, 0.0625
+3, 16, 9, 0.3125, 0.0625
+2, 15, 8, 0.1875, 0.0625
+2, 15, 9, 0.25, 0.0625
+2, 16, 8, 0.1875, 0
+2, 15, 9, 0.25, 0.0625
+2, 16, 9, 0.25, 0
+2, 16, 8, 0.1875, 0
+2, 16, 15, 0.25, 0
+2, 16, 16, 0.25, 0.0625
+3, 16, 15, 0.3125, 0
+3, 16, 15, 0.3125, 0
+2, 16, 16, 0.25, 0.0625
+3, 16, 16, 0.3125, 0.0625
+2, 15, 15, 0.1875, 0.0625
+2, 15, 16, 0.25, 0.0625
+2, 16, 15, 0.1875, 0
+2, 15, 16, 0.25, 0.0625
+2, 16, 16, 0.25, 0
+2, 16, 15, 0.1875, 0
+2, 15, 16, 0.1875, 0.0625
+3, 15, 16, 0.25, 0.0625
+2, 16, 16, 0.1875, 0
+3, 16, 16, 0.25, 0
+2, 16, 16, 0.1875, 0
+3, 15, 16, 0.25, 0.0625
+2, 16, 18, 0.25, 0
+2, 16, 19, 0.25, 0.0625
+3, 16, 18, 0.3125, 0
+3, 16, 18, 0.3125, 0
+2, 16, 19, 0.25, 0.0625
+3, 16, 19, 0.3125, 0.0625
+2, 15, 18, 0.1875, 0.0625
+2, 15, 19, 0.25, 0.0625
+2, 16, 18, 0.1875, 0
+2, 15, 19, 0.25, 0.0625
+2, 16, 19, 0.25, 0
+2, 16, 18, 0.1875, 0
+2, 15, 18, 0.25, 0.0625
+2, 16, 18, 0.25, 0
+3, 15, 18, 0.1875, 0.0625
+3, 16, 18, 0.1875, 0
+3, 15, 18, 0.1875, 0.0625
+2, 16, 18, 0.25, 0
+2, 16, 23, 0.25, 0
+2, 16, 24, 0.25, 0.0625
+3, 16, 23, 0.3125, 0
+3, 16, 23, 0.3125, 0
+2, 16, 24, 0.25, 0.0625
+3, 16, 24, 0.3125, 0.0625
+3, 15, 23, 0.25, 0.0625
+3, 16, 23, 0.25, 0
+3, 15, 24, 0.1875, 0.0625
+3, 15, 24, 0.1875, 0.0625
+3, 16, 23, 0.25, 0
+3, 16, 24, 0.1875, 0
+2, 15, 24, 0.1875, 0.0625
+3, 15, 24, 0.25, 0.0625
+2, 16, 24, 0.1875, 0
+3, 16, 24, 0.25, 0
+2, 16, 24, 0.1875, 0
+3, 15, 24, 0.25, 0.0625
+2, 17, 9, 0.25, 0
+2, 17, 10, 0.25, 0.0625
+3, 17, 9, 0.3125, 0
+3, 17, 9, 0.3125, 0
+2, 17, 10, 0.25, 0.0625
+3, 17, 10, 0.3125, 0.0625
+2, 16, 9, 0.1875, 0.0625
+2, 16, 10, 0.25, 0.0625
+2, 17, 9, 0.1875, 0
+2, 16, 10, 0.25, 0.0625
+2, 17, 10, 0.25, 0
+2, 17, 9, 0.1875, 0
+2, 16, 9, 0.25, 0.0625
+2, 17, 9, 0.25, 0
+3, 16, 9, 0.1875, 0.0625
+3, 17, 9, 0.1875, 0
+3, 16, 9, 0.1875, 0.0625
+2, 17, 9, 0.25, 0
+2, 17, 10, 0.25, 0
+2, 17, 11, 0.25, 0.0625
+3, 17, 10, 0.3125, 0
+3, 17, 10, 0.3125, 0
+2, 17, 11, 0.25, 0.0625
+3, 17, 11, 0.3125, 0.0625
+2, 16, 10, 0.1875, 0.0625
+2, 16, 11, 0.25, 0.0625
+2, 17, 10, 0.1875, 0
+2, 16, 11, 0.25, 0.0625
+2, 17, 11, 0.25, 0
+2, 17, 10, 0.1875, 0
+2, 17, 14, 0.25, 0
+2, 17, 15, 0.25, 0.0625
+3, 17, 14, 0.3125, 0
+3, 17, 14, 0.3125, 0
+2, 17, 15, 0.25, 0.0625
+3, 17, 15, 0.3125, 0.0625
+2, 16, 14, 0.1875, 0.0625
+2, 16, 15, 0.25, 0.0625
+2, 17, 14, 0.1875, 0
+2, 16, 15, 0.25, 0.0625
+2, 17, 15, 0.25, 0
+2, 17, 14, 0.1875, 0
+2, 16, 15, 0.1875, 0.0625
+3, 16, 15, 0.25, 0.0625
+2, 17, 15, 0.1875, 0
+3, 17, 15, 0.25, 0
+2, 17, 15, 0.1875, 0
+3, 16, 15, 0.25, 0.0625
+2, 17, 19, 0.25, 0
+2, 17, 20, 0.25, 0.0625
+3, 17, 19, 0.3125, 0
+3, 17, 19, 0.3125, 0
+2, 17, 20, 0.25, 0.0625
+3, 17, 20, 0.3125, 0.0625
+2, 16, 19, 0.1875, 0.0625
+2, 16, 20, 0.25, 0.0625
+2, 17, 19, 0.1875, 0
+2, 16, 20, 0.25, 0.0625
+2, 17, 20, 0.25, 0
+2, 17, 19, 0.1875, 0
+3, 16, 19, 0.25, 0.0625
+3, 17, 19, 0.25, 0
+3, 16, 20, 0.1875, 0.0625
+3, 16, 20, 0.1875, 0.0625
+3, 17, 19, 0.25, 0
+3, 17, 20, 0.1875, 0
+2, 16, 19, 0.25, 0.0625
+2, 17, 19, 0.25, 0
+3, 16, 19, 0.1875, 0.0625
+3, 17, 19, 0.1875, 0
+3, 16, 19, 0.1875, 0.0625
+2, 17, 19, 0.25, 0
+2, 17, 20, 0.25, 0
+2, 17, 21, 0.25, 0.0625
+3, 17, 20, 0.3125, 0
+3, 17, 20, 0.3125, 0
+2, 17, 21, 0.25, 0.0625
+3, 17, 21, 0.3125, 0.0625
+3, 16, 20, 0.25, 0.0625
+3, 17, 20, 0.25, 0
+3, 16, 21, 0.1875, 0.0625
+3, 16, 21, 0.1875, 0.0625
+3, 17, 20, 0.25, 0
+3, 17, 21, 0.1875, 0
+2, 17, 21, 0.25, 0
+2, 17, 22, 0.25, 0.0625
+3, 17, 21, 0.3125, 0
+3, 17, 21, 0.3125, 0
+2, 17, 22, 0.25, 0.0625
+3, 17, 22, 0.3125, 0.0625
+3, 16, 21, 0.25, 0.0625
+3, 17, 21, 0.25, 0
+3, 16, 22, 0.1875, 0.0625
+3, 16, 22, 0.1875, 0.0625
+3, 17, 21, 0.25, 0
+3, 17, 22, 0.1875, 0
+2, 17, 22, 0.25, 0
+2, 17, 23, 0.25, 0.0625
+3, 17, 22, 0.3125, 0
+3, 17, 22, 0.3125, 0
+2, 17, 23, 0.25, 0.0625
+3, 17, 23, 0.3125, 0.0625
+3, 16, 22, 0.25, 0.0625
+3, 17, 22, 0.25, 0
+3, 16, 23, 0.1875, 0.0625
+3, 16, 23, 0.1875, 0.0625
+3, 17, 22, 0.25, 0
+3, 17, 23, 0.1875, 0
+2, 16, 23, 0.1875, 0.0625
+3, 16, 23, 0.25, 0.0625
+2, 17, 23, 0.1875, 0
+3, 17, 23, 0.25, 0
+2, 17, 23, 0.1875, 0
+3, 16, 23, 0.25, 0.0625
+2, 18, 11, 0.25, 0
+2, 18, 12, 0.25, 0.0625
+3, 18, 11, 0.3125, 0
+3, 18, 11, 0.3125, 0
+2, 18, 12, 0.25, 0.0625
+3, 18, 12, 0.3125, 0.0625
+2, 17, 11, 0.1875, 0.0625
+2, 17, 12, 0.25, 0.0625
+2, 18, 11, 0.1875, 0
+2, 17, 12, 0.25, 0.0625
+2, 18, 12, 0.25, 0
+2, 18, 11, 0.1875, 0
+2, 17, 11, 0.25, 0.0625
+2, 18, 11, 0.25, 0
+3, 17, 11, 0.1875, 0.0625
+3, 18, 11, 0.1875, 0
+3, 17, 11, 0.1875, 0.0625
+2, 18, 11, 0.25, 0
+2, 18, 13, 0.25, 0
+2, 18, 14, 0.25, 0.0625
+3, 18, 13, 0.3125, 0
+3, 18, 13, 0.3125, 0
+2, 18, 14, 0.25, 0.0625
+3, 18, 14, 0.3125, 0.0625
+2, 17, 13, 0.1875, 0.0625
+2, 17, 14, 0.25, 0.0625
+2, 18, 13, 0.1875, 0
+2, 17, 14, 0.25, 0.0625
+2, 18, 14, 0.25, 0
+2, 18, 13, 0.1875, 0
+2, 17, 14, 0.1875, 0.0625
+3, 17, 14, 0.25, 0.0625
+2, 18, 14, 0.1875, 0
+3, 18, 14, 0.25, 0
+2, 18, 14, 0.1875, 0
+3, 17, 14, 0.25, 0.0625
+2, 19, 12, 0.25, 0
+2, 19, 13, 0.25, 0.0625
+3, 19, 12, 0.3125, 0
+3, 19, 12, 0.3125, 0
+2, 19, 13, 0.25, 0.0625
+3, 19, 13, 0.3125, 0.0625
+2, 18, 12, 0.1875, 0.0625
+2, 18, 13, 0.25, 0.0625
+2, 19, 12, 0.1875, 0
+2, 18, 13, 0.25, 0.0625
+2, 19, 13, 0.25, 0
+2, 19, 12, 0.1875, 0
+2, 18, 13, 0.1875, 0.0625
+3, 18, 13, 0.25, 0.0625
+2, 19, 13, 0.1875, 0
+3, 19, 13, 0.25, 0
+2, 19, 13, 0.1875, 0
+3, 18, 13, 0.25, 0.0625
+2, 18, 12, 0.25, 0.0625
+2, 19, 12, 0.25, 0
+3, 18, 12, 0.1875, 0.0625
+3, 19, 12, 0.1875, 0
+3, 18, 12, 0.1875, 0.0625
+2, 19, 12, 0.25, 0
+3, 0, 0, 0.125, 0
+4, 0, 0, 0.1875, 0
+3, 0, 1, 0.125, 0.0625
+4, 0, 0, 0.1875, 0
+4, 0, 1, 0.1875, 0.0625
+3, 0, 1, 0.125, 0.0625
+3, 0, 1, 0.125, 0
+4, 0, 1, 0.1875, 0
+3, 0, 2, 0.125, 0.0625
+4, 0, 1, 0.1875, 0
+4, 0, 2, 0.1875, 0.0625
+3, 0, 2, 0.125, 0.0625
+3, 0, 2, 0.125, 0
+4, 0, 2, 0.1875, 0
+3, 0, 3, 0.125, 0.0625
+4, 0, 2, 0.1875, 0
+4, 0, 3, 0.1875, 0.0625
+3, 0, 3, 0.125, 0.0625
+3, 0, 3, 0.125, 0
+4, 0, 3, 0.1875, 0
+3, 0, 4, 0.125, 0.0625
+4, 0, 3, 0.1875, 0
+4, 0, 4, 0.1875, 0.0625
+3, 0, 4, 0.125, 0.0625
+3, 0, 4, 0.125, 0
+4, 0, 4, 0.1875, 0
+3, 0, 5, 0.125, 0.0625
+4, 0, 4, 0.1875, 0
+4, 0, 5, 0.1875, 0.0625
+3, 0, 5, 0.125, 0.0625
+3, 0, 5, 0.125, 0
+4, 0, 5, 0.1875, 0
+3, 0, 6, 0.125, 0.0625
+4, 0, 5, 0.1875, 0
+4, 0, 6, 0.1875, 0.0625
+3, 0, 6, 0.125, 0.0625
+3, 0, 6, 0.125, 0
+4, 0, 6, 0.1875, 0
+3, 0, 7, 0.125, 0.0625
+4, 0, 6, 0.1875, 0
+4, 0, 7, 0.1875, 0.0625
+3, 0, 7, 0.125, 0.0625
+3, 0, 7, 0.125, 0
+4, 0, 7, 0.1875, 0
+3, 0, 8, 0.125, 0.0625
+4, 0, 7, 0.1875, 0
+4, 0, 8, 0.1875, 0.0625
+3, 0, 8, 0.125, 0.0625
+3, 0, 8, 0.125, 0
+4, 0, 8, 0.1875, 0
+3, 0, 9, 0.125, 0.0625
+4, 0, 8, 0.1875, 0
+4, 0, 9, 0.1875, 0.0625
+3, 0, 9, 0.125, 0.0625
+3, 0, 9, 0.125, 0
+4, 0, 9, 0.1875, 0
+3, 0, 10, 0.125, 0.0625
+4, 0, 9, 0.1875, 0
+4, 0, 10, 0.1875, 0.0625
+3, 0, 10, 0.125, 0.0625
+3, 0, 10, 0.125, 0
+4, 0, 10, 0.1875, 0
+3, 0, 11, 0.125, 0.0625
+4, 0, 10, 0.1875, 0
+4, 0, 11, 0.1875, 0.0625
+3, 0, 11, 0.125, 0.0625
+3, 0, 11, 0.125, 0
+4, 0, 11, 0.1875, 0
+3, 0, 12, 0.125, 0.0625
+4, 0, 11, 0.1875, 0
+4, 0, 12, 0.1875, 0.0625
+3, 0, 12, 0.125, 0.0625
+3, 0, 12, 0.125, 0
+4, 0, 12, 0.1875, 0
+3, 0, 13, 0.125, 0.0625
+4, 0, 12, 0.1875, 0
+4, 0, 13, 0.1875, 0.0625
+3, 0, 13, 0.125, 0.0625
+3, 0, 13, 0.125, 0
+4, 0, 13, 0.1875, 0
+3, 0, 14, 0.125, 0.0625
+4, 0, 13, 0.1875, 0
+4, 0, 14, 0.1875, 0.0625
+3, 0, 14, 0.125, 0.0625
+3, 0, 14, 0.125, 0
+4, 0, 14, 0.1875, 0
+3, 0, 15, 0.125, 0.0625
+4, 0, 14, 0.1875, 0
+4, 0, 15, 0.1875, 0.0625
+3, 0, 15, 0.125, 0.0625
+3, 0, 15, 0.125, 0
+4, 0, 15, 0.1875, 0
+3, 0, 16, 0.125, 0.0625
+4, 0, 15, 0.1875, 0
+4, 0, 16, 0.1875, 0.0625
+3, 0, 16, 0.125, 0.0625
+3, 0, 16, 0.125, 0
+4, 0, 16, 0.1875, 0
+3, 0, 17, 0.125, 0.0625
+4, 0, 16, 0.1875, 0
+4, 0, 17, 0.1875, 0.0625
+3, 0, 17, 0.125, 0.0625
+3, 0, 17, 0.125, 0
+4, 0, 17, 0.1875, 0
+3, 0, 18, 0.125, 0.0625
+4, 0, 17, 0.1875, 0
+4, 0, 18, 0.1875, 0.0625
+3, 0, 18, 0.125, 0.0625
+3, 0, 18, 0.125, 0
+4, 0, 18, 0.1875, 0
+3, 0, 19, 0.125, 0.0625
+4, 0, 18, 0.1875, 0
+4, 0, 19, 0.1875, 0.0625
+3, 0, 19, 0.125, 0.0625
+3, 0, 19, 0.125, 0
+4, 0, 19, 0.1875, 0
+3, 0, 20, 0.125, 0.0625
+4, 0, 19, 0.1875, 0
+4, 0, 20, 0.1875, 0.0625
+3, 0, 20, 0.125, 0.0625
+3, 0, 20, 0.125, 0
+4, 0, 20, 0.1875, 0
+3, 0, 21, 0.125, 0.0625
+4, 0, 20, 0.1875, 0
+4, 0, 21, 0.1875, 0.0625
+3, 0, 21, 0.125, 0.0625
+3, 0, 21, 0.125, 0
+4, 0, 21, 0.1875, 0
+3, 0, 22, 0.125, 0.0625
+4, 0, 21, 0.1875, 0
+4, 0, 22, 0.1875, 0.0625
+3, 0, 22, 0.125, 0.0625
+3, 0, 22, 0.125, 0
+4, 0, 22, 0.1875, 0
+3, 0, 23, 0.125, 0.0625
+4, 0, 22, 0.1875, 0
+4, 0, 23, 0.1875, 0.0625
+3, 0, 23, 0.125, 0.0625
+3, 0, 23, 0.125, 0
+4, 0, 23, 0.1875, 0
+3, 0, 24, 0.125, 0.0625
+4, 0, 23, 0.1875, 0
+4, 0, 24, 0.1875, 0.0625
+3, 0, 24, 0.125, 0.0625
+3, 0, 24, 0.125, 0
+4, 0, 24, 0.1875, 0
+3, 0, 25, 0.125, 0.0625
+4, 0, 24, 0.1875, 0
+4, 0, 25, 0.1875, 0.0625
+3, 0, 25, 0.125, 0.0625
+3, 0, 25, 0.125, 0
+4, 0, 25, 0.1875, 0
+3, 0, 26, 0.125, 0.0625
+4, 0, 25, 0.1875, 0
+4, 0, 26, 0.1875, 0.0625
+3, 0, 26, 0.125, 0.0625
+3, 0, 26, 0.125, 0
+4, 0, 26, 0.1875, 0
+3, 0, 27, 0.125, 0.0625
+4, 0, 26, 0.1875, 0
+4, 0, 27, 0.1875, 0.0625
+3, 0, 27, 0.125, 0.0625
+3, 0, 27, 0.125, 0
+4, 0, 27, 0.1875, 0
+3, 0, 28, 0.125, 0.0625
+4, 0, 27, 0.1875, 0
+4, 0, 28, 0.1875, 0.0625
+3, 0, 28, 0.125, 0.0625
+3, 0, 28, 0.125, 0
+4, 0, 28, 0.1875, 0
+3, 0, 29, 0.125, 0.0625
+4, 0, 28, 0.1875, 0
+4, 0, 29, 0.1875, 0.0625
+3, 0, 29, 0.125, 0.0625
+3, 0, 29, 0.125, 0
+4, 0, 29, 0.1875, 0
+3, 0, 30, 0.125, 0.0625
+4, 0, 29, 0.1875, 0
+4, 0, 30, 0.1875, 0.0625
+3, 0, 30, 0.125, 0.0625
+3, 0, 30, 0.125, 0
+4, 0, 30, 0.1875, 0
+3, 0, 31, 0.125, 0.0625
+4, 0, 30, 0.1875, 0
+4, 0, 31, 0.1875, 0.0625
+3, 0, 31, 0.125, 0.0625
+3, 0, 31, 0.125, 0
+4, 0, 31, 0.1875, 0
+3, 0, 32, 0.125, 0.0625
+4, 0, 31, 0.1875, 0
+4, 0, 32, 0.1875, 0.0625
+3, 0, 32, 0.125, 0.0625
+3, 13, 0, 0.25, 0
+3, 13, 1, 0.25, 0.0625
+4, 13, 0, 0.3125, 0
+4, 13, 0, 0.3125, 0
+3, 13, 1, 0.25, 0.0625
+4, 13, 1, 0.3125, 0.0625
+4, 12, 0, 0.25, 0.0625
+4, 13, 0, 0.25, 0
+4, 12, 1, 0.1875, 0.0625
+4, 12, 1, 0.1875, 0.0625
+4, 13, 0, 0.25, 0
+4, 13, 1, 0.1875, 0
+3, 13, 1, 0.25, 0
+3, 13, 2, 0.25, 0.0625
+4, 13, 1, 0.3125, 0
+4, 13, 1, 0.3125, 0
+3, 13, 2, 0.25, 0.0625
+4, 13, 2, 0.3125, 0.0625
+3, 12, 1, 0.1875, 0.0625
+3, 12, 2, 0.25, 0.0625
+3, 13, 1, 0.1875, 0
+3, 12, 2, 0.25, 0.0625
+3, 13, 2, 0.25, 0
+3, 13, 1, 0.1875, 0
+3, 13, 2, 0.25, 0
+3, 13, 3, 0.25, 0.0625
+4, 13, 2, 0.3125, 0
+4, 13, 2, 0.3125, 0
+3, 13, 3, 0.25, 0.0625
+4, 13, 3, 0.3125, 0.0625
+3, 12, 2, 0.1875, 0.0625
+3, 12, 3, 0.25, 0.0625
+3, 13, 2, 0.1875, 0
+3, 12, 3, 0.25, 0.0625
+3, 13, 3, 0.25, 0
+3, 13, 2, 0.1875, 0
+3, 12, 3, 0.1875, 0.0625
+3, 12, 4, 0.25, 0.0625
+3, 13, 3, 0.1875, 0
+3, 12, 4, 0.25, 0.0625
+3, 13, 4, 0.25, 0
+3, 13, 3, 0.1875, 0
+3, 13, 30, 0.25, 0
+3, 13, 31, 0.25, 0.0625
+4, 13, 30, 0.3125, 0
+4, 13, 30, 0.3125, 0
+3, 13, 31, 0.25, 0.0625
+4, 13, 31, 0.3125, 0.0625
+3, 13, 31, 0.25, 0
+3, 13, 32, 0.25, 0.0625
+4, 13, 31, 0.3125, 0
+4, 13, 31, 0.3125, 0
+3, 13, 32, 0.25, 0.0625
+4, 13, 32, 0.3125, 0.0625
+4, 12, 31, 0.25, 0.0625
+4, 13, 31, 0.25, 0
+4, 12, 32, 0.1875, 0.0625
+4, 12, 32, 0.1875, 0.0625
+4, 13, 31, 0.25, 0
+4, 13, 32, 0.1875, 0
+3, 14, 3, 0.25, 0
+3, 14, 4, 0.25, 0.0625
+4, 14, 3, 0.3125, 0
+4, 14, 3, 0.3125, 0
+3, 14, 4, 0.25, 0.0625
+4, 14, 4, 0.3125, 0.0625
+3, 13, 3, 0.1875, 0.0625
+3, 13, 4, 0.25, 0.0625
+3, 14, 3, 0.1875, 0
+3, 13, 4, 0.25, 0.0625
+3, 14, 4, 0.25, 0
+3, 14, 3, 0.1875, 0
+3, 13, 3, 0.25, 0.0625
+3, 14, 3, 0.25, 0
+4, 13, 3, 0.1875, 0.0625
+4, 14, 3, 0.1875, 0
+4, 13, 3, 0.1875, 0.0625
+3, 14, 3, 0.25, 0
+3, 13, 4, 0.1875, 0.0625
+3, 13, 5, 0.25, 0.0625
+3, 14, 4, 0.1875, 0
+3, 13, 5, 0.25, 0.0625
+3, 14, 5, 0.25, 0
+3, 14, 4, 0.1875, 0
+3, 14, 29, 0.25, 0
+3, 14, 30, 0.25, 0.0625
+4, 14, 29, 0.3125, 0
+4, 14, 29, 0.3125, 0
+3, 14, 30, 0.25, 0.0625
+4, 14, 30, 0.3125, 0.0625
+3, 13, 30, 0.1875, 0.0625
+4, 13, 30, 0.25, 0.0625
+3, 14, 30, 0.1875, 0
+4, 14, 30, 0.25, 0
+3, 14, 30, 0.1875, 0
+4, 13, 30, 0.25, 0.0625
+3, 15, 4, 0.25, 0
+3, 15, 5, 0.25, 0.0625
+4, 15, 4, 0.3125, 0
+4, 15, 4, 0.3125, 0
+3, 15, 5, 0.25, 0.0625
+4, 15, 5, 0.3125, 0.0625
+3, 14, 4, 0.1875, 0.0625
+3, 14, 5, 0.25, 0.0625
+3, 15, 4, 0.1875, 0
+3, 14, 5, 0.25, 0.0625
+3, 15, 5, 0.25, 0
+3, 15, 4, 0.1875, 0
+3, 14, 4, 0.25, 0.0625
+3, 15, 4, 0.25, 0
+4, 14, 4, 0.1875, 0.0625
+4, 15, 4, 0.1875, 0
+4, 14, 4, 0.1875, 0.0625
+3, 15, 4, 0.25, 0
+3, 15, 5, 0.25, 0
+3, 15, 6, 0.25, 0.0625
+4, 15, 5, 0.3125, 0
+4, 15, 5, 0.3125, 0
+3, 15, 6, 0.25, 0.0625
+4, 15, 6, 0.3125, 0.0625
+3, 14, 5, 0.1875, 0.0625
+3, 14, 6, 0.25, 0.0625
+3, 15, 5, 0.1875, 0
+3, 14, 6, 0.25, 0.0625
+3, 15, 6, 0.25, 0
+3, 15, 5, 0.1875, 0
+4, 14, 20, 0.25, 0.0625
+4, 15, 20, 0.25, 0
+4, 14, 21, 0.1875, 0.0625
+4, 14, 21, 0.1875, 0.0625
+4, 15, 20, 0.25, 0
+4, 15, 21, 0.1875, 0
+4, 14, 21, 0.25, 0.0625
+4, 15, 21, 0.25, 0
+4, 14, 22, 0.1875, 0.0625
+4, 14, 22, 0.1875, 0.0625
+4, 15, 21, 0.25, 0
+4, 15, 22, 0.1875, 0
+3, 15, 23, 0.25, 0
+3, 15, 24, 0.25, 0.0625
+4, 15, 23, 0.3125, 0
+4, 15, 23, 0.3125, 0
+3, 15, 24, 0.25, 0.0625
+4, 15, 24, 0.3125, 0.0625
+3, 15, 24, 0.25, 0
+3, 15, 25, 0.25, 0.0625
+4, 15, 24, 0.3125, 0
+4, 15, 24, 0.3125, 0
+3, 15, 25, 0.25, 0.0625
+4, 15, 25, 0.3125, 0.0625
+3, 15, 25, 0.25, 0
+3, 15, 26, 0.25, 0.0625
+4, 15, 25, 0.3125, 0