)]}'
{
  "log": [
    {
      "commit": "8dbd6483e920311a58c9af10a10beb278efebc36",
      "tree": "e11e7c79b0a0bcbc5dfe927ff912696f0fe8ccd1",
      "parents": [
        "0b98e9103ee6f861d4667b7ab21861c236f0a575"
      ],
      "author": {
        "name": "Grigory Kirillov",
        "email": "me@txgk.in",
        "time": "Wed Oct 15 21:19:44 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Wed Oct 15 22:24:31 2025"
      },
      "message": "Fix some compilation warnings\n"
    },
    {
      "commit": "0b98e9103ee6f861d4667b7ab21861c236f0a575",
      "tree": "b1b8529b8987896c6727db8239a92b15650779d0",
      "parents": [
        "9a450cc9e5b4b79c36b89648f8b92fe65b6dd407",
        "3f7ca794866f31ac02f0a3c3cdb4c66593be1a92"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Tue Oct 07 19:19:22 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 07 19:19:22 2025"
      },
      "message": "Merge pull request #81 from sfreilich/loosen-assert\n\nVery slightly loosen some asserts by adding FLT_MIN tolerance"
    },
    {
      "commit": "3f7ca794866f31ac02f0a3c3cdb4c66593be1a92",
      "tree": "b1b8529b8987896c6727db8239a92b15650779d0",
      "parents": [
        "9a450cc9e5b4b79c36b89648f8b92fe65b6dd407"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Tue Oct 07 18:29:09 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Tue Oct 07 18:29:09 2025"
      },
      "message": "Very slightly loosen some asserts by adding FLT_MIN tolerance\n\nFound an example with fuzz-testing where this assertion failed with\nextremely small values. For example, the first assert failed with:\n\n`orgUp-\u003et: -0x1.ffep-138 dstUp-\u003et: 0x0p+0 isect.t: -0x1p-137`\n\n(values in hex float)\n\nSo that\u0027s with `isect.t` an extremely close-to-zero negative value,\n`dstUp-\u003et` as exactly 0, but `orgUp-\u003et` as just a hair smaller.\n"
    },
    {
      "commit": "9a450cc9e5b4b79c36b89648f8b92fe65b6dd407",
      "tree": "ab24c7f23a08d1d0579bd5127dce05ca0faaf168",
      "parents": [
        "446bae6dfb4c3efb43cb2764379574dcb4f0ee6c"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Sat Apr 26 14:06:33 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 26 14:06:33 2025"
      },
      "message": "Replace tess-\u003eoutOfMemory with a tess-\u003estatus enum (#76)\n\nAdd declaration for that and tessGetStatus accessor to public header.\n\nChange the failure value for \"input is out of range\" to something other than \"out of memory\"."
    },
    {
      "commit": "446bae6dfb4c3efb43cb2764379574dcb4f0ee6c",
      "tree": "fe50c5cc8e356e0b6a16969c9249ce3ad16b6d9f",
      "parents": [
        "15b879084fd2c83470b6917d9d719221098e3800"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Fri Apr 25 13:17:15 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 25 13:17:15 2025"
      },
      "message": "Also include the public headers in tess.c (#75)\n\n"
    },
    {
      "commit": "15b879084fd2c83470b6917d9d719221098e3800",
      "tree": "abbc0a0b6a302eb511c594510a575d0bcb1ef86e",
      "parents": [
        "c3b8ed41bb64c4b169f7ffe6012facd720cf74ea",
        "f3c2374ea2369f291e0a4d41f63560ee02438e2d"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Fri Apr 25 07:11:15 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 25 07:11:15 2025"
      },
      "message": "Merge pull request #74 from memononen/memononen-omstart22\n\nAnother fix for #22"
    },
    {
      "commit": "f3c2374ea2369f291e0a4d41f63560ee02438e2d",
      "tree": "abbc0a0b6a302eb511c594510a575d0bcb1ef86e",
      "parents": [
        "c3b8ed41bb64c4b169f7ffe6012facd720cf74ea"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Thu Apr 24 19:06:41 2025"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Thu Apr 24 21:49:39 2025"
      },
      "message": "Another fix for #22\n\ntesedgeSign() does not evaluate to the same sign as tesedgeEval() when the x-coordinates are almost zero. In the test data we had values like -1.70990830e-08f, -8.38190317e-09f, -3.35276112e-10f.\r\n\r\nThe fix is to always use tesedgeEval() so that we have consistent signs.\r\n\r\nThis is slight perf degrade, but the code written in \u002794 tried really hard to avoid one floating point division, and I think we can handle with that today."
    },
    {
      "commit": "c3b8ed41bb64c4b169f7ffe6012facd720cf74ea",
      "tree": "f162efccf602c5c8bf9d5565dc2c4f4fec5aab71",
      "parents": [
        "97cf6227aa023c30d083b9ea5231e5c95249fa57"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Apr 24 21:25:58 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 21:25:58 2025"
      },
      "message": "Fail if coords are outside of a safe range (#71)\n\nThe sentinel edges in `InitEdgeDict` are separated from real edges by the width/height of the bounding box, so this overflows if the dimensions of that box are half of float max.\n\nInstead, fail if coordinates are not in `[-2^32, 2^32]` to avoid overflow and loss-of-precision errors. This `#define`s TESS_MAX_VALID_INPUT_VALUE and TESS_MIN_VALID_INPUT_VALUE in the public headers as those bounds, in case clients want to clamp or otherwise sanitize invalid inputs."
    },
    {
      "commit": "97cf6227aa023c30d083b9ea5231e5c95249fa57",
      "tree": "5e6f840c49dd45b0135b27c2d623311768c7bbab",
      "parents": [
        "672cadcebde56b1542eab4540671bd757c020de0",
        "00b28456a740cd166437ca804a128a0b62c51fc1"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Thu Apr 24 17:54:48 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 17:54:48 2025"
      },
      "message": "Merge pull request #73 from wrmorris-google/crash-fix\n\nRevert \"Fix for #22\""
    },
    {
      "commit": "00b28456a740cd166437ca804a128a0b62c51fc1",
      "tree": "5e6f840c49dd45b0135b27c2d623311768c7bbab",
      "parents": [
        "672cadcebde56b1542eab4540671bd757c020de0"
      ],
      "author": {
        "name": "Russell Morris",
        "email": "wrmorris@google.com",
        "time": "Thu Apr 24 17:47:32 2025"
      },
      "committer": {
        "name": "Russell Morris",
        "email": "wrmorris@google.com",
        "time": "Thu Apr 24 17:47:32 2025"
      },
      "message": "Revert \"Fix for #22\"\n\nThis reverts commit 955761f46fcec73c91c5dbf2547b6f88afb5d3fc.\n\nThis fixes a crash noticed in #72.\n"
    },
    {
      "commit": "672cadcebde56b1542eab4540671bd757c020de0",
      "tree": "e2141fc87cdf84c20aaafe9edde35013b38f198a",
      "parents": [
        "db3a7a12b86d52b5ca2218c6e7caa51d25cc4477"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Wed Apr 02 15:03:55 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 02 15:03:55 2025"
      },
      "message": "Also run test CI in opt-mode (#70)\n\nSome of the crashes I\u0027m trying to track down only occur with optimizations turned on. Others fail differently in opt-mode (due to compiled-out assertions)."
    },
    {
      "commit": "db3a7a12b86d52b5ca2218c6e7caa51d25cc4477",
      "tree": "3a58bc8960b580aedaa26c6139c7cbedfd7797e2",
      "parents": [
        "6e05801a57ca06bfd2908ceb9a73b6df5b0aae71"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Wed Mar 26 11:01:11 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 26 11:01:11 2025"
      },
      "message": "Use isnan instead of isnanf (#69)\n\nThe manpage for math.h notes:\nhttps://linux.die.net/man/3/isnanf\n\n\"Note that these functions are obsolete. C99 defines macros isfinite(),\nisinf(), and isnan() (for all types) replacing them.\"\n\nThe C standard documentation here omits isnanf:\nhttps://en.cppreference.com/w/c/header/math\n\nAnd it seems that many downstream implementations (especially\nones for platforms other than Linux) leave it out."
    },
    {
      "commit": "6e05801a57ca06bfd2908ceb9a73b6df5b0aae71",
      "tree": "dca3346aaaf1713d7980604db48479d1384e0bdb",
      "parents": [
        "499bedc797bd76c24382c5d5966386597cc16e96"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Tue Mar 25 15:41:07 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 25 15:41:07 2025"
      },
      "message": "Make headers available under libtess2/ for Bazel consumers (#67)\n\nThis makes it a little easier to depend on for projects following that\nconvention, without having to rework the directory structure here."
    },
    {
      "commit": "499bedc797bd76c24382c5d5966386597cc16e96",
      "tree": "03c6125c68ee8a4a1e4cb7937de44140ece5c82f",
      "parents": [
        "b32813fe168d25737dee5a2a260f5afd10e72d3d"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Tue Mar 25 14:59:06 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 25 14:59:06 2025"
      },
      "message": "Avoid float overflow when calculating midpoint in tesedgeIntersect (#68)\n\n"
    },
    {
      "commit": "b32813fe168d25737dee5a2a260f5afd10e72d3d",
      "tree": "d6d9ac968defda0cd32d75b88a340db0f5bd40c9",
      "parents": [
        "660c4251c9338448ae450199b664d44945d861a2"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Mon Mar 24 15:11:19 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 24 15:11:19 2025"
      },
      "message": "Avoid reading unitialized memory if there are too few vertices (#65)\n\ntessProjectPolygon read the first vertex unconditionally, which was uninitialized memory when the vertices were empty."
    },
    {
      "commit": "660c4251c9338448ae450199b664d44945d861a2",
      "tree": "551ab4a5bab621f424a6635be0ee3bed34e8d9ea",
      "parents": [
        "a17f1ccd66ac639a110e1acbed9386cf076b91b6"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Fri Mar 21 20:10:40 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 21 20:10:40 2025"
      },
      "message": "Guard against NaN in tesedgeSign (#66)\n\n"
    },
    {
      "commit": "a17f1ccd66ac639a110e1acbed9386cf076b91b6",
      "tree": "b84b607c647171f3363392d3a4bb82da58674d32",
      "parents": [
        "f71edc656ba1ce490b36b334ab1a0ee730320727"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Fri Mar 21 15:12:06 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 21 15:12:06 2025"
      },
      "message": "Use nanf instead of nan to avoid possible warning about type-narrowing (#64)\n\n"
    },
    {
      "commit": "f71edc656ba1ce490b36b334ab1a0ee730320727",
      "tree": "380dc8fc3a172b8c0811f3dece994bffc691b4dd",
      "parents": [
        "2f8c87ac13b988d29bfa785f655a1ae9883c0510"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Fri Mar 21 14:54:56 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 21 14:54:56 2025"
      },
      "message": "Guard against NaN in tessAddContour (#62)\n\n"
    },
    {
      "commit": "2f8c87ac13b988d29bfa785f655a1ae9883c0510",
      "tree": "0ccda36371585161af37869766dc0d1203644114",
      "parents": [
        "4a80b56b3c3d6acaa6e130a657df5001955711ac"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Fri Mar 21 14:42:29 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 21 14:42:29 2025"
      },
      "message": "Factor out common setup into a test fixture (#63)\n\nSome of these test cases were missing `tessDeleteTess`."
    },
    {
      "commit": "4a80b56b3c3d6acaa6e130a657df5001955711ac",
      "tree": "b5dd50061298c11a86452e5ed7ab5f1a711b1e49",
      "parents": [
        "3e3fb3cfe355eb0693ca5b42cca59e7cd2701d8f"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 20 14:33:15 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 20 14:33:15 2025"
      },
      "message": "Fix a segfault (#61)\n\n"
    },
    {
      "commit": "3e3fb3cfe355eb0693ca5b42cca59e7cd2701d8f",
      "tree": "0353235c9a5fe72bb39f59d7410ca1a8d45c25e9",
      "parents": [
        "dab0206896c522e654d3d4c910b7e9fda3eeeb73"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Wed Mar 19 23:15:03 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 19 23:15:03 2025"
      },
      "message": "Add some basic base-case tests (#60)\n\n"
    },
    {
      "commit": "dab0206896c522e654d3d4c910b7e9fda3eeeb73",
      "tree": "39d230b3d6fc9e68077370558adc7b22a8f10c8c",
      "parents": [
        "a4f895afddc0db177d59a46513ff21063dcb7887"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Tue Mar 18 16:48:27 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 18 16:48:27 2025"
      },
      "message": "Also run test on PR creation/update (#59)\n\n"
    },
    {
      "commit": "a4f895afddc0db177d59a46513ff21063dcb7887",
      "tree": "245faf849f70a59fece7dd69d7f73d500f9a4599",
      "parents": [
        "60aac41b9f71dd2de915b495b87bebbaa8ef71b8"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Tue Mar 18 11:30:20 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 18 11:30:20 2025"
      },
      "message": "Avoid an unused variable warning (#58)\n\n"
    },
    {
      "commit": "60aac41b9f71dd2de915b495b87bebbaa8ef71b8",
      "tree": "1e72b3f709166eefb6a8de30091f8810facc9640",
      "parents": [
        "5fed5352424ef604b8a00dfb3467d6d2dd30f5a2"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Mon Mar 17 22:48:21 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 17 22:48:21 2025"
      },
      "message": "Add a Bazel build and a basic test (#57)\n\nRun tests on PR push on GitHub Actions. Update README."
    },
    {
      "commit": "5fed5352424ef604b8a00dfb3467d6d2dd30f5a2",
      "tree": "970a5445047417bf088e8b1edd1e656fedc54cac",
      "parents": [
        "a0f2ea4d28bff2133c6f6f3158fc729c4d332724",
        "ae9c06b1955a2a27e4314a71efb72e21f0acf614"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 21:35:45 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 13 21:35:45 2025"
      },
      "message": "Merge pull request #56 from sfreilich/fix-cfi\n\nChange libtess2 code that calls through a function pointer to avoid casting. This lets the compiler do better type checking and fire `-Wincompatible-function-pointer-types` when it detects function pointer calls where the types do not line up. Then line up the types to make the compiler happy."
    },
    {
      "commit": "ae9c06b1955a2a27e4314a71efb72e21f0acf614",
      "tree": "970a5445047417bf088e8b1edd1e656fedc54cac",
      "parents": [
        "e56c88224d4cbf99de295e11cbd93218a78e000f"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 20:28:17 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 20:28:59 2025"
      },
      "message": "Remove an include\n"
    },
    {
      "commit": "e56c88224d4cbf99de295e11cbd93218a78e000f",
      "tree": "c7885e9b1fef476d543a4cab00c38ae38078ec27",
      "parents": [
        "bc409e19b3fa906b68382ff83f112a520b74ee4a",
        "a0f2ea4d28bff2133c6f6f3158fc729c4d332724"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 20:09:08 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 13 20:09:08 2025"
      },
      "message": "Merge branch \u0027master\u0027 into fix-cfi"
    },
    {
      "commit": "a0f2ea4d28bff2133c6f6f3158fc729c4d332724",
      "tree": "86d67da92c90ba4da992fb43148fa9e1632327cf",
      "parents": [
        "eacb0944a07178686f91bbf4a0f7d9df4b95addd",
        "565b4084c5622a0b6bbb91b83542a105b43a3ce4"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Thu Mar 13 20:06:31 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 13 20:06:31 2025"
      },
      "message": "Merge pull request #55 from sfreilich/avoid-segfault\n\nAvoid NULL deref in tessMeshAddEdgeVertex."
    },
    {
      "commit": "eacb0944a07178686f91bbf4a0f7d9df4b95addd",
      "tree": "de773d3fa566b3959b3546c99872028a7e8724a1",
      "parents": [
        "fc52516467dfa124bdd967c15c7cf9faf02a34ca",
        "085eff03df65e921b9a90793fb8374cb2bb9193a"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Thu Mar 13 20:05:39 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 13 20:05:39 2025"
      },
      "message": "Merge pull request #54 from sfreilich/use-headers\n\nInclude public headers in internal headers where used"
    },
    {
      "commit": "bc409e19b3fa906b68382ff83f112a520b74ee4a",
      "tree": "2856a705fe50c747db518642749cdcfb8d93caab",
      "parents": [
        "2b659d7aff632865e9e4f1dbb1db4429d612bd95"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 20:03:17 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 20:03:17 2025"
      },
      "message": "Add some missed includes\n"
    },
    {
      "commit": "2b659d7aff632865e9e4f1dbb1db4429d612bd95",
      "tree": "0af033de95d0917eeefc3e01afda72f52f9a31da",
      "parents": [
        "fc52516467dfa124bdd967c15c7cf9faf02a34ca"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 19:39:31 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 19:39:31 2025"
      },
      "message": "Avoid errors found with LLVM CFI sanitizer\n\nChange libtess2 code that calls through a function pointer to avoid\ncasting. This lets the compiler do better type checking and fire\n`-Wincompatible-function-pointer-types` when it detects function pointer\ncalls where the types do not line up. Then line up the types to make the\ncompiler happy.\n"
    },
    {
      "commit": "085eff03df65e921b9a90793fb8374cb2bb9193a",
      "tree": "099aa2c50891b8d31767ff59404a2b697679e743",
      "parents": [
        "882e5e92953d5ea2626a83da7ffbfd119ef80f53"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 19:12:00 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 19:12:00 2025"
      },
      "message": "Include public headers in internal headers where used\n"
    },
    {
      "commit": "565b4084c5622a0b6bbb91b83542a105b43a3ce4",
      "tree": "1416e53a912b393119c7d341b09c89a21cc8d0b9",
      "parents": [
        "fc52516467dfa124bdd967c15c7cf9faf02a34ca"
      ],
      "author": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 19:01:34 2025"
      },
      "committer": {
        "name": "Samuel Freilich",
        "email": "sfreilich@google.com",
        "time": "Thu Mar 13 19:01:34 2025"
      },
      "message": "Avoid NULL deref in tessMeshAddEdgeVertex.\n\ntessMeshAddEdgeVertex passes eOrg-\u003eDst to MakeVertex(), which derefences\nit without checking for NULL.  Instead of SIGSEGV, just return NULL.\n"
    },
    {
      "commit": "fc52516467dfa124bdd967c15c7cf9faf02a34ca",
      "tree": "5f41665f0efb6c7fb566b1dcf72f9f77e0664e66",
      "parents": [
        "882e5e92953d5ea2626a83da7ffbfd119ef80f53"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Thu Sep 26 18:33:40 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 26 18:33:40 2019"
      },
      "message": "Bumped version number"
    },
    {
      "commit": "882e5e92953d5ea2626a83da7ffbfd119ef80f53",
      "tree": "aca19e599a3edec4f1f1ac0d1ac121ada02ce816",
      "parents": [
        "56d5c87b596bfe792f79b2e41fde83b769f6406d"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 22 19:05:13 2019"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 22 19:05:13 2019"
      },
      "message": "Update README.md"
    },
    {
      "commit": "56d5c87b596bfe792f79b2e41fde83b769f6406d",
      "tree": "2a9e0d6dee8dc7c87c22fd56731ab5c732282eab",
      "parents": [
        "8862c3f00007f9057d7c5c524b53cb8af9756a59"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed May 23 08:11:17 2018"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed May 23 08:11:21 2018"
      },
      "message": "Fix for #30\n\nInitialize processCDT in tessNewTess()\n"
    },
    {
      "commit": "8862c3f00007f9057d7c5c524b53cb8af9756a59",
      "tree": "5cd7db16bb582fdaf04de80e9c8db63d4412183f",
      "parents": [
        "82dd0a3e9e841a13b132443f89df62d574377ddb",
        "98f60871e1232d353bf1be0e531a07377c1824a6"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed Apr 18 03:53:29 2018"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 18 03:53:29 2018"
      },
      "message": "Merge pull request #29 from mindbrix/useInCircle\n\nUse inCircle()"
    },
    {
      "commit": "82dd0a3e9e841a13b132443f89df62d574377ddb",
      "tree": "386b914acb5edf4d87252b665335d4db90ca2f0e",
      "parents": [
        "b256f4940bbd8ddb12534ce0e1751d7cb67c84d9",
        "5a8ff41ca32973f63fb982e7354934184966570d"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed Apr 18 03:52:36 2018"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 18 03:52:36 2018"
      },
      "message": "Merge pull request #28 from mindbrix/reversedFlag\n\nAdd a reversed flag to tessAddContour()"
    },
    {
      "commit": "98f60871e1232d353bf1be0e531a07377c1824a6",
      "tree": "7af657ae771f750c91e95ad4ee9ce2480fa194b8",
      "parents": [
        "fe8e02c9972063267d1e8a8a66fcc5917bcad75f"
      ],
      "author": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 22:22:40 2018"
      },
      "committer": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 22:22:40 2018"
      },
      "message": "Spaces --\u003e tabs\n"
    },
    {
      "commit": "fe8e02c9972063267d1e8a8a66fcc5917bcad75f",
      "tree": "b45c862388572a1edfc44cbdfb5dafb294f2eeec",
      "parents": [
        "b256f4940bbd8ddb12534ce0e1751d7cb67c84d9"
      ],
      "author": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Mon Apr 16 19:47:12 2018"
      },
      "committer": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 22:18:42 2018"
      },
      "message": "Replace calcAngle() with inCircle() to avoid expensive trigonometry\n"
    },
    {
      "commit": "5a8ff41ca32973f63fb982e7354934184966570d",
      "tree": "386b914acb5edf4d87252b665335d4db90ca2f0e",
      "parents": [
        "2d4a80b6a309a5766d270a80fc95a5ba3e0d4930"
      ],
      "author": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 21:56:44 2018"
      },
      "committer": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 21:56:44 2018"
      },
      "message": "Spaces --\u003e tabs\n"
    },
    {
      "commit": "2d4a80b6a309a5766d270a80fc95a5ba3e0d4930",
      "tree": "4e8c533403d677f50f3271d59f7d59a26bb0e0c2",
      "parents": [
        "98c65dad5e47ad888032b6cdf556f192e0e028d0"
      ],
      "author": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 21:48:26 2018"
      },
      "committer": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 21:48:26 2018"
      },
      "message": "Fix issues\n"
    },
    {
      "commit": "98c65dad5e47ad888032b6cdf556f192e0e028d0",
      "tree": "13782e5ea6ef9f743f85709a8ac5ace696ae930a",
      "parents": [
        "cbcb621d9d93191d1df55814dddc4a88c8a85d48"
      ],
      "author": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 21:25:45 2018"
      },
      "committer": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Tue Apr 17 21:25:45 2018"
      },
      "message": "Add TESS_REVERSE_CONTOURS to TessOption\n"
    },
    {
      "commit": "cbcb621d9d93191d1df55814dddc4a88c8a85d48",
      "tree": "2dd7ad0b7fab6f42f58414c9d489880a8a3cab87",
      "parents": [
        "b256f4940bbd8ddb12534ce0e1751d7cb67c84d9"
      ],
      "author": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Mon Apr 16 17:13:57 2018"
      },
      "committer": {
        "name": "Nigel Barber",
        "email": "nigel@mindbrix.co.uk",
        "time": "Mon Apr 16 17:13:57 2018"
      },
      "message": "Add a reversed flag to tessAddContour()\n"
    },
    {
      "commit": "b256f4940bbd8ddb12534ce0e1751d7cb67c84d9",
      "tree": "8007762563e78dafabc0cfdb3f5ce559e98df27e",
      "parents": [
        "1952b91b46787d7974f73f3b51b1989f331656c9"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 08:52:47 2018"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 08:52:47 2018"
      },
      "message": "Fix for #14\n\n- always pad sentinels\n"
    },
    {
      "commit": "1952b91b46787d7974f73f3b51b1989f331656c9",
      "tree": "34d6f26bd5c736732a180cca18a6c1c7ba2099d0",
      "parents": [
        "955761f46fcec73c91c5dbf2547b6f88afb5d3fc"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 08:35:01 2018"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 08:37:37 2018"
      },
      "message": "Fix for #23\n\n- rewrote tessMeshMergeConvexFaces() to avoid infinite loops\n"
    },
    {
      "commit": "955761f46fcec73c91c5dbf2547b6f88afb5d3fc",
      "tree": "4488059482548e9ffc7c69ca07586f5512e70c0c",
      "parents": [
        "25f13918f3dd50a49307f64cfdef416d5c64399f"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 08:24:04 2018"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 08:37:37 2018"
      },
      "message": "Fix for #22\n\n- handle degenerate cases better in CheckForRightSplice()\n"
    },
    {
      "commit": "25f13918f3dd50a49307f64cfdef416d5c64399f",
      "tree": "c81a6992f0c92394a87139a769d75312b5b18c04",
      "parents": [
        "3dd704522ff391ff10d7b05f29c64f5574b42fe7"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 07:16:36 2018"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 16 07:16:36 2018"
      },
      "message": "Updated link to license"
    },
    {
      "commit": "3dd704522ff391ff10d7b05f29c64f5574b42fe7",
      "tree": "cfe51ab84375c34c54de8bc84c7ac9ded7e0d2c5",
      "parents": [
        "344b31572659aa74426c5c6ad91bbde3fe23bbb8",
        "37d6fb0955f7a8b457529f5d2c2ad8eaddc78cbf"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 07:10:38 2018"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 16 07:10:38 2018"
      },
      "message": "Merge pull request #19 from 1ec5/patch-1\n\nFixes for static analyzer warnings"
    },
    {
      "commit": "344b31572659aa74426c5c6ad91bbde3fe23bbb8",
      "tree": "b483ead8f825c1fc67acdc46cea1c851b97ea65c",
      "parents": [
        "24e4bdd4158909e9720422208ab0a0aca788e700",
        "c6e635801807c27723aaea4c15c7e9cb5a6b2cba"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 06:57:43 2018"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 06:57:43 2018"
      },
      "message": "Merge branch \u0027pr/7\u0027\n"
    },
    {
      "commit": "c6e635801807c27723aaea4c15c7e9cb5a6b2cba",
      "tree": "a06e62006ba4defef074544af70ed1418a8ab409",
      "parents": [
        "c655ececd59c2227b4fb2a1138c8087cd4ac980b"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 06:57:05 2018"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Mon Apr 16 06:57:05 2018"
      },
      "message": "Small tweaks to CDT\n\n- added CDT support for demo\n- added infinity-loop safety guard on CDT iteration count\n- visit all 4 neighbours\n- changed to options based API\n"
    },
    {
      "commit": "37d6fb0955f7a8b457529f5d2c2ad8eaddc78cbf",
      "tree": "30f4c24c351ac28677ebe72ef2da295d6bda4ef7",
      "parents": [
        "24e4bdd4158909e9720422208ab0a0aca788e700"
      ],
      "author": {
        "name": "Minh Nguyễn",
        "email": "mxn@1ec5.org",
        "time": "Wed May 06 19:11:20 2015"
      },
      "committer": {
        "name": "Minh Nguyễn",
        "email": "mxn@1ec5.org",
        "time": "Wed May 06 19:11:20 2015"
      },
      "message": "Fixed dead store analyzer warnings\n\nRemoved redundant assignments to local variables that were flagged by Xcode’s static analyzer as dead stores."
    },
    {
      "commit": "24e4bdd4158909e9720422208ab0a0aca788e700",
      "tree": "ccc954d0d62784976d2141f6d642ac720fbd4ded",
      "parents": [
        "041a3ae2778fadaee2bdef3b4a962aae7d0f4f88",
        "d7c34ac3ff11993b0fc0395fe7d96f4cc75e6bb6"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed Jan 14 08:41:03 2015"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed Jan 14 08:41:03 2015"
      },
      "message": "Merge pull request #10 from openscad/sentinel-workaround\n\nSentinel workaround, should fix #8"
    },
    {
      "commit": "c655ececd59c2227b4fb2a1138c8087cd4ac980b",
      "tree": "d287b6cfc37b1e306c51e1bbdef392d3c93e926c",
      "parents": [
        "59b61f2c1332ffb134bcae5c9bdd2758c2adec3d"
      ],
      "author": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Wed Jan 14 02:37:38 2015"
      },
      "committer": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Wed Jan 14 02:37:38 2015"
      },
      "message": "#7 Better conform to C89\n"
    },
    {
      "commit": "d7c34ac3ff11993b0fc0395fe7d96f4cc75e6bb6",
      "tree": "f6ced988de3c86170386ebc1e9a6f7c7165a88ca",
      "parents": [
        "7e004ebdedcd0fc93ec01603d9ec941a949c7d5f"
      ],
      "author": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 23:03:58 2015"
      },
      "committer": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 23:03:58 2015"
      },
      "message": "Clarify the sentinel workaround\n"
    },
    {
      "commit": "041a3ae2778fadaee2bdef3b4a962aae7d0f4f88",
      "tree": "49a662bc783e816d3e564d0d632c60850c710719",
      "parents": [
        "a43504d78a5695ca07cf3706e34abfdfd5b4343b",
        "e8cac5352225158507b27920a8eac3c39ced5711"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Tue Jan 13 22:11:39 2015"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Tue Jan 13 22:11:39 2015"
      },
      "message": "Merge pull request #9 from openscad/planar-crash-fix\n\nWhen the input is collinear, choose the most perpendicular normal"
    },
    {
      "commit": "7e004ebdedcd0fc93ec01603d9ec941a949c7d5f",
      "tree": "77c06e3420091089592f1eaa2c9f64d4140d75b7",
      "parents": [
        "a43504d78a5695ca07cf3706e34abfdfd5b4343b"
      ],
      "author": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 21:35:56 2015"
      },
      "committer": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 21:39:23 2015"
      },
      "message": "Workaround for issue #8; make sure sentinels are not coincident\n"
    },
    {
      "commit": "e8cac5352225158507b27920a8eac3c39ced5711",
      "tree": "49a662bc783e816d3e564d0d632c60850c710719",
      "parents": [
        "a43504d78a5695ca07cf3706e34abfdfd5b4343b"
      ],
      "author": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 20:39:23 2015"
      },
      "committer": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 20:39:23 2015"
      },
      "message": "Wnen the input is collinear, choose the most perpendicular normal rather than the least perpendicular one. This should improve #8\n"
    },
    {
      "commit": "59b61f2c1332ffb134bcae5c9bdd2758c2adec3d",
      "tree": "a2f8703bdc34c57b9a3be0fb5bcbe7d9ad9e24b9",
      "parents": [
        "50dc8f05668c6114492e9c0544ed71ce3e9860ae"
      ],
      "author": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 17:12:01 2015"
      },
      "committer": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 17:12:01 2015"
      },
      "message": "Delaunay cleanup: Added bucket allocator, more robust trigonometry, coding style\n"
    },
    {
      "commit": "50dc8f05668c6114492e9c0544ed71ce3e9860ae",
      "tree": "89006f71de96c56453e49b379f00e711051a97e5",
      "parents": [
        "a43504d78a5695ca07cf3706e34abfdfd5b4343b"
      ],
      "author": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 07:06:25 2015"
      },
      "committer": {
        "name": "Marius Kintel",
        "email": "marius@kintel.net",
        "time": "Tue Jan 13 07:06:25 2015"
      },
      "message": "Initial implementation of Constrained Delaunay Refinement\n"
    },
    {
      "commit": "a43504d78a5695ca07cf3706e34abfdfd5b4343b",
      "tree": "b23683dc0232b4810384cfcbfe87b3c59011aa34",
      "parents": [
        "5bd98453656f79abb56defe324426b8dfec845d2"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Fri Jun 13 18:17:17 2014"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Fri Jun 13 18:17:25 2014"
      },
      "message": "Moved build to premake4\n\n- moved build to premake4\n- fixed compiler warnings\n- increased pool size to fit 64bit ptrs\n"
    },
    {
      "commit": "5bd98453656f79abb56defe324426b8dfec845d2",
      "tree": "2637721280c8e4caa5a2183c4be5cfee88c0579f",
      "parents": [
        "ed4faa60e838267c810a88f28743b5bdc885a6d4"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Sun Nov 10 09:53:52 2013"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Sun Nov 10 09:53:52 2013"
      },
      "message": "Update README.md"
    },
    {
      "commit": "ed4faa60e838267c810a88f28743b5bdc885a6d4",
      "tree": "a7f3e08d43f514a87888b6cdcfe9f7f09ca081ae",
      "parents": [
        "0c9863f03cf98aa2d9439d327b608ec32a8eef22"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed Sep 11 21:52:59 2013"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Wed Sep 11 21:52:59 2013"
      },
      "message": "Bumped version number."
    },
    {
      "commit": "0c9863f03cf98aa2d9439d327b608ec32a8eef22",
      "tree": "e0994bf4aad03bf8ab38e3619677b2572acb0107",
      "parents": [
        "a1734a2e0cab8b97a9b2d16216784c21f5cb1d53"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memon@inside.org",
        "time": "Tue Sep 10 21:45:12 2013"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memon@inside.org",
        "time": "Tue Sep 10 21:45:12 2013"
      },
      "message": "Initial commit\n"
    },
    {
      "commit": "a1734a2e0cab8b97a9b2d16216784c21f5cb1d53",
      "tree": "9967340dd79e768020b8e398de1b4df05f0f1138",
      "parents": [
        "52d4cc1df141a33d756ac41f145c354516b19770"
      ],
      "author": {
        "name": "Mikko Mononen",
        "email": "memon@inside.org",
        "time": "Tue Sep 10 21:28:16 2013"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memon@inside.org",
        "time": "Tue Sep 10 21:28:16 2013"
      },
      "message": "Adding -gitignore\n"
    },
    {
      "commit": "52d4cc1df141a33d756ac41f145c354516b19770",
      "tree": "c1aaebbae139a6ce345d902cba3ace6a06960b06",
      "parents": [],
      "author": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Tue Sep 10 21:24:43 2013"
      },
      "committer": {
        "name": "Mikko Mononen",
        "email": "memononen@gmail.com",
        "time": "Tue Sep 10 21:24:43 2013"
      },
      "message": "Initial commit\n"
    }
  ]
}
