diff --git a/base/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.c b/head/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.c
index 7557795..a1b125d 100644
--- a/base/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.c
+++ b/head/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.c
@@ -14990,6 +14990,61 @@ void cJSON_DeleteRight(struct Right * x) {
     }
 }
 
+struct S * cJSON_ParseS(const char * s) {
+    struct S * x = NULL;
+    if (NULL != s) {
+        cJSON * j = cJSON_Parse(s);
+        if (NULL != j) {
+            x = cJSON_GetSValue(j);
+            cJSON_Delete(j);
+        }
+    }
+    return x;
+}
+
+struct S * cJSON_GetSValue(const cJSON * j) {
+    struct S * x = NULL;
+    if (NULL != j) {
+        if (NULL != (x = cJSON_malloc(sizeof(struct S)))) {
+            memset(x, 0, sizeof(struct S));
+            if (!cJSON_HasObjectItem(j, "s")) { cJSON_DeleteS(x); return NULL; }
+            if (cJSON_HasObjectItem(j, "s")) {
+                if (!quicktype_cJSON_IsInteger(cJSON_GetObjectItemCaseSensitive(j, "s"))) { cJSON_DeleteS(x); return NULL; }
+                x->s = cJSON_GetNumberValue(cJSON_GetObjectItemCaseSensitive(j, "s"));
+            }
+        }
+    }
+    return x;
+}
+
+cJSON * cJSON_CreateS(const struct S * x) {
+    cJSON * j = NULL;
+    if (NULL != x) {
+        if (NULL != (j = cJSON_CreateObject())) {
+            cJSON_AddNumberToObject(j, "s", x->s);
+        }
+    }
+    return j;
+}
+
+char * cJSON_PrintS(const struct S * x) {
+    char * s = NULL;
+    if (NULL != x) {
+        cJSON * j = cJSON_CreateS(x);
+        if (NULL != j) {
+            s = cJSON_Print(j);
+            cJSON_Delete(j);
+        }
+    }
+    return s;
+}
+
+void cJSON_DeleteS(struct S * x) {
+    if (NULL != x) {
+        cJSON_free(x);
+    }
+}
+
 struct Sbyte * cJSON_ParseSbyte(const char * s) {
     struct Sbyte * x = NULL;
     if (NULL != s) {
@@ -16621,6 +16676,12 @@ struct Obj4 * cJSON_GetObj4Value(const cJSON * j) {
                 x->right = cJSON_GetRightValue(cJSON_GetObjectItemCaseSensitive(j, "right"));
                 if (NULL == x->right) { cJSON_DeleteObj4(x); return NULL; }
             }
+            if (!cJSON_HasObjectItem(j, "s")) { cJSON_DeleteObj4(x); return NULL; }
+            if (cJSON_HasObjectItem(j, "s")) {
+                if (!cJSON_IsObject(cJSON_GetObjectItemCaseSensitive(j, "s"))) { cJSON_DeleteObj4(x); return NULL; }
+                x->s = cJSON_GetSValue(cJSON_GetObjectItemCaseSensitive(j, "s"));
+                if (NULL == x->s) { cJSON_DeleteObj4(x); return NULL; }
+            }
             if (!cJSON_HasObjectItem(j, "sbyte")) { cJSON_DeleteObj4(x); return NULL; }
             if (cJSON_HasObjectItem(j, "sbyte")) {
                 if (!cJSON_IsObject(cJSON_GetObjectItemCaseSensitive(j, "sbyte"))) { cJSON_DeleteObj4(x); return NULL; }
@@ -16820,6 +16881,7 @@ cJSON * cJSON_CreateObj4(const struct Obj4 * x) {
             cJSON_AddItemToObject(j, "retain", cJSON_CreateRetain(x->retain));
             cJSON_AddItemToObject(j, "rethrows", cJSON_CreateRethrows(x->rethrows));
             cJSON_AddItemToObject(j, "right", cJSON_CreateRight(x->right));
+            cJSON_AddItemToObject(j, "s", cJSON_CreateS(x->s));
             cJSON_AddItemToObject(j, "sbyte", cJSON_CreateSbyte(x->sbyte));
             cJSON_AddItemToObject(j, "sealed", cJSON_CreateSealed(x->sealed));
             cJSON_AddItemToObject(j, "SEL", cJSON_CreateSel(x->sel));
@@ -16981,6 +17043,9 @@ void cJSON_DeleteObj4(struct Obj4 * x) {
         if (NULL != x->right) {
             cJSON_DeleteRight(x->right);
         }
+        if (NULL != x->s) {
+            cJSON_DeleteS(x->s);
+        }
         if (NULL != x->sbyte) {
             cJSON_DeleteSbyte(x->sbyte);
         }
diff --git a/base/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.h b/head/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.h
index 42b25a3..a3eabe3 100644
--- a/base/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.h
+++ b/head/cjson/test/inputs/json/priority/keywords.json/default/TopLevel.h
@@ -1181,6 +1181,10 @@ struct Right {
     int64_t right;
 };
 
+struct S {
+    int64_t s;
+};
+
 struct Sbyte {
     int64_t sbyte;
 };
@@ -1322,6 +1326,7 @@ struct Obj4 {
     struct Retain * retain;
     struct Rethrows * rethrows;
     struct Right * right;
+    struct S * s;
     struct Sbyte * sbyte;
     struct Sealed * sealed;
     struct Sel * sel;
@@ -2884,6 +2889,12 @@ cJSON * cJSON_CreateRight(const struct Right * x);
 char * cJSON_PrintRight(const struct Right * x);
 void cJSON_DeleteRight(struct Right * x);
 
+struct S * cJSON_ParseS(const char * s);
+struct S * cJSON_GetSValue(const cJSON * j);
+cJSON * cJSON_CreateS(const struct S * x);
+char * cJSON_PrintS(const struct S * x);
+void cJSON_DeleteS(struct S * x);
+
 struct Sbyte * cJSON_ParseSbyte(const char * s);
 struct Sbyte * cJSON_GetSbyteValue(const cJSON * j);
 cJSON * cJSON_CreateSbyte(const struct Sbyte * x);
diff --git a/head/cjson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.c b/head/cjson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.c
new file mode 100644
index 0000000..288d07e
--- /dev/null
+++ b/head/cjson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.c
@@ -0,0 +1,131 @@
+/**
+ * TopLevel.c
+ * This file has been autogenerated using quicktype https://github.com/quicktype/quicktype - DO NOT EDIT
+ */
+
+#include "TopLevel.h"
+
+struct TopLevel * cJSON_ParseTopLevel(const char * s) {
+    struct TopLevel * x = NULL;
+    if (NULL != s) {
+        cJSON * j = cJSON_Parse(s);
+        if (NULL != j) {
+            x = cJSON_GetTopLevelValue(j);
+            cJSON_Delete(j);
+        }
+    }
+    return x;
+}
+
+struct TopLevel * cJSON_GetTopLevelValue(const cJSON * j) {
+    struct TopLevel * x = NULL;
+    if (NULL != j) {
+        if (NULL != (x = cJSON_malloc(sizeof(struct TopLevel)))) {
+            memset(x, 0, sizeof(struct TopLevel));
+            if (!cJSON_HasObjectItem(j, "\000\001\033\037")) { cJSON_DeleteTopLevel(x); return NULL; }
+            if (cJSON_HasObjectItem(j, "\000\001\033\037")) {
+                if (!cJSON_IsString(cJSON_GetObjectItemCaseSensitive(j, "\000\001\033\037"))) { cJSON_DeleteTopLevel(x); return NULL; }
+                x->empty = strdup(cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(j, "\000\001\033\037")));
+            }
+            else {
+                if (NULL != (x->empty = cJSON_malloc(sizeof(char)))) {
+                    x->empty[0] = '\0';
+                }
+            }
+            if (!cJSON_HasObjectItem(j, "\U0001f600")) { cJSON_DeleteTopLevel(x); return NULL; }
+            if (cJSON_HasObjectItem(j, "\U0001f600")) {
+                if (!cJSON_IsString(cJSON_GetObjectItemCaseSensitive(j, "\U0001f600"))) { cJSON_DeleteTopLevel(x); return NULL; }
+                x->purple = strdup(cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(j, "\U0001f600")));
+            }
+            else {
+                if (NULL != (x->purple = cJSON_malloc(sizeof(char)))) {
+                    x->purple[0] = '\0';
+                }
+            }
+            if (!cJSON_HasObjectItem(j, "\177\302\200\302\205\302\237")) { cJSON_DeleteTopLevel(x); return NULL; }
+            if (cJSON_HasObjectItem(j, "\177\302\200\302\205\302\237")) {
+                if (!cJSON_IsString(cJSON_GetObjectItemCaseSensitive(j, "\177\302\200\302\205\302\237"))) { cJSON_DeleteTopLevel(x); return NULL; }
+                x->top_level = strdup(cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(j, "\177\302\200\302\205\302\237")));
+            }
+            else {
+                if (NULL != (x->top_level = cJSON_malloc(sizeof(char)))) {
+                    x->top_level[0] = '\0';
+                }
+            }
+            if (!cJSON_HasObjectItem(j, "\\033")) { cJSON_DeleteTopLevel(x); return NULL; }
+            if (cJSON_HasObjectItem(j, "\\033")) {
+                if (!cJSON_IsString(cJSON_GetObjectItemCaseSensitive(j, "\\033"))) { cJSON_DeleteTopLevel(x); return NULL; }
+                x->u001_b = strdup(cJSON_GetStringValue(cJSON_GetObjectItemCaseSensitive(j, "\\033")));
+            }
+            else {
+                if (NULL != (x->u001_b = cJSON_malloc(sizeof(char)))) {
+                    x->u001_b[0] = '\0';
+                }
+            }
+        }
+    }
+    return x;
+}
+
+cJSON * cJSON_CreateTopLevel(const struct TopLevel * x) {
+    cJSON * j = NULL;
+    if (NULL != x) {
+        if (NULL != (j = cJSON_CreateObject())) {
+            if (NULL != x->empty) {
+                cJSON_AddStringToObject(j, "\000\001\033\037", x->empty);
+            }
+            else {
+                cJSON_AddStringToObject(j, "\000\001\033\037", "");
+            }
+            if (NULL != x->purple) {
+                cJSON_AddStringToObject(j, "\U0001f600", x->purple);
+            }
+            else {
+                cJSON_AddStringToObject(j, "\U0001f600", "");
+            }
+            if (NULL != x->top_level) {
+                cJSON_AddStringToObject(j, "\177\302\200\302\205\302\237", x->top_level);
+            }
+            else {
+                cJSON_AddStringToObject(j, "\177\302\200\302\205\302\237", "");
+            }
+            if (NULL != x->u001_b) {
+                cJSON_AddStringToObject(j, "\\033", x->u001_b);
+            }
+            else {
+                cJSON_AddStringToObject(j, "\\033", "");
+            }
+        }
+    }
+    return j;
+}
+
+char * cJSON_PrintTopLevel(const struct TopLevel * x) {
+    char * s = NULL;
+    if (NULL != x) {
+        cJSON * j = cJSON_CreateTopLevel(x);
+        if (NULL != j) {
+            s = cJSON_Print(j);
+            cJSON_Delete(j);
+        }
+    }
+    return s;
+}
+
+void cJSON_DeleteTopLevel(struct TopLevel * x) {
+    if (NULL != x) {
+        if (NULL != x->empty) {
+            cJSON_free(x->empty);
+        }
+        if (NULL != x->purple) {
+            cJSON_free(x->purple);
+        }
+        if (NULL != x->top_level) {
+            cJSON_free(x->top_level);
+        }
+        if (NULL != x->u001_b) {
+            cJSON_free(x->u001_b);
+        }
+        cJSON_free(x);
+    }
+}
diff --git a/head/cjson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.h b/head/cjson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.h
new file mode 100644
index 0000000..2e3f808
--- /dev/null
+++ b/head/cjson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.h
@@ -0,0 +1,58 @@
+/**
+ * TopLevel.h
+ * This file has been autogenerated using quicktype https://github.com/quicktype/quicktype - DO NOT EDIT
+ * This file depends of https://github.com/DaveGamble/cJSON, https://github.com/joelguittet/c-list and https://github.com/joelguittet/c-hashtable
+ * To parse json data from json string use the following: struct <type> * data = cJSON_Parse<type>(<string>);
+ * To get json data from cJSON object use the following: struct <type> * data = cJSON_Get<type>Value(<cjson>);
+ * To get cJSON object from json data use the following: cJSON * cjson = cJSON_Create<type>(<data>);
+ * To print json string from json data use the following: char * string = cJSON_Print<type>(<data>);
+ * To delete json data use the following: cJSON_Delete<type>(<data>);
+ */
+
+#ifndef __TOPLEVEL_H__
+#define __TOPLEVEL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <regex.h>
+#include <cJSON.h>
+#include <hashtable.h>
+#include <list.h>
+
+#define quicktype_cJSON_Duplicate(j) cJSON_Duplicate(j, true)
+#define cJSON_Integer (1 << 18)
+#define quicktype_cJSON_IsInteger(j) (cJSON_IsNumber(j) && (j)->valuedouble == (int64_t)(j)->valuedouble)
+#ifndef cJSON_Bool
+#define cJSON_Bool (cJSON_True | cJSON_False)
+#endif
+#ifndef cJSON_Map
+#define cJSON_Map (1 << 16)
+#endif
+#ifndef cJSON_Enum
+#define cJSON_Enum (1 << 17)
+#endif
+
+struct TopLevel {
+    char * empty;
+    char * purple;
+    char * top_level;
+    char * u001_b;
+};
+
+struct TopLevel * cJSON_ParseTopLevel(const char * s);
+struct TopLevel * cJSON_GetTopLevelValue(const cJSON * j);
+cJSON * cJSON_CreateTopLevel(const struct TopLevel * x);
+char * cJSON_PrintTopLevel(const struct TopLevel * x);
+void cJSON_DeleteTopLevel(struct TopLevel * x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TOPLEVEL_H__ */
diff --git a/base/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp
index c3aa09a..07becbf 100644
--- a/base/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp
@@ -4310,6 +4310,20 @@ namespace quicktype {
         void set_right(const int64_t & value) { this->right = value; }
     };
 
+    class S {
+        public:
+        S() = default;
+        virtual ~S() = default;
+
+        private:
+        int64_t s;
+
+        public:
+        const int64_t & get_s() const { return s; }
+        int64_t & get_mutable_s() { return s; }
+        void set_s(const int64_t & value) { this->s = value; }
+    };
+
     class Sbyte {
         public:
         Sbyte() = default;
@@ -4719,6 +4733,7 @@ namespace quicktype {
         Retain retain;
         Rethrows rethrows;
         Right right;
+        S s;
         Sbyte sbyte;
         Sealed sealed;
         Sel sel;
@@ -4903,6 +4918,10 @@ namespace quicktype {
         Right & get_mutable_right() { return right; }
         void set_right(const Right & value) { this->right = value; }
 
+        const S & get_s() const { return s; }
+        S & get_mutable_s() { return s; }
+        void set_s(const S & value) { this->s = value; }
+
         const Sbyte & get_sbyte() const { return sbyte; }
         Sbyte & get_mutable_sbyte() { return sbyte; }
         void set_sbyte(const Sbyte & value) { this->sbyte = value; }
@@ -6151,6 +6170,9 @@ namespace quicktype {
     void from_json(const json & j, Right & x);
     void to_json(json & j, const Right & x);
 
+    void from_json(const json & j, S & x);
+    void to_json(json & j, const S & x);
+
     void from_json(const json & j, Sbyte & x);
     void to_json(json & j, const Sbyte & x);
 
@@ -9284,6 +9306,17 @@ namespace quicktype {
         j["right"] = x.get_right();
     }
 
+    inline void from_json(const json & j, S& x) {
+        if (!j.is_object()) throw std::runtime_error("Expected object");
+        if (j.find("s") != j.end() && !j.at("s").is_number_integer()) throw std::runtime_error("Expected integer");
+        x.set_s(j.at("s").get<int64_t>());
+    }
+
+    inline void to_json(json & j, const S & x) {
+        j = json::object();
+        j["s"] = x.get_s();
+    }
+
     inline void from_json(const json & j, Sbyte& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("sbyte") != j.end() && !j.at("sbyte").is_number_integer()) throw std::runtime_error("Expected integer");
@@ -9612,6 +9645,7 @@ namespace quicktype {
         x.set_retain(j.at("retain").get<Retain>());
         x.set_rethrows(j.at("rethrows").get<Rethrows>());
         x.set_right(j.at("right").get<Right>());
+        x.set_s(j.at("s").get<S>());
         x.set_sbyte(j.at("sbyte").get<Sbyte>());
         x.set_sealed(j.at("sealed").get<Sealed>());
         x.set_sel(j.at("SEL").get<Sel>());
@@ -9681,6 +9715,7 @@ namespace quicktype {
         j["retain"] = x.get_retain();
         j["rethrows"] = x.get_rethrows();
         j["right"] = x.get_right();
+        j["s"] = x.get_s();
         j["sbyte"] = x.get_sbyte();
         j["sealed"] = x.get_sealed();
         j["SEL"] = x.get_sel();
diff --git a/head/cplusplus/test/inputs/json/samples/objc-control-characters.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/samples/objc-control-characters.json/default/quicktype.hpp
new file mode 100644
index 0000000..d3210b9
--- /dev/null
+++ b/head/cplusplus/test/inputs/json/samples/objc-control-characters.json/default/quicktype.hpp
@@ -0,0 +1,83 @@
+//  To parse this JSON data, first install
+//
+//      json.hpp  https://github.com/nlohmann/json
+//
+//  Then include this file, and then do
+//
+//     TopLevel data = nlohmann::json::parse(jsonString);
+
+#pragma once
+
+#include "json.hpp"
+
+#include <optional>
+#include <stdexcept>
+#include <regex>
+
+namespace quicktype {
+    using nlohmann::json;
+
+    #ifndef NLOHMANN_UNTYPED_quicktype_HELPER
+    #define NLOHMANN_UNTYPED_quicktype_HELPER
+    inline json get_untyped(const json & j, const char * property) {
+        if (j.find(property) != j.end()) {
+            return j.at(property).get<json>();
+        }
+        return json();
+    }
+
+    inline json get_untyped(const json & j, std::string property) {
+        return get_untyped(j, property.data());
+    }
+    #endif
+
+    class TopLevel {
+        public:
+        TopLevel() = default;
+        virtual ~TopLevel() = default;
+
+        private:
+        std::string empty;
+        std::string purple;
+        std::string top_level;
+        std::string u001_b;
+
+        public:
+        const std::string & get_empty() const { return empty; }
+        std::string & get_mutable_empty() { return empty; }
+        void set_empty(const std::string & value) { this->empty = value; }
+
+        const std::string & get_purple() const { return purple; }
+        std::string & get_mutable_purple() { return purple; }
+        void set_purple(const std::string & value) { this->purple = value; }
+
+        const std::string & get_top_level() const { return top_level; }
+        std::string & get_mutable_top_level() { return top_level; }
+        void set_top_level(const std::string & value) { this->top_level = value; }
+
+        const std::string & get_u001_b() const { return u001_b; }
+        std::string & get_mutable_u001_b() { return u001_b; }
+        void set_u001_b(const std::string & value) { this->u001_b = value; }
+    };
+}
+
+namespace quicktype {
+    void from_json(const json & j, TopLevel & x);
+    void to_json(json & j, const TopLevel & x);
+
+    inline void from_json(const json & j, TopLevel& x) {
+        if (!j.is_object()) throw std::runtime_error("Expected object");
+        x.set_empty(j.at(([] { constexpr auto &s = "\u0000\u0001\u001b\u001f"; return std::string(s, sizeof(s) / sizeof(s[0]) - 1); }())).get<std::string>());
+        x.set_purple(j.at("\U0001f600").get<std::string>());
+        x.set_top_level(j.at("\u007f\u0080\u0085\u009f").get<std::string>());
+        x.set_u001_b(j.at("\\u001b").get<std::string>());
+    }
+
+    inline void to_json(json & j, const TopLevel & x) {
+        j = json::object();
+        j[([] { constexpr auto &s = "\u0000\u0001\u001b\u001f"; return std::string(s, sizeof(s) / sizeof(s[0]) - 1); }())] = x.get_empty();
+        j["\U0001f600"] = x.get_purple();
+        j["\u007f\u0080\u0085\u009f"] = x.get_top_level();
+        j["\\u001b"] = x.get_u001_b();
+    }
+}
diff --git a/base/crystal/test/inputs/json/priority/keywords.json/default/TopLevel.cr b/head/crystal/test/inputs/json/priority/keywords.json/default/TopLevel.cr
index b92d91e..2667c39 100644
--- a/base/crystal/test/inputs/json/priority/keywords.json/default/TopLevel.cr
+++ b/head/crystal/test/inputs/json/priority/keywords.json/default/TopLevel.cr
@@ -1755,6 +1755,8 @@ class Obj4
 
   property right : Right
 
+  property s : S
+
   property sbyte : Sbyte
 
   property sealed : Sealed
@@ -2020,6 +2022,12 @@ class Right
   property right : Int64
 end
 
+class S
+  include JSON::Serializable
+
+  property s : Int64
+end
+
 class Sbyte
   include JSON::Serializable
 
diff --git a/head/crystal/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.cr b/head/crystal/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.cr
new file mode 100644
index 0000000..19141b9
--- /dev/null
+++ b/head/crystal/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.cr
@@ -0,0 +1,17 @@
+require "json"
+
+class TopLevel
+  include JSON::Serializable
+
+  @[JSON::Field(key: "\u{0000}\u{0001}\u{001b}\u{001f}")]
+  property empty : String
+
+  @[JSON::Field(key: "\u{01f600}")]
+  property purple : String
+
+  @[JSON::Field(key: "\u{007f}\u{0080}\u{0085}\u{009f}")]
+  property top_level : String
+
+  @[JSON::Field(key: "\\u001b")]
+  property u001_b : String
+end
diff --git a/base/csharp/test/inputs/json/priority/keywords.json/default/QuickType.cs b/head/csharp/test/inputs/json/priority/keywords.json/default/QuickType.cs
index dd675f2..d88524a 100644
--- a/base/csharp/test/inputs/json/priority/keywords.json/default/QuickType.cs
+++ b/head/csharp/test/inputs/json/priority/keywords.json/default/QuickType.cs
@@ -1885,6 +1885,9 @@ namespace QuickType
         [JsonProperty("right", Required = Required.Always)]
         public Right Right { get; set; }
 
+        [JsonProperty("s", Required = Required.Always)]
+        public S S { get; set; }
+
         [JsonProperty("sbyte", Required = Required.Always)]
         public Sbyte Sbyte { get; set; }
 
@@ -2141,6 +2144,12 @@ namespace QuickType
         public long RightRight { get; set; }
     }
 
+    public partial class S
+    {
+        [JsonProperty("s", Required = Required.Always)]
+        public long SS { get; set; }
+    }
+
     public partial class Sbyte
     {
         [JsonProperty("sbyte", Required = Required.Always)]
diff --git a/head/csharp/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs b/head/csharp/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs
new file mode 100644
index 0000000..3b43ddd
--- /dev/null
+++ b/head/csharp/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs
@@ -0,0 +1,70 @@
+// <auto-generated />
+//
+// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
+//
+//    using QuickType;
+//
+//    var topLevel = TopLevel.FromJson(jsonString);
+#nullable enable
+#pragma warning disable CS8618
+#pragma warning disable CS8601
+#pragma warning disable CS8602
+#pragma warning disable CS8603
+#pragma warning disable CS8604
+#pragma warning disable CS8625
+#pragma warning disable CS8765
+
+namespace QuickType
+{
+    using System;
+    using System.Collections.Generic;
+
+    using System.Globalization;
+    using Newtonsoft.Json;
+    using Newtonsoft.Json.Converters;
+
+    public partial class TopLevel
+    {
+        [JsonProperty("\u0000\u0001\u001b\u001f", Required = Required.Always)]
+        public string Empty { get; set; }
+
+        [JsonProperty("\ud83d\ude00", Required = Required.Always)]
+        public string Fluffy { get; set; }
+
+        [JsonProperty("\u007f\u0080\u0085\u009f", Required = Required.Always)]
+        public string Purple { get; set; }
+
+        [JsonProperty("\\u001b", Required = Required.Always)]
+        public string U001B { get; set; }
+    }
+
+    public partial class TopLevel
+    {
+        public static TopLevel FromJson(string json) => JsonConvert.DeserializeObject<TopLevel>(json, QuickType.Converter.Settings);
+    }
+
+    public static partial class Serialize
+    {
+        public static string ToJson(this TopLevel self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
+    }
+
+    internal static partial class Converter
+    {
+        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
+        {
+            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
+            DateParseHandling = DateParseHandling.None,
+            Converters =
+            {
+                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
+            },
+        };
+    }
+}
+#pragma warning restore CS8618
+#pragma warning restore CS8601
+#pragma warning restore CS8602
+#pragma warning restore CS8603
+#pragma warning restore CS8604
+#pragma warning restore CS8625
+#pragma warning restore CS8765
diff --git a/base/csharp-SystemTextJson/test/inputs/json/priority/keywords.json/default/QuickType.cs b/head/csharp-SystemTextJson/test/inputs/json/priority/keywords.json/default/QuickType.cs
index eed1117..1e333ba 100644
--- a/base/csharp-SystemTextJson/test/inputs/json/priority/keywords.json/default/QuickType.cs
+++ b/head/csharp-SystemTextJson/test/inputs/json/priority/keywords.json/default/QuickType.cs
@@ -2303,6 +2303,10 @@ namespace QuickType
         [JsonPropertyName("right")]
         public Right Right { get; set; }
 
+        [JsonRequired]
+        [JsonPropertyName("s")]
+        public S S { get; set; }
+
         [JsonRequired]
         [JsonPropertyName("sbyte")]
         public Sbyte Sbyte { get; set; }
@@ -2623,6 +2627,13 @@ namespace QuickType
         public long RightRight { get; set; }
     }
 
+    public partial class S
+    {
+        [JsonRequired]
+        [JsonPropertyName("s")]
+        public long SS { get; set; }
+    }
+
     public partial class Sbyte
     {
         [JsonRequired]
diff --git a/head/csharp-SystemTextJson/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs b/head/csharp-SystemTextJson/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs
new file mode 100644
index 0000000..fa62826
--- /dev/null
+++ b/head/csharp-SystemTextJson/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs
@@ -0,0 +1,178 @@
+// <auto-generated />
+//
+// To parse this JSON data, add NuGet 'System.Text.Json' then do:
+//
+//    using QuickType;
+//
+//    var topLevel = TopLevel.FromJson(jsonString);
+#nullable enable
+#pragma warning disable CS8618
+#pragma warning disable CS8601
+#pragma warning disable CS8602
+#pragma warning disable CS8603
+
+namespace QuickType
+{
+    using System;
+    using System.Collections.Generic;
+
+    using System.Text.Json;
+    using System.Text.Json.Serialization;
+    using System.Globalization;
+
+    public partial class TopLevel
+    {
+        [JsonRequired]
+        [JsonPropertyName("\u0000\u0001\u001b\u001f")]
+        public string Empty { get; set; }
+
+        [JsonRequired]
+        [JsonPropertyName("\ud83d\ude00")]
+        public string Fluffy { get; set; }
+
+        [JsonRequired]
+        [JsonPropertyName("\u007f\u0080\u0085\u009f")]
+        public string Purple { get; set; }
+
+        [JsonRequired]
+        [JsonPropertyName("\\u001b")]
+        public string U001B { get; set; }
+    }
+
+    public partial class TopLevel
+    {
+        public static TopLevel FromJson(string json) => global::System.Text.Json.JsonSerializer.Deserialize<TopLevel>(json, QuickType.Converter.Settings);
+    }
+
+    public static partial class Serialize
+    {
+        public static string ToJson(this TopLevel self) => JsonSerializer.Serialize(self, QuickType.Converter.Settings);
+    }
+
+    internal static partial class Converter
+    {
+        public static readonly JsonSerializerOptions Settings = new(JsonSerializerDefaults.General)
+        {
+            Converters =
+            {
+                new DateOnlyConverter(),
+                new TimeOnlyConverter(),
+                IsoDateTimeOffsetConverter.Singleton
+            },
+        };
+    }
+    
+    public class DateOnlyConverter : JsonConverter<DateOnly>
+    {
+        private readonly string serializationFormat;
+        public DateOnlyConverter() : this(null) { }
+
+        public DateOnlyConverter(string? serializationFormat)
+        {
+                this.serializationFormat = serializationFormat ?? "yyyy-MM-dd";
+        }
+
+        public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+                var value = reader.GetString();
+                return DateOnly.Parse(value!);
+        }
+
+        public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
+                => writer.WriteStringValue(value.ToString(serializationFormat));
+    }
+
+    public class TimeOnlyConverter : JsonConverter<TimeOnly>
+    {
+        private readonly string serializationFormat;
+
+        public TimeOnlyConverter() : this(null) { }
+
+        public TimeOnlyConverter(string? serializationFormat)
+        {
+                this.serializationFormat = serializationFormat ?? "HH:mm:ss.fff";
+        }
+
+        public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+                var value = reader.GetString();
+                return TimeOnly.Parse(value!);
+        }
+
+        public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
+                => writer.WriteStringValue(value.ToString(serializationFormat));
+    }
+
+    internal class IsoDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
+    {
+        public override bool CanConvert(Type t) => t == typeof(DateTimeOffset);
+
+        private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
+
+        private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind;
+        private string? _dateTimeFormat;
+        private CultureInfo? _culture;
+
+        public DateTimeStyles DateTimeStyles
+        {
+                get => _dateTimeStyles;
+                set => _dateTimeStyles = value;
+        }
+
+        public string? DateTimeFormat
+        {
+                get => _dateTimeFormat ?? string.Empty;
+                set => _dateTimeFormat = (string.IsNullOrEmpty(value)) ? null : value;
+        }
+
+        public CultureInfo Culture
+        {
+                get => _culture ?? CultureInfo.CurrentCulture;
+                set => _culture = value;
+        }
+
+        public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
+        {
+                string text;
+
+
+                if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal
+                        || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal)
+                {
+                        value = value.ToUniversalTime();
+                }
+
+                text = value.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture);
+
+                writer.WriteStringValue(text);
+        }
+
+        public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+                string? dateText = reader.GetString();
+
+                if (string.IsNullOrEmpty(dateText) == false)
+                {
+                        if (!string.IsNullOrEmpty(_dateTimeFormat))
+                        {
+                                return DateTimeOffset.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles);
+                        }
+                        else
+                        {
+                                return DateTimeOffset.Parse(dateText, Culture, _dateTimeStyles);
+                        }
+                }
+                else
+                {
+                        return default(DateTimeOffset);
+                }
+        }
+
+
+        public static readonly IsoDateTimeOffsetConverter Singleton = new IsoDateTimeOffsetConverter();
+    }
+}
+#pragma warning restore CS8618
+#pragma warning restore CS8601
+#pragma warning restore CS8602
+#pragma warning restore CS8603
diff --git a/base/csharp-records/test/inputs/json/priority/keywords.json/default/QuickType.cs b/head/csharp-records/test/inputs/json/priority/keywords.json/default/QuickType.cs
index 65c63fd..eec1680 100644
--- a/base/csharp-records/test/inputs/json/priority/keywords.json/default/QuickType.cs
+++ b/head/csharp-records/test/inputs/json/priority/keywords.json/default/QuickType.cs
@@ -1885,6 +1885,9 @@ namespace QuickType
         [JsonProperty("right", Required = Required.Always)]
         public Right Right { get; set; }
 
+        [JsonProperty("s", Required = Required.Always)]
+        public S S { get; set; }
+
         [JsonProperty("sbyte", Required = Required.Always)]
         public Sbyte Sbyte { get; set; }
 
@@ -2141,6 +2144,12 @@ namespace QuickType
         public long RightRight { get; set; }
     }
 
+    public partial record S
+    {
+        [JsonProperty("s", Required = Required.Always)]
+        public long SS { get; set; }
+    }
+
     public partial record Sbyte
     {
         [JsonProperty("sbyte", Required = Required.Always)]
diff --git a/head/csharp-records/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs b/head/csharp-records/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs
new file mode 100644
index 0000000..46c2287
--- /dev/null
+++ b/head/csharp-records/test/inputs/json/samples/objc-control-characters.json/default/QuickType.cs
@@ -0,0 +1,70 @@
+// <auto-generated />
+//
+// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
+//
+//    using QuickType;
+//
+//    var topLevel = TopLevel.FromJson(jsonString);
+#nullable enable
+#pragma warning disable CS8618
+#pragma warning disable CS8601
+#pragma warning disable CS8602
+#pragma warning disable CS8603
+#pragma warning disable CS8604
+#pragma warning disable CS8625
+#pragma warning disable CS8765
+
+namespace QuickType
+{
+    using System;
+    using System.Collections.Generic;
+
+    using System.Globalization;
+    using Newtonsoft.Json;
+    using Newtonsoft.Json.Converters;
+
+    public partial record TopLevel
+    {
+        [JsonProperty("\u0000\u0001\u001b\u001f", Required = Required.Always)]
+        public string Empty { get; set; }
+
+        [JsonProperty("\ud83d\ude00", Required = Required.Always)]
+        public string Fluffy { get; set; }
+
+        [JsonProperty("\u007f\u0080\u0085\u009f", Required = Required.Always)]
+        public string Purple { get; set; }
+
+        [JsonProperty("\\u001b", Required = Required.Always)]
+        public string U001B { get; set; }
+    }
+
+    public partial record TopLevel
+    {
+        public static TopLevel FromJson(string json) => JsonConvert.DeserializeObject<TopLevel>(json, QuickType.Converter.Settings);
+    }
+
+    public static partial class Serialize
+    {
+        public static string ToJson(this TopLevel self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
+    }
+
+    internal static partial class Converter
+    {
+        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
+        {
+            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
+            DateParseHandling = DateParseHandling.None,
+            Converters =
+            {
+                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
+            },
+        };
+    }
+}
+#pragma warning restore CS8618
+#pragma warning restore CS8601
+#pragma warning restore CS8602
+#pragma warning restore CS8603
+#pragma warning restore CS8604
+#pragma warning restore CS8625
+#pragma warning restore CS8765
diff --git a/base/dart/test/inputs/json/priority/keywords.json/default/TopLevel.dart b/head/dart/test/inputs/json/priority/keywords.json/default/TopLevel.dart
index e011b3d..5d004bc 100644
--- a/base/dart/test/inputs/json/priority/keywords.json/default/TopLevel.dart
+++ b/head/dart/test/inputs/json/priority/keywords.json/default/TopLevel.dart
@@ -4024,6 +4024,7 @@ class Obj4 {
     final Retain retain;
     final Rethrows rethrows;
     final Right right;
+    final S s;
     final Sbyte sbyte;
     final Sealed sealed;
     final Sel sel;
@@ -4091,6 +4092,7 @@ class Obj4 {
         required this.retain,
         required this.rethrows,
         required this.right,
+        required this.s,
         required this.sbyte,
         required this.sealed,
         required this.sel,
@@ -4159,6 +4161,7 @@ class Obj4 {
         retain: Retain.fromJson(json["retain"]),
         rethrows: Rethrows.fromJson(json["rethrows"]),
         right: Right.fromJson(json["right"]),
+        s: S.fromJson(json["s"]),
         sbyte: Sbyte.fromJson(json["sbyte"]),
         sealed: Sealed.fromJson(json["sealed"]),
         sel: Sel.fromJson(json["SEL"]),
@@ -4227,6 +4230,7 @@ class Obj4 {
         "retain": retain.toJson(),
         "rethrows": rethrows.toJson(),
         "right": right.toJson(),
+        "s": s.toJson(),
         "sbyte": sbyte.toJson(),
         "sealed": sealed.toJson(),
         "SEL": sel.toJson(),
@@ -4744,6 +4748,22 @@ class Right {
     };
 }
 
+class S {
+    final int s;
+
+    S({
+        required this.s,
+    });
+
+    factory S.fromJson(Map<String, dynamic> json) => S(
+        s: json["s"],
+    );
+
+    Map<String, dynamic> toJson() => {
+        "s": s,
+    };
+}
+
 class Sbyte {
     final int sbyte;
 
diff --git a/head/dart/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.dart b/head/dart/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.dart
new file mode 100644
index 0000000..482891c
--- /dev/null
+++ b/head/dart/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.dart
@@ -0,0 +1,37 @@
+// To parse this JSON data, do
+//
+//     final topLevel = topLevelFromJson(jsonString);
+
+import 'dart:convert';
+
+TopLevel topLevelFromJson(String str) => TopLevel.fromJson(json.decode(str));
+
+String topLevelToJson(TopLevel data) => json.encode(data.toJson());
+
+class TopLevel {
+    final String empty;
+    final String purple;
+    final String topLevel;
+    final String u001B;
+
+    TopLevel({
+        required this.empty,
+        required this.purple,
+        required this.topLevel,
+        required this.u001B,
+    });
+
+    factory TopLevel.fromJson(Map<String, dynamic> json) => TopLevel(
+        empty: json["\u0000\u0001\u001b\u001f"],
+        purple: json["\ud83d\ude00"],
+        topLevel: json["\u007f\u0080\u0085\u009f"],
+        u001B: json["\\u001b"],
+    );
+
+    Map<String, dynamic> toJson() => {
+        "\u0000\u0001\u001b\u001f": empty,
+        "\ud83d\ude00": purple,
+        "\u007f\u0080\u0085\u009f": topLevel,
+        "\\u001b": u001B,
+    };
+}
diff --git a/head/dart/test/inputs/json/samples/simple-object.json/required-props-true--48bfba14a57c/TopLevel.dart b/head/dart/test/inputs/json/samples/simple-object.json/required-props-true--48bfba14a57c/TopLevel.dart
new file mode 100644
index 0000000..c9af3a9
--- /dev/null
+++ b/head/dart/test/inputs/json/samples/simple-object.json/required-props-true--48bfba14a57c/TopLevel.dart
@@ -0,0 +1,33 @@
+// To parse this JSON data, do
+//
+//     final topLevel = topLevelFromJson(jsonString);
+
+import 'dart:convert';
+
+TopLevel topLevelFromJson(String str) => TopLevel.fromJson(json.decode(str));
+
+String topLevelToJson(TopLevel data) => json.encode(data.toJson());
+
+class TopLevel {
+    final int date;
+    final String title;
+    final bool validity;
+
+    TopLevel({
+        required this.date,
+        required this.title,
+        required this.validity,
+    });
+
+    factory TopLevel.fromJson(Map<String, dynamic> json) => TopLevel(
+        date: json["date"],
+        title: json["title"],
+        validity: json["validity"],
+    );
+
+    Map<String, dynamic> toJson() => {
+        "date": date,
+        "title": title,
+        "validity": validity,
+    };
+}
diff --git a/base/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
index eb10b18..cc66c89 100644
--- a/base/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
@@ -1591,6 +1591,12 @@ defmodule Payload do
   def encode_before(value) when is_binary(value), do: value
   def encode_before(_), do: {:error, "Unexpected type when encoding Payload.before"}
 
+  def decode_distinct_size(value) when is_integer(value), do: value
+  def decode_distinct_size(_), do: {:error, "Unexpected type when decoding Payload.distinct_size"}
+
+  def encode_distinct_size(value) when is_integer(value), do: value
+  def encode_distinct_size(_), do: {:error, "Unexpected type when encoding Payload.distinct_size"}
+
   def decode_head(value) when is_binary(value), do: value
   def decode_head(_), do: {:error, "Unexpected type when decoding Payload.head"}
 
@@ -1603,6 +1609,18 @@ defmodule Payload do
   def encode_master_branch(value) when is_binary(value), do: value
   def encode_master_branch(_), do: {:error, "Unexpected type when encoding Payload.master_branch"}
 
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Payload.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Payload.number"}
+
+  def decode_push_id(value) when is_integer(value), do: value
+  def decode_push_id(_), do: {:error, "Unexpected type when decoding Payload.push_id"}
+
+  def encode_push_id(value) when is_integer(value), do: value
+  def encode_push_id(_), do: {:error, "Unexpected type when encoding Payload.push_id"}
+
   def decode_pusher_type(value) when is_binary(value), do: value
   def decode_pusher_type(_), do: {:error, "Unexpected type when decoding Payload.pusher_type"}
 
@@ -1621,22 +1639,28 @@ defmodule Payload do
   def encode_ref_type(value) when is_binary(value), do: value
   def encode_ref_type(_), do: {:error, "Unexpected type when encoding Payload.ref_type"}
 
+  def decode_size(value) when is_integer(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding Payload.size"}
+
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding Payload.size"}
+
   def from_map(m) do
     %Payload{
       action: m["action"] && decode_action(m["action"]),
       before: m["before"] && decode_before(m["before"]),
       commits: m["commits"] && Enum.map(m["commits"], &Commit.from_map/1),
       description: m["description"],
-      distinct_size: m["distinct_size"],
+      distinct_size: m["distinct_size"] && decode_distinct_size(m["distinct_size"]),
       head: m["head"] && decode_head(m["head"]),
       master_branch: m["master_branch"] && decode_master_branch(m["master_branch"]),
-      number: m["number"],
+      number: m["number"] && decode_number(m["number"]),
       pull_request: m["pull_request"] && PullRequest.from_map(m["pull_request"]),
-      push_id: m["push_id"],
+      push_id: m["push_id"] && decode_push_id(m["push_id"]),
       pusher_type: m["pusher_type"] && decode_pusher_type(m["pusher_type"]),
       ref: m["ref"] && decode_ref(m["ref"]),
       ref_type: m["ref_type"] && decode_ref_type(m["ref_type"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex
index f9bd201..418201b 100644
--- a/base/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex
@@ -265,6 +265,18 @@ defmodule Column do
   def encode_render_type_name(value) when is_binary(value), do: value
   def encode_render_type_name(_), do: {:error, "Unexpected type when encoding Column.render_type_name"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -276,8 +288,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: decode_render_type_name(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
index 30588b1..90238c3 100644
--- a/base/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
@@ -243,12 +243,24 @@ defmodule MediaEmbed do
   def encode_content(value) when is_binary(value), do: value
   def encode_content(_), do: {:error, "Unexpected type when encoding MediaEmbed.content"}
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding MediaEmbed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding MediaEmbed.height"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding MediaEmbed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding MediaEmbed.width"}
+
   def from_map(m) do
     %MediaEmbed{
       content: m["content"] && decode_content(m["content"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       scrolling: m["scrolling"],
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex
index cadf6d3..94e3df4 100644
--- a/base/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex
@@ -18,6 +18,38 @@ defmodule Rates do
           super_reduced: float() | nil
         }
 
+  def decode_parking(value) when is_float(value), do: value
+  def decode_parking(value) when is_integer(value), do: value
+  def decode_parking(_), do: {:error, "Unexpected type when decoding Rates.parking"}
+
+  def encode_parking(value) when is_float(value), do: value
+  def encode_parking(value) when is_integer(value), do: value
+  def encode_parking(_), do: {:error, "Unexpected type when encoding Rates.parking"}
+
+  def decode_reduced(value) when is_float(value), do: value
+  def decode_reduced(value) when is_integer(value), do: value
+  def decode_reduced(_), do: {:error, "Unexpected type when decoding Rates.reduced"}
+
+  def encode_reduced(value) when is_float(value), do: value
+  def encode_reduced(value) when is_integer(value), do: value
+  def encode_reduced(_), do: {:error, "Unexpected type when encoding Rates.reduced"}
+
+  def decode_reduced1(value) when is_float(value), do: value
+  def decode_reduced1(value) when is_integer(value), do: value
+  def decode_reduced1(_), do: {:error, "Unexpected type when decoding Rates.reduced1"}
+
+  def encode_reduced1(value) when is_float(value), do: value
+  def encode_reduced1(value) when is_integer(value), do: value
+  def encode_reduced1(_), do: {:error, "Unexpected type when encoding Rates.reduced1"}
+
+  def decode_reduced2(value) when is_float(value), do: value
+  def decode_reduced2(value) when is_integer(value), do: value
+  def decode_reduced2(_), do: {:error, "Unexpected type when decoding Rates.reduced2"}
+
+  def encode_reduced2(value) when is_float(value), do: value
+  def encode_reduced2(value) when is_integer(value), do: value
+  def encode_reduced2(_), do: {:error, "Unexpected type when encoding Rates.reduced2"}
+
   def decode_standard(value) when is_float(value), do: value
   def decode_standard(value) when is_integer(value), do: value
   def decode_standard(_), do: {:error, "Unexpected type when decoding Rates.standard"}
@@ -26,14 +58,22 @@ defmodule Rates do
   def encode_standard(value) when is_integer(value), do: value
   def encode_standard(_), do: {:error, "Unexpected type when encoding Rates.standard"}
 
+  def decode_super_reduced(value) when is_float(value), do: value
+  def decode_super_reduced(value) when is_integer(value), do: value
+  def decode_super_reduced(_), do: {:error, "Unexpected type when decoding Rates.super_reduced"}
+
+  def encode_super_reduced(value) when is_float(value), do: value
+  def encode_super_reduced(value) when is_integer(value), do: value
+  def encode_super_reduced(_), do: {:error, "Unexpected type when encoding Rates.super_reduced"}
+
   def from_map(m) do
     %Rates{
-      parking: m["parking"],
-      reduced: m["reduced"],
-      reduced1: m["reduced1"],
-      reduced2: m["reduced2"],
+      parking: m["parking"] && decode_parking(m["parking"]),
+      reduced: m["reduced"] && decode_reduced(m["reduced"]),
+      reduced1: m["reduced1"] && decode_reduced1(m["reduced1"]),
+      reduced2: m["reduced2"] && decode_reduced2(m["reduced2"]),
       standard: decode_standard(m["standard"]),
-      super_reduced: m["super_reduced"],
+      super_reduced: m["super_reduced"] && decode_super_reduced(m["super_reduced"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex
index 939160d..bf90451 100644
--- a/base/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex
@@ -223,6 +223,18 @@ defmodule Column do
   def encode_render_type_name(value) when is_binary(value), do: value
   def encode_render_type_name(_), do: {:error, "Unexpected type when encoding Column.render_type_name"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -234,8 +246,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: decode_render_type_name(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
index 22cc61d..3ed69c2 100644
--- a/base/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
@@ -210,12 +210,24 @@ defmodule MediaEmbed do
   def encode_content(value) when is_binary(value), do: value
   def encode_content(_), do: {:error, "Unexpected type when encoding MediaEmbed.content"}
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding MediaEmbed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding MediaEmbed.height"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding MediaEmbed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding MediaEmbed.width"}
+
   def from_map(m) do
     %MediaEmbed{
       content: m["content"] && decode_content(m["content"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       scrolling: m["scrolling"],
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex
index f5b0703..501b2e7 100644
--- a/base/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex
@@ -264,6 +264,18 @@ defmodule Column do
   def encode_position(value) when is_integer(value), do: value
   def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -275,8 +287,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex
index e98e9ab..e3cac7d 100644
--- a/base/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex
@@ -271,6 +271,18 @@ defmodule Column do
   def encode_position(value) when is_integer(value), do: value
   def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -283,8 +295,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
index fa35207..334a6fb 100644
--- a/base/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
@@ -201,12 +201,24 @@ defmodule MediaEmbed do
   def encode_content(value) when is_binary(value), do: value
   def encode_content(_), do: {:error, "Unexpected type when encoding MediaEmbed.content"}
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding MediaEmbed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding MediaEmbed.height"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding MediaEmbed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding MediaEmbed.width"}
+
   def from_map(m) do
     %MediaEmbed{
       content: m["content"] && decode_content(m["content"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       scrolling: m["scrolling"],
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex
index c6809b7..2d4c3a5 100644
--- a/base/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex
@@ -264,6 +264,18 @@ defmodule Column do
   def encode_position(value) when is_integer(value), do: value
   def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -275,8 +287,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
index 8c7e7da..549a642 100644
--- a/base/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
@@ -244,12 +244,24 @@ defmodule MediaEmbed do
   def encode_content(value) when is_binary(value), do: value
   def encode_content(_), do: {:error, "Unexpected type when encoding MediaEmbed.content"}
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding MediaEmbed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding MediaEmbed.height"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding MediaEmbed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding MediaEmbed.width"}
+
   def from_map(m) do
     %MediaEmbed{
       content: m["content"] && decode_content(m["content"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       scrolling: m["scrolling"],
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex
index d4ed30a..e413f2e 100644
--- a/base/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex
@@ -634,14 +634,26 @@ defmodule ChildMetadata do
           unified_version: integer() | nil
         }
 
+  def decode_include_auto(value) when is_integer(value), do: value
+  def decode_include_auto(_), do: {:error, "Unexpected type when decoding ChildMetadata.include_auto"}
+
+  def encode_include_auto(value) when is_integer(value), do: value
+  def encode_include_auto(_), do: {:error, "Unexpected type when encoding ChildMetadata.include_auto"}
+
+  def decode_unified_version(value) when is_integer(value), do: value
+  def decode_unified_version(_), do: {:error, "Unexpected type when decoding ChildMetadata.unified_version"}
+
+  def encode_unified_version(value) when is_integer(value), do: value
+  def encode_unified_version(_), do: {:error, "Unexpected type when encoding ChildMetadata.unified_version"}
+
   def from_map(m) do
     %ChildMetadata{
       custom_values: m["customValues"],
       freeform: m["freeform"],
-      include_auto: m["includeAuto"],
+      include_auto: m["includeAuto"] && decode_include_auto(m["includeAuto"]),
       operator: m["operator"] && MetadataOperator.decode(m["operator"]),
       table_column_id: m["tableColumnId"] && TableColumnID.from_map(m["tableColumnId"]),
-      unified_version: m["unifiedVersion"],
+      unified_version: m["unifiedVersion"] && decode_unified_version(m["unifiedVersion"]),
     }
   end
 
@@ -1650,6 +1662,12 @@ defmodule Owner do
   def encode_id(value) when is_binary(value), do: value
   def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
 
+  def decode_last_notification_seen_at(value) when is_integer(value), do: value
+  def decode_last_notification_seen_at(_), do: {:error, "Unexpected type when decoding Owner.last_notification_seen_at"}
+
+  def encode_last_notification_seen_at(value) when is_integer(value), do: value
+  def encode_last_notification_seen_at(_), do: {:error, "Unexpected type when encoding Owner.last_notification_seen_at"}
+
   def decode_profile_image_url_large(value) when is_binary(value), do: value
   def decode_profile_image_url_large(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_large"}
 
@@ -1679,7 +1697,7 @@ defmodule Owner do
       display_name: decode_display_name(m["displayName"]),
       flags: m["flags"],
       id: decode_id(m["id"]),
-      last_notification_seen_at: m["lastNotificationSeenAt"],
+      last_notification_seen_at: m["lastNotificationSeenAt"] && decode_last_notification_seen_at(m["lastNotificationSeenAt"]),
       profile_image_url_large: m["profileImageUrlLarge"] && decode_profile_image_url_large(m["profileImageUrlLarge"]),
       profile_image_url_medium: m["profileImageUrlMedium"] && decode_profile_image_url_medium(m["profileImageUrlMedium"]),
       profile_image_url_small: m["profileImageUrlSmall"] && decode_profile_image_url_small(m["profileImageUrlSmall"]),
@@ -2148,6 +2166,12 @@ defmodule TopLevelElement do
   def encode_id(value) when is_binary(value), do: value
   def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
 
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.index_updated_at"}
+
   def decode_locale(value) when is_binary(value), do: value
   def decode_locale(_), do: {:error, "Unexpected type when decoding TopLevelElement.locale"}
 
@@ -2184,6 +2208,12 @@ defmodule TopLevelElement do
   def encode_publication_append_enabled(value) when is_boolean(value), do: value
   def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding TopLevelElement.publication_append_enabled"}
 
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding TopLevelElement.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding TopLevelElement.publication_date"}
+
   def decode_publication_group(value) when is_integer(value), do: value
   def decode_publication_group(_), do: {:error, "Unexpected type when decoding TopLevelElement.publication_group"}
 
@@ -2208,6 +2238,18 @@ defmodule TopLevelElement do
   def encode_row_class(value) when is_binary(value), do: value
   def encode_row_class(_), do: {:error, "Unexpected type when encoding TopLevelElement.row_class"}
 
+  def decode_row_identifier_column_id(value) when is_integer(value), do: value
+  def decode_row_identifier_column_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.row_identifier_column_id"}
+
+  def encode_row_identifier_column_id(value) when is_integer(value), do: value
+  def encode_row_identifier_column_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.row_identifier_column_id"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.rows_updated_at"}
+
   def decode_table_id(value) when is_integer(value), do: value
   def decode_table_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.table_id"}
 
@@ -2245,7 +2287,7 @@ defmodule TopLevelElement do
       hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
       hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
       id: decode_id(m["id"]),
-      index_updated_at: m["indexUpdatedAt"],
+      index_updated_at: m["indexUpdatedAt"] && decode_index_updated_at(m["indexUpdatedAt"]),
       locale: decode_locale(m["locale"]),
       metadata: TopLevelMetadata.from_map(m["metadata"]),
       moderation_status: m["moderationStatus"],
@@ -2257,15 +2299,15 @@ defmodule TopLevelElement do
       owner: Owner.from_map(m["owner"]),
       provenance: Provenance.decode(m["provenance"]),
       publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
-      publication_date: m["publicationDate"],
+      publication_date: m["publicationDate"] && decode_publication_date(m["publicationDate"]),
       publication_group: decode_publication_group(m["publicationGroup"]),
       publication_stage: PublicationStage.decode(m["publicationStage"]),
       ratings: m["ratings"] && Ratings.from_map(m["ratings"]),
       resource_name: m["resourceName"] && decode_resource_name(m["resourceName"]),
       rights: Enum.map(m["rights"], &Right.decode/1),
       row_class: m["rowClass"] && decode_row_class(m["rowClass"]),
-      row_identifier_column_id: m["rowIdentifierColumnId"],
-      rows_updated_at: m["rowsUpdatedAt"],
+      row_identifier_column_id: m["rowIdentifierColumnId"] && decode_row_identifier_column_id(m["rowIdentifierColumnId"]),
+      rows_updated_at: m["rowsUpdatedAt"] && decode_rows_updated_at(m["rowsUpdatedAt"]),
       rows_updated_by: m["rowsUpdatedBy"] && RowsUpdatedBy.decode(m["rowsUpdatedBy"]),
       table_author: TableAuthor.from_map(m["tableAuthor"]),
       table_id: decode_table_id(m["tableId"]),
diff --git a/base/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex
index 8ab9125..2e67de1 100644
--- a/base/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex
@@ -264,6 +264,18 @@ defmodule Column do
   def encode_position(value) when is_integer(value), do: value
   def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -275,8 +287,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex
index 2be7d94..4f3f0fa 100644
--- a/base/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex
@@ -298,6 +298,18 @@ defmodule Column do
   def encode_position(value) when is_integer(value), do: value
   def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Column.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Column.table_column_id"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Column.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Column.width"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
@@ -310,8 +322,8 @@ defmodule Column do
       name: decode_name(m["name"]),
       position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
-      table_column_id: m["tableColumnId"],
-      width: m["width"],
+      table_column_id: m["tableColumnId"] && decode_table_column_id(m["tableColumnId"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex
index c2835ca..3589088 100644
--- a/base/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex
@@ -1719,6 +1719,12 @@ defmodule ExtendedBy do
           type_arguments: [ExtendedBy.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ExtendedBy.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ExtendedBy.id"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding ExtendedBy.name"}
 
@@ -1728,7 +1734,7 @@ defmodule ExtendedBy do
   def from_map(m) do
     %ExtendedBy{
       constraint: m["constraint"] && ExtendedBy.from_map(m["constraint"]),
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: decode_name(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &ExtendedBy.from_map/1),
@@ -1808,6 +1814,12 @@ defmodule Type4 do
           type_arguments: [ElementType.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Type4.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Type4.id"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding Type4.name"}
 
@@ -1820,7 +1832,7 @@ defmodule Type4 do
       declaration: m["declaration"] && GetSignature.from_map(m["declaration"]),
       element_type: m["elementType"] && ElementType.from_map(m["elementType"]),
       elements: m["elements"] && Enum.map(m["elements"], &ExtendedBy.from_map/1),
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: m["name"] && decode_name(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &ElementType.from_map/1),
@@ -2598,6 +2610,12 @@ defmodule Type5 do
           types: [TypeElement.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Type5.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Type5.id"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding Type5.name"}
 
@@ -2610,7 +2628,7 @@ defmodule Type5 do
       declaration: m["declaration"] && Declaration2.from_map(m["declaration"]),
       element_type: m["elementType"] && ExtendedBy.from_map(m["elementType"]),
       elements: m["elements"] && Enum.map(m["elements"], &ElementType.from_map/1),
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: m["name"] && decode_name(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &TypeArgument1.from_map/1),
@@ -3048,6 +3066,12 @@ defmodule Type8 do
           type_arguments: [ElementType.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Type8.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Type8.id"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding Type8.name"}
 
@@ -3058,7 +3082,7 @@ defmodule Type8 do
     %Type8{
       declaration: m["declaration"] && Declaration3.from_map(m["declaration"]),
       element_type: m["elementType"] && ElementType.from_map(m["elementType"]),
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: m["name"] && decode_name(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &ElementType.from_map/1),
@@ -3188,10 +3212,16 @@ defmodule Type9 do
           type_arguments: [ElementType.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Type9.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Type9.id"}
+
   def from_map(m) do
     %Type9{
       declaration: m["declaration"] && Declaration1.from_map(m["declaration"]),
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: m["name"] && Name.decode(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &ElementType.from_map/1),
@@ -3648,6 +3678,12 @@ defmodule Type10 do
           value: String.t() | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Type10.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Type10.id"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding Type10.name"}
 
@@ -3665,7 +3701,7 @@ defmodule Type10 do
       declaration: m["declaration"] && Declaration4.from_map(m["declaration"]),
       element_type: m["elementType"] && ElementType.from_map(m["elementType"]),
       elements: m["elements"] && Enum.map(m["elements"], &ExtendedBy.from_map/1),
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: m["name"] && decode_name(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &TypeArgument2.from_map/1),
@@ -3713,6 +3749,12 @@ defmodule Type12 do
           type: String.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Type12.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Type12.id"}
+
   def decode_operator(value) when is_binary(value), do: value
   def decode_operator(_), do: {:error, "Unexpected type when decoding Type12.operator"}
 
@@ -3727,7 +3769,7 @@ defmodule Type12 do
 
   def from_map(m) do
     %Type12{
-      id: m["id"],
+      id: m["id"] && decode_id(m["id"]),
       name: m["name"] && Name.decode(m["name"]),
       operator: m["operator"] && decode_operator(m["operator"]),
       target: m["target"] && ElementType.from_map(m["target"]),
diff --git a/base/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex
index 1a398a5..c733434 100644
--- a/base/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex
@@ -246,6 +246,20 @@ defmodule ChemotherapeuticClass do
           unshy: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding ChemotherapeuticClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding ChemotherapeuticClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding ChemotherapeuticClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding ChemotherapeuticClass.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding ChemotherapeuticClass.disdiapason"}
 
@@ -257,10 +271,10 @@ defmodule ChemotherapeuticClass do
       angioneurotic: m["angioneurotic"],
       availment: m["availment"],
       bladelet: m["bladelet"],
-      catharticalness: m["catharticalness"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
       caulis: m["caulis"],
       chalcus: m["chalcus"],
-      chirotherium: m["Chirotherium"],
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       enteradenological: m["enteradenological"],
       homocerc: m["homocerc"],
@@ -433,6 +447,20 @@ defmodule CoadjustClass do
           unchargeable: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding CoadjustClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding CoadjustClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding CoadjustClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding CoadjustClass.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding CoadjustClass.disdiapason"}
 
@@ -443,8 +471,8 @@ defmodule CoadjustClass do
     %CoadjustClass{
       amidosulphonal: m["amidosulphonal"],
       benny: m["Benny"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       ensnare: m["ensnare"],
       homocerc: m["homocerc"],
@@ -2013,6 +2041,20 @@ defmodule HemocoeleClass do
           walt: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding HemocoeleClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding HemocoeleClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding HemocoeleClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding HemocoeleClass.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding HemocoeleClass.disdiapason"}
 
@@ -2025,8 +2067,8 @@ defmodule HemocoeleClass do
       amelification: m["amelification"],
       autobiographic: m["autobiographic"],
       berat: m["berat"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       disproportionably: m["disproportionably"],
       erythrite: m["erythrite"],
diff --git a/base/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex
index 93c7d8e..a5ca6e8 100644
--- a/base/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex
@@ -323,39 +323,173 @@ defmodule Amphithyron do
           undecimal: integer() | nil
         }
 
+  def decode_akroasis(value) when is_integer(value), do: value
+  def decode_akroasis(_), do: {:error, "Unexpected type when decoding Amphithyron.akroasis"}
+
+  def encode_akroasis(value) when is_integer(value), do: value
+  def encode_akroasis(_), do: {:error, "Unexpected type when encoding Amphithyron.akroasis"}
+
+  def decode_antiphonical(value) when is_integer(value), do: value
+  def decode_antiphonical(_), do: {:error, "Unexpected type when decoding Amphithyron.antiphonical"}
+
+  def encode_antiphonical(value) when is_integer(value), do: value
+  def encode_antiphonical(_), do: {:error, "Unexpected type when encoding Amphithyron.antiphonical"}
+
+  def decode_basebred(value) when is_integer(value), do: value
+  def decode_basebred(_), do: {:error, "Unexpected type when decoding Amphithyron.basebred"}
+
+  def encode_basebred(value) when is_integer(value), do: value
+  def encode_basebred(_), do: {:error, "Unexpected type when encoding Amphithyron.basebred"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding Amphithyron.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding Amphithyron.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding Amphithyron.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding Amphithyron.chirotherium"}
+
+  def decode_conductometric(value) when is_integer(value), do: value
+  def decode_conductometric(_), do: {:error, "Unexpected type when decoding Amphithyron.conductometric"}
+
+  def encode_conductometric(value) when is_integer(value), do: value
+  def encode_conductometric(_), do: {:error, "Unexpected type when encoding Amphithyron.conductometric"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding Amphithyron.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding Amphithyron.disdiapason"}
 
+  def decode_ensilation(value) when is_integer(value), do: value
+  def decode_ensilation(_), do: {:error, "Unexpected type when decoding Amphithyron.ensilation"}
+
+  def encode_ensilation(value) when is_integer(value), do: value
+  def encode_ensilation(_), do: {:error, "Unexpected type when encoding Amphithyron.ensilation"}
+
+  def decode_eyebolt(value) when is_integer(value), do: value
+  def decode_eyebolt(_), do: {:error, "Unexpected type when decoding Amphithyron.eyebolt"}
+
+  def encode_eyebolt(value) when is_integer(value), do: value
+  def encode_eyebolt(_), do: {:error, "Unexpected type when encoding Amphithyron.eyebolt"}
+
+  def decode_fistulated(value) when is_integer(value), do: value
+  def decode_fistulated(_), do: {:error, "Unexpected type when decoding Amphithyron.fistulated"}
+
+  def encode_fistulated(value) when is_integer(value), do: value
+  def encode_fistulated(_), do: {:error, "Unexpected type when encoding Amphithyron.fistulated"}
+
+  def decode_heteropod(value) when is_integer(value), do: value
+  def decode_heteropod(_), do: {:error, "Unexpected type when decoding Amphithyron.heteropod"}
+
+  def encode_heteropod(value) when is_integer(value), do: value
+  def encode_heteropod(_), do: {:error, "Unexpected type when encoding Amphithyron.heteropod"}
+
+  def decode_juniperus(value) when is_integer(value), do: value
+  def decode_juniperus(_), do: {:error, "Unexpected type when decoding Amphithyron.juniperus"}
+
+  def encode_juniperus(value) when is_integer(value), do: value
+  def encode_juniperus(_), do: {:error, "Unexpected type when encoding Amphithyron.juniperus"}
+
+  def decode_labyrinthically(value) when is_integer(value), do: value
+  def decode_labyrinthically(_), do: {:error, "Unexpected type when decoding Amphithyron.labyrinthically"}
+
+  def encode_labyrinthically(value) when is_integer(value), do: value
+  def encode_labyrinthically(_), do: {:error, "Unexpected type when encoding Amphithyron.labyrinthically"}
+
+  def decode_martyrization(value) when is_integer(value), do: value
+  def decode_martyrization(_), do: {:error, "Unexpected type when decoding Amphithyron.martyrization"}
+
+  def encode_martyrization(value) when is_integer(value), do: value
+  def encode_martyrization(_), do: {:error, "Unexpected type when encoding Amphithyron.martyrization"}
+
+  def decode_mispolicy(value) when is_integer(value), do: value
+  def decode_mispolicy(_), do: {:error, "Unexpected type when decoding Amphithyron.mispolicy"}
+
+  def encode_mispolicy(value) when is_integer(value), do: value
+  def encode_mispolicy(_), do: {:error, "Unexpected type when encoding Amphithyron.mispolicy"}
+
+  def decode_multipara(value) when is_integer(value), do: value
+  def decode_multipara(_), do: {:error, "Unexpected type when decoding Amphithyron.multipara"}
+
+  def encode_multipara(value) when is_integer(value), do: value
+  def encode_multipara(_), do: {:error, "Unexpected type when encoding Amphithyron.multipara"}
+
+  def decode_nazirite(value) when is_integer(value), do: value
+  def decode_nazirite(_), do: {:error, "Unexpected type when decoding Amphithyron.nazirite"}
+
+  def encode_nazirite(value) when is_integer(value), do: value
+  def encode_nazirite(_), do: {:error, "Unexpected type when encoding Amphithyron.nazirite"}
+
+  def decode_possessorial(value) when is_integer(value), do: value
+  def decode_possessorial(_), do: {:error, "Unexpected type when decoding Amphithyron.possessorial"}
+
+  def encode_possessorial(value) when is_integer(value), do: value
+  def encode_possessorial(_), do: {:error, "Unexpected type when encoding Amphithyron.possessorial"}
+
+  def decode_shamed(value) when is_integer(value), do: value
+  def decode_shamed(_), do: {:error, "Unexpected type when decoding Amphithyron.shamed"}
+
+  def encode_shamed(value) when is_integer(value), do: value
+  def encode_shamed(_), do: {:error, "Unexpected type when encoding Amphithyron.shamed"}
+
+  def decode_shelfworn(value) when is_integer(value), do: value
+  def decode_shelfworn(_), do: {:error, "Unexpected type when decoding Amphithyron.shelfworn"}
+
+  def encode_shelfworn(value) when is_integer(value), do: value
+  def encode_shelfworn(_), do: {:error, "Unexpected type when encoding Amphithyron.shelfworn"}
+
+  def decode_stagnum(value) when is_integer(value), do: value
+  def decode_stagnum(_), do: {:error, "Unexpected type when decoding Amphithyron.stagnum"}
+
+  def encode_stagnum(value) when is_integer(value), do: value
+  def encode_stagnum(_), do: {:error, "Unexpected type when encoding Amphithyron.stagnum"}
+
+  def decode_those(value) when is_integer(value), do: value
+  def decode_those(_), do: {:error, "Unexpected type when decoding Amphithyron.those"}
+
+  def encode_those(value) when is_integer(value), do: value
+  def encode_those(_), do: {:error, "Unexpected type when encoding Amphithyron.those"}
+
+  def decode_undecimal(value) when is_integer(value), do: value
+  def decode_undecimal(_), do: {:error, "Unexpected type when decoding Amphithyron.undecimal"}
+
+  def encode_undecimal(value) when is_integer(value), do: value
+  def encode_undecimal(_), do: {:error, "Unexpected type when encoding Amphithyron.undecimal"}
+
   def from_map(m) do
     %Amphithyron{
-      akroasis: m["akroasis"],
-      antiphonical: m["antiphonical"],
-      basebred: m["basebred"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      conductometric: m["conductometric"],
+      akroasis: m["akroasis"] && decode_akroasis(m["akroasis"]),
+      antiphonical: m["antiphonical"] && decode_antiphonical(m["antiphonical"]),
+      basebred: m["basebred"] && decode_basebred(m["basebred"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      conductometric: m["conductometric"] && decode_conductometric(m["conductometric"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      ensilation: m["ensilation"],
-      eyebolt: m["eyebolt"],
-      fistulated: m["fistulated"],
-      heteropod: m["heteropod"],
+      ensilation: m["ensilation"] && decode_ensilation(m["ensilation"]),
+      eyebolt: m["eyebolt"] && decode_eyebolt(m["eyebolt"]),
+      fistulated: m["fistulated"] && decode_fistulated(m["fistulated"]),
+      heteropod: m["heteropod"] && decode_heteropod(m["heteropod"]),
       homocerc: m["homocerc"],
-      juniperus: m["Juniperus"],
-      labyrinthically: m["labyrinthically"],
-      martyrization: m["martyrization"],
-      mispolicy: m["mispolicy"],
-      multipara: m["multipara"],
-      nazirite: m["Nazirite"],
+      juniperus: m["Juniperus"] && decode_juniperus(m["Juniperus"]),
+      labyrinthically: m["labyrinthically"] && decode_labyrinthically(m["labyrinthically"]),
+      martyrization: m["martyrization"] && decode_martyrization(m["martyrization"]),
+      mispolicy: m["mispolicy"] && decode_mispolicy(m["mispolicy"]),
+      multipara: m["multipara"] && decode_multipara(m["multipara"]),
+      nazirite: m["Nazirite"] && decode_nazirite(m["Nazirite"]),
       nonbookish: m["nonbookish"],
-      possessorial: m["possessorial"],
-      shamed: m["shamed"],
-      shelfworn: m["shelfworn"],
-      stagnum: m["stagnum"],
-      those: m["Those"],
-      undecimal: m["undecimal"],
+      possessorial: m["possessorial"] && decode_possessorial(m["possessorial"]),
+      shamed: m["shamed"] && decode_shamed(m["shamed"]),
+      shelfworn: m["shelfworn"] && decode_shelfworn(m["shelfworn"]),
+      stagnum: m["stagnum"] && decode_stagnum(m["stagnum"]),
+      those: m["Those"] && decode_those(m["Those"]),
+      undecimal: m["undecimal"] && decode_undecimal(m["undecimal"]),
     }
   end
 
@@ -1063,39 +1197,173 @@ defmodule DiscordiaClass do
           wingle: integer() | nil
         }
 
+  def decode_altaic(value) when is_integer(value), do: value
+  def decode_altaic(_), do: {:error, "Unexpected type when decoding DiscordiaClass.altaic"}
+
+  def encode_altaic(value) when is_integer(value), do: value
+  def encode_altaic(_), do: {:error, "Unexpected type when encoding DiscordiaClass.altaic"}
+
+  def decode_amoristic(value) when is_integer(value), do: value
+  def decode_amoristic(_), do: {:error, "Unexpected type when decoding DiscordiaClass.amoristic"}
+
+  def encode_amoristic(value) when is_integer(value), do: value
+  def encode_amoristic(_), do: {:error, "Unexpected type when encoding DiscordiaClass.amoristic"}
+
+  def decode_blennophthalmia(value) when is_integer(value), do: value
+  def decode_blennophthalmia(_), do: {:error, "Unexpected type when decoding DiscordiaClass.blennophthalmia"}
+
+  def encode_blennophthalmia(value) when is_integer(value), do: value
+  def encode_blennophthalmia(_), do: {:error, "Unexpected type when encoding DiscordiaClass.blennophthalmia"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding DiscordiaClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding DiscordiaClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding DiscordiaClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding DiscordiaClass.chirotherium"}
+
+  def decode_disciplinability(value) when is_integer(value), do: value
+  def decode_disciplinability(_), do: {:error, "Unexpected type when decoding DiscordiaClass.disciplinability"}
+
+  def encode_disciplinability(value) when is_integer(value), do: value
+  def encode_disciplinability(_), do: {:error, "Unexpected type when encoding DiscordiaClass.disciplinability"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding DiscordiaClass.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding DiscordiaClass.disdiapason"}
 
+  def decode_goofer(value) when is_integer(value), do: value
+  def decode_goofer(_), do: {:error, "Unexpected type when decoding DiscordiaClass.goofer"}
+
+  def encode_goofer(value) when is_integer(value), do: value
+  def encode_goofer(_), do: {:error, "Unexpected type when encoding DiscordiaClass.goofer"}
+
+  def decode_laryngograph(value) when is_integer(value), do: value
+  def decode_laryngograph(_), do: {:error, "Unexpected type when decoding DiscordiaClass.laryngograph"}
+
+  def encode_laryngograph(value) when is_integer(value), do: value
+  def encode_laryngograph(_), do: {:error, "Unexpected type when encoding DiscordiaClass.laryngograph"}
+
+  def decode_leucitis(value) when is_integer(value), do: value
+  def decode_leucitis(_), do: {:error, "Unexpected type when decoding DiscordiaClass.leucitis"}
+
+  def encode_leucitis(value) when is_integer(value), do: value
+  def encode_leucitis(_), do: {:error, "Unexpected type when encoding DiscordiaClass.leucitis"}
+
+  def decode_lymphocyst(value) when is_integer(value), do: value
+  def decode_lymphocyst(_), do: {:error, "Unexpected type when decoding DiscordiaClass.lymphocyst"}
+
+  def encode_lymphocyst(value) when is_integer(value), do: value
+  def encode_lymphocyst(_), do: {:error, "Unexpected type when encoding DiscordiaClass.lymphocyst"}
+
+  def decode_microcosmology(value) when is_integer(value), do: value
+  def decode_microcosmology(_), do: {:error, "Unexpected type when decoding DiscordiaClass.microcosmology"}
+
+  def encode_microcosmology(value) when is_integer(value), do: value
+  def encode_microcosmology(_), do: {:error, "Unexpected type when encoding DiscordiaClass.microcosmology"}
+
+  def decode_nauseation(value) when is_integer(value), do: value
+  def decode_nauseation(_), do: {:error, "Unexpected type when decoding DiscordiaClass.nauseation"}
+
+  def encode_nauseation(value) when is_integer(value), do: value
+  def encode_nauseation(_), do: {:error, "Unexpected type when encoding DiscordiaClass.nauseation"}
+
+  def decode_patarin(value) when is_integer(value), do: value
+  def decode_patarin(_), do: {:error, "Unexpected type when decoding DiscordiaClass.patarin"}
+
+  def encode_patarin(value) when is_integer(value), do: value
+  def encode_patarin(_), do: {:error, "Unexpected type when encoding DiscordiaClass.patarin"}
+
+  def decode_preliberal(value) when is_integer(value), do: value
+  def decode_preliberal(_), do: {:error, "Unexpected type when decoding DiscordiaClass.preliberal"}
+
+  def encode_preliberal(value) when is_integer(value), do: value
+  def encode_preliberal(_), do: {:error, "Unexpected type when encoding DiscordiaClass.preliberal"}
+
+  def decode_prettifier(value) when is_integer(value), do: value
+  def decode_prettifier(_), do: {:error, "Unexpected type when decoding DiscordiaClass.prettifier"}
+
+  def encode_prettifier(value) when is_integer(value), do: value
+  def encode_prettifier(_), do: {:error, "Unexpected type when encoding DiscordiaClass.prettifier"}
+
+  def decode_rangework(value) when is_integer(value), do: value
+  def decode_rangework(_), do: {:error, "Unexpected type when decoding DiscordiaClass.rangework"}
+
+  def encode_rangework(value) when is_integer(value), do: value
+  def encode_rangework(_), do: {:error, "Unexpected type when encoding DiscordiaClass.rangework"}
+
+  def decode_redient(value) when is_integer(value), do: value
+  def decode_redient(_), do: {:error, "Unexpected type when decoding DiscordiaClass.redient"}
+
+  def encode_redient(value) when is_integer(value), do: value
+  def encode_redient(_), do: {:error, "Unexpected type when encoding DiscordiaClass.redient"}
+
+  def decode_subfusiform(value) when is_integer(value), do: value
+  def decode_subfusiform(_), do: {:error, "Unexpected type when decoding DiscordiaClass.subfusiform"}
+
+  def encode_subfusiform(value) when is_integer(value), do: value
+  def encode_subfusiform(_), do: {:error, "Unexpected type when encoding DiscordiaClass.subfusiform"}
+
+  def decode_suicidical(value) when is_integer(value), do: value
+  def decode_suicidical(_), do: {:error, "Unexpected type when decoding DiscordiaClass.suicidical"}
+
+  def encode_suicidical(value) when is_integer(value), do: value
+  def encode_suicidical(_), do: {:error, "Unexpected type when encoding DiscordiaClass.suicidical"}
+
+  def decode_swow(value) when is_integer(value), do: value
+  def decode_swow(_), do: {:error, "Unexpected type when decoding DiscordiaClass.swow"}
+
+  def encode_swow(value) when is_integer(value), do: value
+  def encode_swow(_), do: {:error, "Unexpected type when encoding DiscordiaClass.swow"}
+
+  def decode_wastrel(value) when is_integer(value), do: value
+  def decode_wastrel(_), do: {:error, "Unexpected type when decoding DiscordiaClass.wastrel"}
+
+  def encode_wastrel(value) when is_integer(value), do: value
+  def encode_wastrel(_), do: {:error, "Unexpected type when encoding DiscordiaClass.wastrel"}
+
+  def decode_wingle(value) when is_integer(value), do: value
+  def decode_wingle(_), do: {:error, "Unexpected type when decoding DiscordiaClass.wingle"}
+
+  def encode_wingle(value) when is_integer(value), do: value
+  def encode_wingle(_), do: {:error, "Unexpected type when encoding DiscordiaClass.wingle"}
+
   def from_map(m) do
     %DiscordiaClass{
-      altaic: m["Altaic"],
-      amoristic: m["amoristic"],
-      blennophthalmia: m["blennophthalmia"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      disciplinability: m["disciplinability"],
+      altaic: m["Altaic"] && decode_altaic(m["Altaic"]),
+      amoristic: m["amoristic"] && decode_amoristic(m["amoristic"]),
+      blennophthalmia: m["blennophthalmia"] && decode_blennophthalmia(m["blennophthalmia"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      disciplinability: m["disciplinability"] && decode_disciplinability(m["disciplinability"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      goofer: m["goofer"],
+      goofer: m["goofer"] && decode_goofer(m["goofer"]),
       homocerc: m["homocerc"],
-      laryngograph: m["laryngograph"],
-      leucitis: m["leucitis"],
-      lymphocyst: m["lymphocyst"],
-      microcosmology: m["microcosmology"],
-      nauseation: m["nauseation"],
+      laryngograph: m["laryngograph"] && decode_laryngograph(m["laryngograph"]),
+      leucitis: m["leucitis"] && decode_leucitis(m["leucitis"]),
+      lymphocyst: m["lymphocyst"] && decode_lymphocyst(m["lymphocyst"]),
+      microcosmology: m["microcosmology"] && decode_microcosmology(m["microcosmology"]),
+      nauseation: m["nauseation"] && decode_nauseation(m["nauseation"]),
       nonbookish: m["nonbookish"],
-      patarin: m["Patarin"],
-      preliberal: m["preliberal"],
-      prettifier: m["prettifier"],
-      rangework: m["rangework"],
-      redient: m["redient"],
-      subfusiform: m["subfusiform"],
-      suicidical: m["suicidical"],
-      swow: m["swow"],
-      wastrel: m["wastrel"],
-      wingle: m["wingle"],
+      patarin: m["Patarin"] && decode_patarin(m["Patarin"]),
+      preliberal: m["preliberal"] && decode_preliberal(m["preliberal"]),
+      prettifier: m["prettifier"] && decode_prettifier(m["prettifier"]),
+      rangework: m["rangework"] && decode_rangework(m["rangework"]),
+      redient: m["redient"] && decode_redient(m["redient"]),
+      subfusiform: m["subfusiform"] && decode_subfusiform(m["subfusiform"]),
+      suicidical: m["suicidical"] && decode_suicidical(m["suicidical"]),
+      swow: m["swow"] && decode_swow(m["swow"]),
+      wastrel: m["wastrel"] && decode_wastrel(m["wastrel"]),
+      wingle: m["wingle"] && decode_wingle(m["wingle"]),
     }
   end
 
@@ -1383,39 +1651,173 @@ defmodule LaviniaClass do
           uproute: integer() | nil
         }
 
+  def decode_agitable(value) when is_integer(value), do: value
+  def decode_agitable(_), do: {:error, "Unexpected type when decoding LaviniaClass.agitable"}
+
+  def encode_agitable(value) when is_integer(value), do: value
+  def encode_agitable(_), do: {:error, "Unexpected type when encoding LaviniaClass.agitable"}
+
+  def decode_asininity(value) when is_integer(value), do: value
+  def decode_asininity(_), do: {:error, "Unexpected type when decoding LaviniaClass.asininity"}
+
+  def encode_asininity(value) when is_integer(value), do: value
+  def encode_asininity(_), do: {:error, "Unexpected type when encoding LaviniaClass.asininity"}
+
+  def decode_benefiter(value) when is_integer(value), do: value
+  def decode_benefiter(_), do: {:error, "Unexpected type when decoding LaviniaClass.benefiter"}
+
+  def encode_benefiter(value) when is_integer(value), do: value
+  def encode_benefiter(_), do: {:error, "Unexpected type when encoding LaviniaClass.benefiter"}
+
+  def decode_bronzelike(value) when is_integer(value), do: value
+  def decode_bronzelike(_), do: {:error, "Unexpected type when decoding LaviniaClass.bronzelike"}
+
+  def encode_bronzelike(value) when is_integer(value), do: value
+  def encode_bronzelike(_), do: {:error, "Unexpected type when encoding LaviniaClass.bronzelike"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding LaviniaClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding LaviniaClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding LaviniaClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding LaviniaClass.chirotherium"}
+
+  def decode_cholesteatomatous(value) when is_integer(value), do: value
+  def decode_cholesteatomatous(_), do: {:error, "Unexpected type when decoding LaviniaClass.cholesteatomatous"}
+
+  def encode_cholesteatomatous(value) when is_integer(value), do: value
+  def encode_cholesteatomatous(_), do: {:error, "Unexpected type when encoding LaviniaClass.cholesteatomatous"}
+
+  def decode_deprivement(value) when is_integer(value), do: value
+  def decode_deprivement(_), do: {:error, "Unexpected type when decoding LaviniaClass.deprivement"}
+
+  def encode_deprivement(value) when is_integer(value), do: value
+  def encode_deprivement(_), do: {:error, "Unexpected type when encoding LaviniaClass.deprivement"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding LaviniaClass.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding LaviniaClass.disdiapason"}
 
+  def decode_flippantness(value) when is_integer(value), do: value
+  def decode_flippantness(_), do: {:error, "Unexpected type when decoding LaviniaClass.flippantness"}
+
+  def encode_flippantness(value) when is_integer(value), do: value
+  def encode_flippantness(_), do: {:error, "Unexpected type when encoding LaviniaClass.flippantness"}
+
+  def decode_fogproof(value) when is_integer(value), do: value
+  def decode_fogproof(_), do: {:error, "Unexpected type when decoding LaviniaClass.fogproof"}
+
+  def encode_fogproof(value) when is_integer(value), do: value
+  def encode_fogproof(_), do: {:error, "Unexpected type when encoding LaviniaClass.fogproof"}
+
+  def decode_merrymeeting(value) when is_integer(value), do: value
+  def decode_merrymeeting(_), do: {:error, "Unexpected type when decoding LaviniaClass.merrymeeting"}
+
+  def encode_merrymeeting(value) when is_integer(value), do: value
+  def encode_merrymeeting(_), do: {:error, "Unexpected type when encoding LaviniaClass.merrymeeting"}
+
+  def decode_overcareful(value) when is_integer(value), do: value
+  def decode_overcareful(_), do: {:error, "Unexpected type when decoding LaviniaClass.overcareful"}
+
+  def encode_overcareful(value) when is_integer(value), do: value
+  def encode_overcareful(_), do: {:error, "Unexpected type when encoding LaviniaClass.overcareful"}
+
+  def decode_panaris(value) when is_integer(value), do: value
+  def decode_panaris(_), do: {:error, "Unexpected type when decoding LaviniaClass.panaris"}
+
+  def encode_panaris(value) when is_integer(value), do: value
+  def encode_panaris(_), do: {:error, "Unexpected type when encoding LaviniaClass.panaris"}
+
+  def decode_preacceptance(value) when is_integer(value), do: value
+  def decode_preacceptance(_), do: {:error, "Unexpected type when decoding LaviniaClass.preacceptance"}
+
+  def encode_preacceptance(value) when is_integer(value), do: value
+  def encode_preacceptance(_), do: {:error, "Unexpected type when encoding LaviniaClass.preacceptance"}
+
+  def decode_quinoxaline(value) when is_integer(value), do: value
+  def decode_quinoxaline(_), do: {:error, "Unexpected type when decoding LaviniaClass.quinoxaline"}
+
+  def encode_quinoxaline(value) when is_integer(value), do: value
+  def encode_quinoxaline(_), do: {:error, "Unexpected type when encoding LaviniaClass.quinoxaline"}
+
+  def decode_sig(value) when is_integer(value), do: value
+  def decode_sig(_), do: {:error, "Unexpected type when decoding LaviniaClass.sig"}
+
+  def encode_sig(value) when is_integer(value), do: value
+  def encode_sig(_), do: {:error, "Unexpected type when encoding LaviniaClass.sig"}
+
+  def decode_superconfusion(value) when is_integer(value), do: value
+  def decode_superconfusion(_), do: {:error, "Unexpected type when decoding LaviniaClass.superconfusion"}
+
+  def encode_superconfusion(value) when is_integer(value), do: value
+  def encode_superconfusion(_), do: {:error, "Unexpected type when encoding LaviniaClass.superconfusion"}
+
+  def decode_tacana(value) when is_integer(value), do: value
+  def decode_tacana(_), do: {:error, "Unexpected type when decoding LaviniaClass.tacana"}
+
+  def encode_tacana(value) when is_integer(value), do: value
+  def encode_tacana(_), do: {:error, "Unexpected type when encoding LaviniaClass.tacana"}
+
+  def decode_tillotter(value) when is_integer(value), do: value
+  def decode_tillotter(_), do: {:error, "Unexpected type when decoding LaviniaClass.tillotter"}
+
+  def encode_tillotter(value) when is_integer(value), do: value
+  def encode_tillotter(_), do: {:error, "Unexpected type when encoding LaviniaClass.tillotter"}
+
+  def decode_tranquillize(value) when is_integer(value), do: value
+  def decode_tranquillize(_), do: {:error, "Unexpected type when decoding LaviniaClass.tranquillize"}
+
+  def encode_tranquillize(value) when is_integer(value), do: value
+  def encode_tranquillize(_), do: {:error, "Unexpected type when encoding LaviniaClass.tranquillize"}
+
+  def decode_unquestionable(value) when is_integer(value), do: value
+  def decode_unquestionable(_), do: {:error, "Unexpected type when decoding LaviniaClass.unquestionable"}
+
+  def encode_unquestionable(value) when is_integer(value), do: value
+  def encode_unquestionable(_), do: {:error, "Unexpected type when encoding LaviniaClass.unquestionable"}
+
+  def decode_uproute(value) when is_integer(value), do: value
+  def decode_uproute(_), do: {:error, "Unexpected type when decoding LaviniaClass.uproute"}
+
+  def encode_uproute(value) when is_integer(value), do: value
+  def encode_uproute(_), do: {:error, "Unexpected type when encoding LaviniaClass.uproute"}
+
   def from_map(m) do
     %LaviniaClass{
-      agitable: m["agitable"],
-      asininity: m["asininity"],
-      benefiter: m["benefiter"],
-      bronzelike: m["bronzelike"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      cholesteatomatous: m["cholesteatomatous"],
-      deprivement: m["deprivement"],
+      agitable: m["agitable"] && decode_agitable(m["agitable"]),
+      asininity: m["asininity"] && decode_asininity(m["asininity"]),
+      benefiter: m["benefiter"] && decode_benefiter(m["benefiter"]),
+      bronzelike: m["bronzelike"] && decode_bronzelike(m["bronzelike"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      cholesteatomatous: m["cholesteatomatous"] && decode_cholesteatomatous(m["cholesteatomatous"]),
+      deprivement: m["deprivement"] && decode_deprivement(m["deprivement"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      flippantness: m["flippantness"],
-      fogproof: m["fogproof"],
+      flippantness: m["flippantness"] && decode_flippantness(m["flippantness"]),
+      fogproof: m["fogproof"] && decode_fogproof(m["fogproof"]),
       homocerc: m["homocerc"],
-      merrymeeting: m["merrymeeting"],
+      merrymeeting: m["merrymeeting"] && decode_merrymeeting(m["merrymeeting"]),
       nonbookish: m["nonbookish"],
-      overcareful: m["overcareful"],
-      panaris: m["panaris"],
-      preacceptance: m["preacceptance"],
-      quinoxaline: m["quinoxaline"],
-      sig: m["sig"],
-      superconfusion: m["superconfusion"],
-      tacana: m["Tacana"],
-      tillotter: m["tillotter"],
-      tranquillize: m["tranquillize"],
-      unquestionable: m["unquestionable"],
-      uproute: m["uproute"],
+      overcareful: m["overcareful"] && decode_overcareful(m["overcareful"]),
+      panaris: m["panaris"] && decode_panaris(m["panaris"]),
+      preacceptance: m["preacceptance"] && decode_preacceptance(m["preacceptance"]),
+      quinoxaline: m["quinoxaline"] && decode_quinoxaline(m["quinoxaline"]),
+      sig: m["sig"] && decode_sig(m["sig"]),
+      superconfusion: m["superconfusion"] && decode_superconfusion(m["superconfusion"]),
+      tacana: m["Tacana"] && decode_tacana(m["Tacana"]),
+      tillotter: m["tillotter"] && decode_tillotter(m["tillotter"]),
+      tranquillize: m["tranquillize"] && decode_tranquillize(m["tranquillize"]),
+      unquestionable: m["unquestionable"] && decode_unquestionable(m["unquestionable"]),
+      uproute: m["uproute"] && decode_uproute(m["uproute"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex
index 7b155b6..8d0efa8 100644
--- a/base/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex
@@ -666,39 +666,173 @@ defmodule LupusClass do
           vendible: integer() | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding LupusClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding LupusClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding LupusClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding LupusClass.chirotherium"}
+
+  def decode_chlorioninae(value) when is_integer(value), do: value
+  def decode_chlorioninae(_), do: {:error, "Unexpected type when decoding LupusClass.chlorioninae"}
+
+  def encode_chlorioninae(value) when is_integer(value), do: value
+  def encode_chlorioninae(_), do: {:error, "Unexpected type when encoding LupusClass.chlorioninae"}
+
+  def decode_corvinae(value) when is_integer(value), do: value
+  def decode_corvinae(_), do: {:error, "Unexpected type when decoding LupusClass.corvinae"}
+
+  def encode_corvinae(value) when is_integer(value), do: value
+  def encode_corvinae(_), do: {:error, "Unexpected type when encoding LupusClass.corvinae"}
+
+  def decode_crassina(value) when is_integer(value), do: value
+  def decode_crassina(_), do: {:error, "Unexpected type when decoding LupusClass.crassina"}
+
+  def encode_crassina(value) when is_integer(value), do: value
+  def encode_crassina(_), do: {:error, "Unexpected type when encoding LupusClass.crassina"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding LupusClass.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding LupusClass.disdiapason"}
 
+  def decode_exiguity(value) when is_integer(value), do: value
+  def decode_exiguity(_), do: {:error, "Unexpected type when decoding LupusClass.exiguity"}
+
+  def encode_exiguity(value) when is_integer(value), do: value
+  def encode_exiguity(_), do: {:error, "Unexpected type when encoding LupusClass.exiguity"}
+
+  def decode_farcist(value) when is_integer(value), do: value
+  def decode_farcist(_), do: {:error, "Unexpected type when decoding LupusClass.farcist"}
+
+  def encode_farcist(value) when is_integer(value), do: value
+  def encode_farcist(_), do: {:error, "Unexpected type when encoding LupusClass.farcist"}
+
+  def decode_holographical(value) when is_integer(value), do: value
+  def decode_holographical(_), do: {:error, "Unexpected type when decoding LupusClass.holographical"}
+
+  def encode_holographical(value) when is_integer(value), do: value
+  def encode_holographical(_), do: {:error, "Unexpected type when encoding LupusClass.holographical"}
+
+  def decode_ichthyophagan(value) when is_integer(value), do: value
+  def decode_ichthyophagan(_), do: {:error, "Unexpected type when decoding LupusClass.ichthyophagan"}
+
+  def encode_ichthyophagan(value) when is_integer(value), do: value
+  def encode_ichthyophagan(_), do: {:error, "Unexpected type when encoding LupusClass.ichthyophagan"}
+
+  def decode_implacable(value) when is_integer(value), do: value
+  def decode_implacable(_), do: {:error, "Unexpected type when decoding LupusClass.implacable"}
+
+  def encode_implacable(value) when is_integer(value), do: value
+  def encode_implacable(_), do: {:error, "Unexpected type when encoding LupusClass.implacable"}
+
+  def decode_outshiner(value) when is_integer(value), do: value
+  def decode_outshiner(_), do: {:error, "Unexpected type when decoding LupusClass.outshiner"}
+
+  def encode_outshiner(value) when is_integer(value), do: value
+  def encode_outshiner(_), do: {:error, "Unexpected type when encoding LupusClass.outshiner"}
+
+  def decode_overweather(value) when is_integer(value), do: value
+  def decode_overweather(_), do: {:error, "Unexpected type when decoding LupusClass.overweather"}
+
+  def encode_overweather(value) when is_integer(value), do: value
+  def encode_overweather(_), do: {:error, "Unexpected type when encoding LupusClass.overweather"}
+
+  def decode_protonegroid(value) when is_integer(value), do: value
+  def decode_protonegroid(_), do: {:error, "Unexpected type when decoding LupusClass.protonegroid"}
+
+  def encode_protonegroid(value) when is_integer(value), do: value
+  def encode_protonegroid(_), do: {:error, "Unexpected type when encoding LupusClass.protonegroid"}
+
+  def decode_shallowish(value) when is_integer(value), do: value
+  def decode_shallowish(_), do: {:error, "Unexpected type when decoding LupusClass.shallowish"}
+
+  def encode_shallowish(value) when is_integer(value), do: value
+  def encode_shallowish(_), do: {:error, "Unexpected type when encoding LupusClass.shallowish"}
+
+  def decode_snoke(value) when is_integer(value), do: value
+  def decode_snoke(_), do: {:error, "Unexpected type when decoding LupusClass.snoke"}
+
+  def encode_snoke(value) when is_integer(value), do: value
+  def encode_snoke(_), do: {:error, "Unexpected type when encoding LupusClass.snoke"}
+
+  def decode_snout(value) when is_integer(value), do: value
+  def decode_snout(_), do: {:error, "Unexpected type when decoding LupusClass.snout"}
+
+  def encode_snout(value) when is_integer(value), do: value
+  def encode_snout(_), do: {:error, "Unexpected type when encoding LupusClass.snout"}
+
+  def decode_surveillance(value) when is_integer(value), do: value
+  def decode_surveillance(_), do: {:error, "Unexpected type when decoding LupusClass.surveillance"}
+
+  def encode_surveillance(value) when is_integer(value), do: value
+  def encode_surveillance(_), do: {:error, "Unexpected type when encoding LupusClass.surveillance"}
+
+  def decode_threshingtime(value) when is_integer(value), do: value
+  def decode_threshingtime(_), do: {:error, "Unexpected type when decoding LupusClass.threshingtime"}
+
+  def encode_threshingtime(value) when is_integer(value), do: value
+  def encode_threshingtime(_), do: {:error, "Unexpected type when encoding LupusClass.threshingtime"}
+
+  def decode_thysanocarpus(value) when is_integer(value), do: value
+  def decode_thysanocarpus(_), do: {:error, "Unexpected type when decoding LupusClass.thysanocarpus"}
+
+  def encode_thysanocarpus(value) when is_integer(value), do: value
+  def encode_thysanocarpus(_), do: {:error, "Unexpected type when encoding LupusClass.thysanocarpus"}
+
+  def decode_unsignificantly(value) when is_integer(value), do: value
+  def decode_unsignificantly(_), do: {:error, "Unexpected type when decoding LupusClass.unsignificantly"}
+
+  def encode_unsignificantly(value) when is_integer(value), do: value
+  def encode_unsignificantly(_), do: {:error, "Unexpected type when encoding LupusClass.unsignificantly"}
+
+  def decode_unsnap(value) when is_integer(value), do: value
+  def decode_unsnap(_), do: {:error, "Unexpected type when decoding LupusClass.unsnap"}
+
+  def encode_unsnap(value) when is_integer(value), do: value
+  def encode_unsnap(_), do: {:error, "Unexpected type when encoding LupusClass.unsnap"}
+
+  def decode_vendible(value) when is_integer(value), do: value
+  def decode_vendible(_), do: {:error, "Unexpected type when decoding LupusClass.vendible"}
+
+  def encode_vendible(value) when is_integer(value), do: value
+  def encode_vendible(_), do: {:error, "Unexpected type when encoding LupusClass.vendible"}
+
   def from_map(m) do
     %LupusClass{
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      chlorioninae: m["Chlorioninae"],
-      corvinae: m["Corvinae"],
-      crassina: m["Crassina"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      chlorioninae: m["Chlorioninae"] && decode_chlorioninae(m["Chlorioninae"]),
+      corvinae: m["Corvinae"] && decode_corvinae(m["Corvinae"]),
+      crassina: m["Crassina"] && decode_crassina(m["Crassina"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      exiguity: m["exiguity"],
-      farcist: m["farcist"],
-      holographical: m["holographical"],
+      exiguity: m["exiguity"] && decode_exiguity(m["exiguity"]),
+      farcist: m["farcist"] && decode_farcist(m["farcist"]),
+      holographical: m["holographical"] && decode_holographical(m["holographical"]),
       homocerc: m["homocerc"],
-      ichthyophagan: m["ichthyophagan"],
-      implacable: m["implacable"],
+      ichthyophagan: m["ichthyophagan"] && decode_ichthyophagan(m["ichthyophagan"]),
+      implacable: m["implacable"] && decode_implacable(m["implacable"]),
       nonbookish: m["nonbookish"],
-      outshiner: m["outshiner"],
-      overweather: m["overweather"],
-      protonegroid: m["protonegroid"],
-      shallowish: m["shallowish"],
-      snoke: m["snoke"],
-      snout: m["snout"],
-      surveillance: m["surveillance"],
-      threshingtime: m["threshingtime"],
-      thysanocarpus: m["Thysanocarpus"],
-      unsignificantly: m["unsignificantly"],
-      unsnap: m["unsnap"],
-      vendible: m["vendible"],
+      outshiner: m["outshiner"] && decode_outshiner(m["outshiner"]),
+      overweather: m["overweather"] && decode_overweather(m["overweather"]),
+      protonegroid: m["protonegroid"] && decode_protonegroid(m["protonegroid"]),
+      shallowish: m["shallowish"] && decode_shallowish(m["shallowish"]),
+      snoke: m["snoke"] && decode_snoke(m["snoke"]),
+      snout: m["snout"] && decode_snout(m["snout"]),
+      surveillance: m["surveillance"] && decode_surveillance(m["surveillance"]),
+      threshingtime: m["threshingtime"] && decode_threshingtime(m["threshingtime"]),
+      thysanocarpus: m["Thysanocarpus"] && decode_thysanocarpus(m["Thysanocarpus"]),
+      unsignificantly: m["unsignificantly"] && decode_unsignificantly(m["unsignificantly"]),
+      unsnap: m["unsnap"] && decode_unsnap(m["unsnap"]),
+      vendible: m["vendible"] && decode_vendible(m["vendible"]),
     }
   end
 
@@ -796,57 +930,191 @@ defmodule Maslin do
           unjudiciously: nil | nil
         }
 
+  def decode_alicant(value) when is_integer(value), do: value
+  def decode_alicant(_), do: {:error, "Unexpected type when decoding Maslin.alicant"}
+
+  def encode_alicant(value) when is_integer(value), do: value
+  def encode_alicant(_), do: {:error, "Unexpected type when encoding Maslin.alicant"}
+
+  def decode_anticorrosive(value) when is_integer(value), do: value
+  def decode_anticorrosive(_), do: {:error, "Unexpected type when decoding Maslin.anticorrosive"}
+
+  def encode_anticorrosive(value) when is_integer(value), do: value
+  def encode_anticorrosive(_), do: {:error, "Unexpected type when encoding Maslin.anticorrosive"}
+
+  def decode_be(value) when is_integer(value), do: value
+  def decode_be(_), do: {:error, "Unexpected type when decoding Maslin.be"}
+
+  def encode_be(value) when is_integer(value), do: value
+  def encode_be(_), do: {:error, "Unexpected type when encoding Maslin.be"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding Maslin.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding Maslin.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding Maslin.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding Maslin.chirotherium"}
+
+  def decode_chub(value) when is_integer(value), do: value
+  def decode_chub(_), do: {:error, "Unexpected type when decoding Maslin.chub"}
+
+  def encode_chub(value) when is_integer(value), do: value
+  def encode_chub(_), do: {:error, "Unexpected type when encoding Maslin.chub"}
+
+  def decode_cuprosilicon(value) when is_integer(value), do: value
+  def decode_cuprosilicon(_), do: {:error, "Unexpected type when decoding Maslin.cuprosilicon"}
+
+  def encode_cuprosilicon(value) when is_integer(value), do: value
+  def encode_cuprosilicon(_), do: {:error, "Unexpected type when encoding Maslin.cuprosilicon"}
+
+  def decode_curtailedly(value) when is_integer(value), do: value
+  def decode_curtailedly(_), do: {:error, "Unexpected type when decoding Maslin.curtailedly"}
+
+  def encode_curtailedly(value) when is_integer(value), do: value
+  def encode_curtailedly(_), do: {:error, "Unexpected type when encoding Maslin.curtailedly"}
+
+  def decode_dellenite(value) when is_integer(value), do: value
+  def decode_dellenite(_), do: {:error, "Unexpected type when decoding Maslin.dellenite"}
+
+  def encode_dellenite(value) when is_integer(value), do: value
+  def encode_dellenite(_), do: {:error, "Unexpected type when encoding Maslin.dellenite"}
+
+  def decode_dimitry(value) when is_integer(value), do: value
+  def decode_dimitry(_), do: {:error, "Unexpected type when decoding Maslin.dimitry"}
+
+  def encode_dimitry(value) when is_integer(value), do: value
+  def encode_dimitry(_), do: {:error, "Unexpected type when encoding Maslin.dimitry"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding Maslin.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding Maslin.disdiapason"}
 
+  def decode_ethmoiditis(value) when is_integer(value), do: value
+  def decode_ethmoiditis(_), do: {:error, "Unexpected type when decoding Maslin.ethmoiditis"}
+
+  def encode_ethmoiditis(value) when is_integer(value), do: value
+  def encode_ethmoiditis(_), do: {:error, "Unexpected type when encoding Maslin.ethmoiditis"}
+
+  def decode_goatherd(value) when is_integer(value), do: value
+  def decode_goatherd(_), do: {:error, "Unexpected type when decoding Maslin.goatherd"}
+
+  def encode_goatherd(value) when is_integer(value), do: value
+  def encode_goatherd(_), do: {:error, "Unexpected type when encoding Maslin.goatherd"}
+
+  def decode_hammerdress(value) when is_integer(value), do: value
+  def decode_hammerdress(_), do: {:error, "Unexpected type when decoding Maslin.hammerdress"}
+
+  def encode_hammerdress(value) when is_integer(value), do: value
+  def encode_hammerdress(_), do: {:error, "Unexpected type when encoding Maslin.hammerdress"}
+
+  def decode_lacunosity(value) when is_integer(value), do: value
+  def decode_lacunosity(_), do: {:error, "Unexpected type when decoding Maslin.lacunosity"}
+
+  def encode_lacunosity(value) when is_integer(value), do: value
+  def encode_lacunosity(_), do: {:error, "Unexpected type when encoding Maslin.lacunosity"}
+
+  def decode_mameliere(value) when is_integer(value), do: value
+  def decode_mameliere(_), do: {:error, "Unexpected type when decoding Maslin.mameliere"}
+
+  def encode_mameliere(value) when is_integer(value), do: value
+  def encode_mameliere(_), do: {:error, "Unexpected type when encoding Maslin.mameliere"}
+
+  def decode_oafishly(value) when is_integer(value), do: value
+  def decode_oafishly(_), do: {:error, "Unexpected type when decoding Maslin.oafishly"}
+
+  def encode_oafishly(value) when is_integer(value), do: value
+  def encode_oafishly(_), do: {:error, "Unexpected type when encoding Maslin.oafishly"}
+
+  def decode_saccharulmic(value) when is_integer(value), do: value
+  def decode_saccharulmic(_), do: {:error, "Unexpected type when decoding Maslin.saccharulmic"}
+
+  def encode_saccharulmic(value) when is_integer(value), do: value
+  def encode_saccharulmic(_), do: {:error, "Unexpected type when encoding Maslin.saccharulmic"}
+
+  def decode_scowlful(value) when is_integer(value), do: value
+  def decode_scowlful(_), do: {:error, "Unexpected type when decoding Maslin.scowlful"}
+
+  def encode_scowlful(value) when is_integer(value), do: value
+  def encode_scowlful(_), do: {:error, "Unexpected type when encoding Maslin.scowlful"}
+
+  def decode_sphaeridial(value) when is_integer(value), do: value
+  def decode_sphaeridial(_), do: {:error, "Unexpected type when decoding Maslin.sphaeridial"}
+
+  def encode_sphaeridial(value) when is_integer(value), do: value
+  def encode_sphaeridial(_), do: {:error, "Unexpected type when encoding Maslin.sphaeridial"}
+
+  def decode_subsecive(value) when is_integer(value), do: value
+  def decode_subsecive(_), do: {:error, "Unexpected type when decoding Maslin.subsecive"}
+
+  def encode_subsecive(value) when is_integer(value), do: value
+  def encode_subsecive(_), do: {:error, "Unexpected type when encoding Maslin.subsecive"}
+
+  def decode_trachyglossate(value) when is_integer(value), do: value
+  def decode_trachyglossate(_), do: {:error, "Unexpected type when decoding Maslin.trachyglossate"}
+
+  def encode_trachyglossate(value) when is_integer(value), do: value
+  def encode_trachyglossate(_), do: {:error, "Unexpected type when encoding Maslin.trachyglossate"}
+
+  def decode_unassuaged(value) when is_integer(value), do: value
+  def decode_unassuaged(_), do: {:error, "Unexpected type when decoding Maslin.unassuaged"}
+
+  def encode_unassuaged(value) when is_integer(value), do: value
+  def encode_unassuaged(_), do: {:error, "Unexpected type when encoding Maslin.unassuaged"}
+
   def from_map(m) do
     %Maslin{
-      alicant: m["Alicant"],
+      alicant: m["Alicant"] && decode_alicant(m["Alicant"]),
       antiatonement: m["antiatonement"],
-      anticorrosive: m["anticorrosive"],
+      anticorrosive: m["anticorrosive"] && decode_anticorrosive(m["anticorrosive"]),
       aphidozer: m["aphidozer"],
       bakuninist: m["Bakuninist"],
-      be: m["be"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      chub: m["chub"],
-      cuprosilicon: m["cuprosilicon"],
-      curtailedly: m["curtailedly"],
-      dellenite: m["dellenite"],
-      dimitry: m["Dimitry"],
+      be: m["be"] && decode_be(m["be"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      chub: m["chub"] && decode_chub(m["chub"]),
+      cuprosilicon: m["cuprosilicon"] && decode_cuprosilicon(m["cuprosilicon"]),
+      curtailedly: m["curtailedly"] && decode_curtailedly(m["curtailedly"]),
+      dellenite: m["dellenite"] && decode_dellenite(m["dellenite"]),
+      dimitry: m["Dimitry"] && decode_dimitry(m["Dimitry"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       edifying: m["edifying"],
-      ethmoiditis: m["ethmoiditis"],
+      ethmoiditis: m["ethmoiditis"] && decode_ethmoiditis(m["ethmoiditis"]),
       gastralgy: m["gastralgy"],
-      goatherd: m["goatherd"],
-      hammerdress: m["hammerdress"],
+      goatherd: m["goatherd"] && decode_goatherd(m["goatherd"]),
+      hammerdress: m["hammerdress"] && decode_hammerdress(m["hammerdress"]),
       hangfire: m["hangfire"],
       homocerc: m["homocerc"],
-      lacunosity: m["lacunosity"],
+      lacunosity: m["lacunosity"] && decode_lacunosity(m["lacunosity"]),
       longiloquence: m["longiloquence"],
-      mameliere: m["mameliere"],
+      mameliere: m["mameliere"] && decode_mameliere(m["mameliere"]),
       motherless: m["motherless"],
       nonbookish: m["nonbookish"],
       noncorrodible: m["noncorrodible"],
       nonsensicality: m["nonsensicality"],
-      oafishly: m["oafishly"],
+      oafishly: m["oafishly"] && decode_oafishly(m["oafishly"]),
       pfund: m["pfund"],
       preadvisory: m["preadvisory"],
       retroflexed: m["retroflexed"],
-      saccharulmic: m["saccharulmic"],
-      scowlful: m["scowlful"],
+      saccharulmic: m["saccharulmic"] && decode_saccharulmic(m["saccharulmic"]),
+      scowlful: m["scowlful"] && decode_scowlful(m["scowlful"]),
       secluded: m["secluded"],
       slackage: m["slackage"],
-      sphaeridial: m["sphaeridial"],
+      sphaeridial: m["sphaeridial"] && decode_sphaeridial(m["sphaeridial"]),
       spondulics: m["spondulics"],
-      subsecive: m["subsecive"],
+      subsecive: m["subsecive"] && decode_subsecive(m["subsecive"]),
       swellmobsman: m["swellmobsman"],
-      trachyglossate: m["trachyglossate"],
+      trachyglossate: m["trachyglossate"] && decode_trachyglossate(m["trachyglossate"]),
       trialogue: m["trialogue"],
-      unassuaged: m["unassuaged"],
+      unassuaged: m["unassuaged"] && decode_unassuaged(m["unassuaged"]),
       ungross: m["ungross"],
       unjudiciously: m["unjudiciously"],
     }
@@ -1023,6 +1291,20 @@ defmodule MonotheisticallyClass do
           whitestone: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding MonotheisticallyClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding MonotheisticallyClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding MonotheisticallyClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding MonotheisticallyClass.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding MonotheisticallyClass.disdiapason"}
 
@@ -1032,9 +1314,9 @@ defmodule MonotheisticallyClass do
   def from_map(m) do
     %MonotheisticallyClass{
       blaspheme: m["blaspheme"],
-      catharticalness: m["catharticalness"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
       celiosalpingectomy: m["celiosalpingectomy"],
-      chirotherium: m["Chirotherium"],
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       consummativeness: m["consummativeness"],
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       egestive: m["egestive"],
@@ -1630,39 +1912,173 @@ defmodule PiaculumClass do
           zipper: integer() | nil
         }
 
+  def decode_alada(value) when is_integer(value), do: value
+  def decode_alada(_), do: {:error, "Unexpected type when decoding PiaculumClass.alada"}
+
+  def encode_alada(value) when is_integer(value), do: value
+  def encode_alada(_), do: {:error, "Unexpected type when encoding PiaculumClass.alada"}
+
+  def decode_amphistomous(value) when is_integer(value), do: value
+  def decode_amphistomous(_), do: {:error, "Unexpected type when decoding PiaculumClass.amphistomous"}
+
+  def encode_amphistomous(value) when is_integer(value), do: value
+  def encode_amphistomous(_), do: {:error, "Unexpected type when encoding PiaculumClass.amphistomous"}
+
+  def decode_boysenberry(value) when is_integer(value), do: value
+  def decode_boysenberry(_), do: {:error, "Unexpected type when decoding PiaculumClass.boysenberry"}
+
+  def encode_boysenberry(value) when is_integer(value), do: value
+  def encode_boysenberry(_), do: {:error, "Unexpected type when encoding PiaculumClass.boysenberry"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding PiaculumClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding PiaculumClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding PiaculumClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding PiaculumClass.chirotherium"}
+
+  def decode_decardinalize(value) when is_integer(value), do: value
+  def decode_decardinalize(_), do: {:error, "Unexpected type when decoding PiaculumClass.decardinalize"}
+
+  def encode_decardinalize(value) when is_integer(value), do: value
+  def encode_decardinalize(_), do: {:error, "Unexpected type when encoding PiaculumClass.decardinalize"}
+
+  def decode_discouragement(value) when is_integer(value), do: value
+  def decode_discouragement(_), do: {:error, "Unexpected type when decoding PiaculumClass.discouragement"}
+
+  def encode_discouragement(value) when is_integer(value), do: value
+  def encode_discouragement(_), do: {:error, "Unexpected type when encoding PiaculumClass.discouragement"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding PiaculumClass.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding PiaculumClass.disdiapason"}
 
+  def decode_doitrified(value) when is_integer(value), do: value
+  def decode_doitrified(_), do: {:error, "Unexpected type when decoding PiaculumClass.doitrified"}
+
+  def encode_doitrified(value) when is_integer(value), do: value
+  def encode_doitrified(_), do: {:error, "Unexpected type when encoding PiaculumClass.doitrified"}
+
+  def decode_hexaspermous(value) when is_integer(value), do: value
+  def decode_hexaspermous(_), do: {:error, "Unexpected type when decoding PiaculumClass.hexaspermous"}
+
+  def encode_hexaspermous(value) when is_integer(value), do: value
+  def encode_hexaspermous(_), do: {:error, "Unexpected type when encoding PiaculumClass.hexaspermous"}
+
+  def decode_insinking(value) when is_integer(value), do: value
+  def decode_insinking(_), do: {:error, "Unexpected type when decoding PiaculumClass.insinking"}
+
+  def encode_insinking(value) when is_integer(value), do: value
+  def encode_insinking(_), do: {:error, "Unexpected type when encoding PiaculumClass.insinking"}
+
+  def decode_loathfulness(value) when is_integer(value), do: value
+  def decode_loathfulness(_), do: {:error, "Unexpected type when decoding PiaculumClass.loathfulness"}
+
+  def encode_loathfulness(value) when is_integer(value), do: value
+  def encode_loathfulness(_), do: {:error, "Unexpected type when encoding PiaculumClass.loathfulness"}
+
+  def decode_miasmatical(value) when is_integer(value), do: value
+  def decode_miasmatical(_), do: {:error, "Unexpected type when decoding PiaculumClass.miasmatical"}
+
+  def encode_miasmatical(value) when is_integer(value), do: value
+  def encode_miasmatical(_), do: {:error, "Unexpected type when encoding PiaculumClass.miasmatical"}
+
+  def decode_neurofibril(value) when is_integer(value), do: value
+  def decode_neurofibril(_), do: {:error, "Unexpected type when decoding PiaculumClass.neurofibril"}
+
+  def encode_neurofibril(value) when is_integer(value), do: value
+  def encode_neurofibril(_), do: {:error, "Unexpected type when encoding PiaculumClass.neurofibril"}
+
+  def decode_phonendoscope(value) when is_integer(value), do: value
+  def decode_phonendoscope(_), do: {:error, "Unexpected type when decoding PiaculumClass.phonendoscope"}
+
+  def encode_phonendoscope(value) when is_integer(value), do: value
+  def encode_phonendoscope(_), do: {:error, "Unexpected type when encoding PiaculumClass.phonendoscope"}
+
+  def decode_pilferment(value) when is_integer(value), do: value
+  def decode_pilferment(_), do: {:error, "Unexpected type when decoding PiaculumClass.pilferment"}
+
+  def encode_pilferment(value) when is_integer(value), do: value
+  def encode_pilferment(_), do: {:error, "Unexpected type when encoding PiaculumClass.pilferment"}
+
+  def decode_predismissory(value) when is_integer(value), do: value
+  def decode_predismissory(_), do: {:error, "Unexpected type when decoding PiaculumClass.predismissory"}
+
+  def encode_predismissory(value) when is_integer(value), do: value
+  def encode_predismissory(_), do: {:error, "Unexpected type when encoding PiaculumClass.predismissory"}
+
+  def decode_preinscription(value) when is_integer(value), do: value
+  def decode_preinscription(_), do: {:error, "Unexpected type when decoding PiaculumClass.preinscription"}
+
+  def encode_preinscription(value) when is_integer(value), do: value
+  def encode_preinscription(_), do: {:error, "Unexpected type when encoding PiaculumClass.preinscription"}
+
+  def decode_quotative(value) when is_integer(value), do: value
+  def decode_quotative(_), do: {:error, "Unexpected type when decoding PiaculumClass.quotative"}
+
+  def encode_quotative(value) when is_integer(value), do: value
+  def encode_quotative(_), do: {:error, "Unexpected type when encoding PiaculumClass.quotative"}
+
+  def decode_sienna(value) when is_integer(value), do: value
+  def decode_sienna(_), do: {:error, "Unexpected type when decoding PiaculumClass.sienna"}
+
+  def encode_sienna(value) when is_integer(value), do: value
+  def encode_sienna(_), do: {:error, "Unexpected type when encoding PiaculumClass.sienna"}
+
+  def decode_thorax(value) when is_integer(value), do: value
+  def decode_thorax(_), do: {:error, "Unexpected type when decoding PiaculumClass.thorax"}
+
+  def encode_thorax(value) when is_integer(value), do: value
+  def encode_thorax(_), do: {:error, "Unexpected type when encoding PiaculumClass.thorax"}
+
+  def decode_yachting(value) when is_integer(value), do: value
+  def decode_yachting(_), do: {:error, "Unexpected type when decoding PiaculumClass.yachting"}
+
+  def encode_yachting(value) when is_integer(value), do: value
+  def encode_yachting(_), do: {:error, "Unexpected type when encoding PiaculumClass.yachting"}
+
+  def decode_zipper(value) when is_integer(value), do: value
+  def decode_zipper(_), do: {:error, "Unexpected type when decoding PiaculumClass.zipper"}
+
+  def encode_zipper(value) when is_integer(value), do: value
+  def encode_zipper(_), do: {:error, "Unexpected type when encoding PiaculumClass.zipper"}
+
   def from_map(m) do
     %PiaculumClass{
-      alada: m["alada"],
-      amphistomous: m["amphistomous"],
-      boysenberry: m["boysenberry"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      decardinalize: m["decardinalize"],
-      discouragement: m["discouragement"],
+      alada: m["alada"] && decode_alada(m["alada"]),
+      amphistomous: m["amphistomous"] && decode_amphistomous(m["amphistomous"]),
+      boysenberry: m["boysenberry"] && decode_boysenberry(m["boysenberry"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      decardinalize: m["decardinalize"] && decode_decardinalize(m["decardinalize"]),
+      discouragement: m["discouragement"] && decode_discouragement(m["discouragement"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      doitrified: m["doitrified"],
-      hexaspermous: m["hexaspermous"],
+      doitrified: m["doitrified"] && decode_doitrified(m["doitrified"]),
+      hexaspermous: m["hexaspermous"] && decode_hexaspermous(m["hexaspermous"]),
       homocerc: m["homocerc"],
-      insinking: m["insinking"],
-      loathfulness: m["loathfulness"],
-      miasmatical: m["miasmatical"],
-      neurofibril: m["neurofibril"],
+      insinking: m["insinking"] && decode_insinking(m["insinking"]),
+      loathfulness: m["loathfulness"] && decode_loathfulness(m["loathfulness"]),
+      miasmatical: m["miasmatical"] && decode_miasmatical(m["miasmatical"]),
+      neurofibril: m["neurofibril"] && decode_neurofibril(m["neurofibril"]),
       nonbookish: m["nonbookish"],
-      phonendoscope: m["phonendoscope"],
-      pilferment: m["pilferment"],
-      predismissory: m["predismissory"],
-      preinscription: m["preinscription"],
-      quotative: m["quotative"],
-      sienna: m["sienna"],
-      thorax: m["thorax"],
-      yachting: m["yachting"],
-      zipper: m["Zipper"],
+      phonendoscope: m["phonendoscope"] && decode_phonendoscope(m["phonendoscope"]),
+      pilferment: m["pilferment"] && decode_pilferment(m["pilferment"]),
+      predismissory: m["predismissory"] && decode_predismissory(m["predismissory"]),
+      preinscription: m["preinscription"] && decode_preinscription(m["preinscription"]),
+      quotative: m["quotative"] && decode_quotative(m["quotative"]),
+      sienna: m["sienna"] && decode_sienna(m["sienna"]),
+      thorax: m["thorax"] && decode_thorax(m["thorax"]),
+      yachting: m["yachting"] && decode_yachting(m["yachting"]),
+      zipper: m["Zipper"] && decode_zipper(m["Zipper"]),
     }
   end
 
@@ -1740,6 +2156,20 @@ defmodule Pneumocele do
           visitorial: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding Pneumocele.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding Pneumocele.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding Pneumocele.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding Pneumocele.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding Pneumocele.disdiapason"}
 
@@ -1749,8 +2179,8 @@ defmodule Pneumocele do
   def from_map(m) do
     %Pneumocele{
       carbonarism: m["Carbonarism"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       cineolic: m["cineolic"],
       cobbly: m["cobbly"],
       conchyliferous: m["conchyliferous"],
diff --git a/base/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex
index 323ed8a..16848d2 100644
--- a/base/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex
@@ -533,6 +533,20 @@ defmodule Reimagine do
           waltzlike: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding Reimagine.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding Reimagine.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding Reimagine.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding Reimagine.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding Reimagine.disdiapason"}
 
@@ -544,8 +558,8 @@ defmodule Reimagine do
       adducible: m["adducible"],
       anabolin: m["anabolin"],
       brainy: m["brainy"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       chrysamine: m["chrysamine"],
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       fluxweed: m["fluxweed"],
@@ -1273,6 +1287,20 @@ defmodule SaxtenClass do
           withdrawnness: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding SaxtenClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding SaxtenClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding SaxtenClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding SaxtenClass.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding SaxtenClass.disdiapason"}
 
@@ -1283,9 +1311,9 @@ defmodule SaxtenClass do
     %SaxtenClass{
       algarrobilla: m["algarrobilla"],
       bowgrace: m["bowgrace"],
-      catharticalness: m["catharticalness"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
       centaurid: m["Centaurid"],
-      chirotherium: m["Chirotherium"],
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       flix: m["flix"],
       germanely: m["germanely"],
@@ -1803,39 +1831,173 @@ defmodule Staghunting do
           ungirlish: integer() | nil
         }
 
+  def decode_calorimetric(value) when is_integer(value), do: value
+  def decode_calorimetric(_), do: {:error, "Unexpected type when decoding Staghunting.calorimetric"}
+
+  def encode_calorimetric(value) when is_integer(value), do: value
+  def encode_calorimetric(_), do: {:error, "Unexpected type when encoding Staghunting.calorimetric"}
+
+  def decode_canid(value) when is_integer(value), do: value
+  def decode_canid(_), do: {:error, "Unexpected type when decoding Staghunting.canid"}
+
+  def encode_canid(value) when is_integer(value), do: value
+  def encode_canid(_), do: {:error, "Unexpected type when encoding Staghunting.canid"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding Staghunting.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding Staghunting.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding Staghunting.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding Staghunting.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding Staghunting.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding Staghunting.disdiapason"}
 
+  def decode_ditriglyphic(value) when is_integer(value), do: value
+  def decode_ditriglyphic(_), do: {:error, "Unexpected type when decoding Staghunting.ditriglyphic"}
+
+  def encode_ditriglyphic(value) when is_integer(value), do: value
+  def encode_ditriglyphic(_), do: {:error, "Unexpected type when encoding Staghunting.ditriglyphic"}
+
+  def decode_floriferousness(value) when is_integer(value), do: value
+  def decode_floriferousness(_), do: {:error, "Unexpected type when decoding Staghunting.floriferousness"}
+
+  def encode_floriferousness(value) when is_integer(value), do: value
+  def encode_floriferousness(_), do: {:error, "Unexpected type when encoding Staghunting.floriferousness"}
+
+  def decode_gamelike(value) when is_integer(value), do: value
+  def decode_gamelike(_), do: {:error, "Unexpected type when decoding Staghunting.gamelike"}
+
+  def encode_gamelike(value) when is_integer(value), do: value
+  def encode_gamelike(_), do: {:error, "Unexpected type when encoding Staghunting.gamelike"}
+
+  def decode_grig(value) when is_integer(value), do: value
+  def decode_grig(_), do: {:error, "Unexpected type when decoding Staghunting.grig"}
+
+  def encode_grig(value) when is_integer(value), do: value
+  def encode_grig(_), do: {:error, "Unexpected type when encoding Staghunting.grig"}
+
+  def decode_interloan(value) when is_integer(value), do: value
+  def decode_interloan(_), do: {:error, "Unexpected type when decoding Staghunting.interloan"}
+
+  def encode_interloan(value) when is_integer(value), do: value
+  def encode_interloan(_), do: {:error, "Unexpected type when encoding Staghunting.interloan"}
+
+  def decode_lithotomy(value) when is_integer(value), do: value
+  def decode_lithotomy(_), do: {:error, "Unexpected type when decoding Staghunting.lithotomy"}
+
+  def encode_lithotomy(value) when is_integer(value), do: value
+  def encode_lithotomy(_), do: {:error, "Unexpected type when encoding Staghunting.lithotomy"}
+
+  def decode_loric(value) when is_integer(value), do: value
+  def decode_loric(_), do: {:error, "Unexpected type when decoding Staghunting.loric"}
+
+  def encode_loric(value) when is_integer(value), do: value
+  def encode_loric(_), do: {:error, "Unexpected type when encoding Staghunting.loric"}
+
+  def decode_membranocoriaceous(value) when is_integer(value), do: value
+  def decode_membranocoriaceous(_), do: {:error, "Unexpected type when decoding Staghunting.membranocoriaceous"}
+
+  def encode_membranocoriaceous(value) when is_integer(value), do: value
+  def encode_membranocoriaceous(_), do: {:error, "Unexpected type when encoding Staghunting.membranocoriaceous"}
+
+  def decode_membranogenic(value) when is_integer(value), do: value
+  def decode_membranogenic(_), do: {:error, "Unexpected type when decoding Staghunting.membranogenic"}
+
+  def encode_membranogenic(value) when is_integer(value), do: value
+  def encode_membranogenic(_), do: {:error, "Unexpected type when encoding Staghunting.membranogenic"}
+
+  def decode_overtrump(value) when is_integer(value), do: value
+  def decode_overtrump(_), do: {:error, "Unexpected type when decoding Staghunting.overtrump"}
+
+  def encode_overtrump(value) when is_integer(value), do: value
+  def encode_overtrump(_), do: {:error, "Unexpected type when encoding Staghunting.overtrump"}
+
+  def decode_scotino(value) when is_integer(value), do: value
+  def decode_scotino(_), do: {:error, "Unexpected type when decoding Staghunting.scotino"}
+
+  def encode_scotino(value) when is_integer(value), do: value
+  def encode_scotino(_), do: {:error, "Unexpected type when encoding Staghunting.scotino"}
+
+  def decode_seasonable(value) when is_integer(value), do: value
+  def decode_seasonable(_), do: {:error, "Unexpected type when decoding Staghunting.seasonable"}
+
+  def encode_seasonable(value) when is_integer(value), do: value
+  def encode_seasonable(_), do: {:error, "Unexpected type when encoding Staghunting.seasonable"}
+
+  def decode_sephen(value) when is_integer(value), do: value
+  def decode_sephen(_), do: {:error, "Unexpected type when decoding Staghunting.sephen"}
+
+  def encode_sephen(value) when is_integer(value), do: value
+  def encode_sephen(_), do: {:error, "Unexpected type when encoding Staghunting.sephen"}
+
+  def decode_stigmarioid(value) when is_integer(value), do: value
+  def decode_stigmarioid(_), do: {:error, "Unexpected type when decoding Staghunting.stigmarioid"}
+
+  def encode_stigmarioid(value) when is_integer(value), do: value
+  def encode_stigmarioid(_), do: {:error, "Unexpected type when encoding Staghunting.stigmarioid"}
+
+  def decode_tired(value) when is_integer(value), do: value
+  def decode_tired(_), do: {:error, "Unexpected type when decoding Staghunting.tired"}
+
+  def encode_tired(value) when is_integer(value), do: value
+  def encode_tired(_), do: {:error, "Unexpected type when encoding Staghunting.tired"}
+
+  def decode_trifid(value) when is_integer(value), do: value
+  def decode_trifid(_), do: {:error, "Unexpected type when decoding Staghunting.trifid"}
+
+  def encode_trifid(value) when is_integer(value), do: value
+  def encode_trifid(_), do: {:error, "Unexpected type when encoding Staghunting.trifid"}
+
+  def decode_undefeatedly(value) when is_integer(value), do: value
+  def decode_undefeatedly(_), do: {:error, "Unexpected type when decoding Staghunting.undefeatedly"}
+
+  def encode_undefeatedly(value) when is_integer(value), do: value
+  def encode_undefeatedly(_), do: {:error, "Unexpected type when encoding Staghunting.undefeatedly"}
+
+  def decode_ungirlish(value) when is_integer(value), do: value
+  def decode_ungirlish(_), do: {:error, "Unexpected type when decoding Staghunting.ungirlish"}
+
+  def encode_ungirlish(value) when is_integer(value), do: value
+  def encode_ungirlish(_), do: {:error, "Unexpected type when encoding Staghunting.ungirlish"}
+
   def from_map(m) do
     %Staghunting{
-      calorimetric: m["calorimetric"],
-      canid: m["canid"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
+      calorimetric: m["calorimetric"] && decode_calorimetric(m["calorimetric"]),
+      canid: m["canid"] && decode_canid(m["canid"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      ditriglyphic: m["ditriglyphic"],
-      floriferousness: m["floriferousness"],
-      gamelike: m["gamelike"],
-      grig: m["grig"],
+      ditriglyphic: m["ditriglyphic"] && decode_ditriglyphic(m["ditriglyphic"]),
+      floriferousness: m["floriferousness"] && decode_floriferousness(m["floriferousness"]),
+      gamelike: m["gamelike"] && decode_gamelike(m["gamelike"]),
+      grig: m["grig"] && decode_grig(m["grig"]),
       homocerc: m["homocerc"],
-      interloan: m["interloan"],
-      lithotomy: m["lithotomy"],
-      loric: m["loric"],
-      membranocoriaceous: m["membranocoriaceous"],
-      membranogenic: m["membranogenic"],
+      interloan: m["interloan"] && decode_interloan(m["interloan"]),
+      lithotomy: m["lithotomy"] && decode_lithotomy(m["lithotomy"]),
+      loric: m["loric"] && decode_loric(m["loric"]),
+      membranocoriaceous: m["membranocoriaceous"] && decode_membranocoriaceous(m["membranocoriaceous"]),
+      membranogenic: m["membranogenic"] && decode_membranogenic(m["membranogenic"]),
       nonbookish: m["nonbookish"],
-      overtrump: m["overtrump"],
-      scotino: m["scotino"],
-      seasonable: m["seasonable"],
-      sephen: m["sephen"],
-      stigmarioid: m["stigmarioid"],
-      tired: m["tired"],
-      trifid: m["trifid"],
-      undefeatedly: m["undefeatedly"],
-      ungirlish: m["ungirlish"],
+      overtrump: m["overtrump"] && decode_overtrump(m["overtrump"]),
+      scotino: m["scotino"] && decode_scotino(m["scotino"]),
+      seasonable: m["seasonable"] && decode_seasonable(m["seasonable"]),
+      sephen: m["sephen"] && decode_sephen(m["sephen"]),
+      stigmarioid: m["stigmarioid"] && decode_stigmarioid(m["stigmarioid"]),
+      tired: m["tired"] && decode_tired(m["tired"]),
+      trifid: m["trifid"] && decode_trifid(m["trifid"]),
+      undefeatedly: m["undefeatedly"] && decode_undefeatedly(m["undefeatedly"]),
+      ungirlish: m["ungirlish"] && decode_ungirlish(m["ungirlish"]),
     }
   end
 
@@ -1913,39 +2075,173 @@ defmodule StrenuosityClass do
           yankeeist: integer() | nil
         }
 
+  def decode_bliss(value) when is_integer(value), do: value
+  def decode_bliss(_), do: {:error, "Unexpected type when decoding StrenuosityClass.bliss"}
+
+  def encode_bliss(value) when is_integer(value), do: value
+  def encode_bliss(_), do: {:error, "Unexpected type when encoding StrenuosityClass.bliss"}
+
+  def decode_buccate(value) when is_integer(value), do: value
+  def decode_buccate(_), do: {:error, "Unexpected type when decoding StrenuosityClass.buccate"}
+
+  def encode_buccate(value) when is_integer(value), do: value
+  def encode_buccate(_), do: {:error, "Unexpected type when encoding StrenuosityClass.buccate"}
+
+  def decode_bulletproof(value) when is_integer(value), do: value
+  def decode_bulletproof(_), do: {:error, "Unexpected type when decoding StrenuosityClass.bulletproof"}
+
+  def encode_bulletproof(value) when is_integer(value), do: value
+  def encode_bulletproof(_), do: {:error, "Unexpected type when encoding StrenuosityClass.bulletproof"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding StrenuosityClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding StrenuosityClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding StrenuosityClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding StrenuosityClass.chirotherium"}
+
+  def decode_crumblingness(value) when is_integer(value), do: value
+  def decode_crumblingness(_), do: {:error, "Unexpected type when decoding StrenuosityClass.crumblingness"}
+
+  def encode_crumblingness(value) when is_integer(value), do: value
+  def encode_crumblingness(_), do: {:error, "Unexpected type when encoding StrenuosityClass.crumblingness"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding StrenuosityClass.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding StrenuosityClass.disdiapason"}
 
+  def decode_engagedly(value) when is_integer(value), do: value
+  def decode_engagedly(_), do: {:error, "Unexpected type when decoding StrenuosityClass.engagedly"}
+
+  def encode_engagedly(value) when is_integer(value), do: value
+  def encode_engagedly(_), do: {:error, "Unexpected type when encoding StrenuosityClass.engagedly"}
+
+  def decode_fightable(value) when is_integer(value), do: value
+  def decode_fightable(_), do: {:error, "Unexpected type when decoding StrenuosityClass.fightable"}
+
+  def encode_fightable(value) when is_integer(value), do: value
+  def encode_fightable(_), do: {:error, "Unexpected type when encoding StrenuosityClass.fightable"}
+
+  def decode_hoariness(value) when is_integer(value), do: value
+  def decode_hoariness(_), do: {:error, "Unexpected type when decoding StrenuosityClass.hoariness"}
+
+  def encode_hoariness(value) when is_integer(value), do: value
+  def encode_hoariness(_), do: {:error, "Unexpected type when encoding StrenuosityClass.hoariness"}
+
+  def decode_hypopodium(value) when is_integer(value), do: value
+  def decode_hypopodium(_), do: {:error, "Unexpected type when decoding StrenuosityClass.hypopodium"}
+
+  def encode_hypopodium(value) when is_integer(value), do: value
+  def encode_hypopodium(_), do: {:error, "Unexpected type when encoding StrenuosityClass.hypopodium"}
+
+  def decode_luxurist(value) when is_integer(value), do: value
+  def decode_luxurist(_), do: {:error, "Unexpected type when decoding StrenuosityClass.luxurist"}
+
+  def encode_luxurist(value) when is_integer(value), do: value
+  def encode_luxurist(_), do: {:error, "Unexpected type when encoding StrenuosityClass.luxurist"}
+
+  def decode_mechanician(value) when is_integer(value), do: value
+  def decode_mechanician(_), do: {:error, "Unexpected type when decoding StrenuosityClass.mechanician"}
+
+  def encode_mechanician(value) when is_integer(value), do: value
+  def encode_mechanician(_), do: {:error, "Unexpected type when encoding StrenuosityClass.mechanician"}
+
+  def decode_onopordon(value) when is_integer(value), do: value
+  def decode_onopordon(_), do: {:error, "Unexpected type when decoding StrenuosityClass.onopordon"}
+
+  def encode_onopordon(value) when is_integer(value), do: value
+  def encode_onopordon(_), do: {:error, "Unexpected type when encoding StrenuosityClass.onopordon"}
+
+  def decode_podgily(value) when is_integer(value), do: value
+  def decode_podgily(_), do: {:error, "Unexpected type when decoding StrenuosityClass.podgily"}
+
+  def encode_podgily(value) when is_integer(value), do: value
+  def encode_podgily(_), do: {:error, "Unexpected type when encoding StrenuosityClass.podgily"}
+
+  def decode_reformableness(value) when is_integer(value), do: value
+  def decode_reformableness(_), do: {:error, "Unexpected type when decoding StrenuosityClass.reformableness"}
+
+  def encode_reformableness(value) when is_integer(value), do: value
+  def encode_reformableness(_), do: {:error, "Unexpected type when encoding StrenuosityClass.reformableness"}
+
+  def decode_scatterbrains(value) when is_integer(value), do: value
+  def decode_scatterbrains(_), do: {:error, "Unexpected type when decoding StrenuosityClass.scatterbrains"}
+
+  def encode_scatterbrains(value) when is_integer(value), do: value
+  def encode_scatterbrains(_), do: {:error, "Unexpected type when encoding StrenuosityClass.scatterbrains"}
+
+  def decode_seminuria(value) when is_integer(value), do: value
+  def decode_seminuria(_), do: {:error, "Unexpected type when decoding StrenuosityClass.seminuria"}
+
+  def encode_seminuria(value) when is_integer(value), do: value
+  def encode_seminuria(_), do: {:error, "Unexpected type when encoding StrenuosityClass.seminuria"}
+
+  def decode_sodomite(value) when is_integer(value), do: value
+  def decode_sodomite(_), do: {:error, "Unexpected type when decoding StrenuosityClass.sodomite"}
+
+  def encode_sodomite(value) when is_integer(value), do: value
+  def encode_sodomite(_), do: {:error, "Unexpected type when encoding StrenuosityClass.sodomite"}
+
+  def decode_tramp(value) when is_integer(value), do: value
+  def decode_tramp(_), do: {:error, "Unexpected type when decoding StrenuosityClass.tramp"}
+
+  def encode_tramp(value) when is_integer(value), do: value
+  def encode_tramp(_), do: {:error, "Unexpected type when encoding StrenuosityClass.tramp"}
+
+  def decode_undueness(value) when is_integer(value), do: value
+  def decode_undueness(_), do: {:error, "Unexpected type when decoding StrenuosityClass.undueness"}
+
+  def encode_undueness(value) when is_integer(value), do: value
+  def encode_undueness(_), do: {:error, "Unexpected type when encoding StrenuosityClass.undueness"}
+
+  def decode_worthily(value) when is_integer(value), do: value
+  def decode_worthily(_), do: {:error, "Unexpected type when decoding StrenuosityClass.worthily"}
+
+  def encode_worthily(value) when is_integer(value), do: value
+  def encode_worthily(_), do: {:error, "Unexpected type when encoding StrenuosityClass.worthily"}
+
+  def decode_yankeeist(value) when is_integer(value), do: value
+  def decode_yankeeist(_), do: {:error, "Unexpected type when decoding StrenuosityClass.yankeeist"}
+
+  def encode_yankeeist(value) when is_integer(value), do: value
+  def encode_yankeeist(_), do: {:error, "Unexpected type when encoding StrenuosityClass.yankeeist"}
+
   def from_map(m) do
     %StrenuosityClass{
-      bliss: m["bliss"],
-      buccate: m["buccate"],
-      bulletproof: m["bulletproof"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      crumblingness: m["crumblingness"],
+      bliss: m["bliss"] && decode_bliss(m["bliss"]),
+      buccate: m["buccate"] && decode_buccate(m["buccate"]),
+      bulletproof: m["bulletproof"] && decode_bulletproof(m["bulletproof"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      crumblingness: m["crumblingness"] && decode_crumblingness(m["crumblingness"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      engagedly: m["engagedly"],
-      fightable: m["fightable"],
-      hoariness: m["hoariness"],
+      engagedly: m["engagedly"] && decode_engagedly(m["engagedly"]),
+      fightable: m["fightable"] && decode_fightable(m["fightable"]),
+      hoariness: m["hoariness"] && decode_hoariness(m["hoariness"]),
       homocerc: m["homocerc"],
-      hypopodium: m["hypopodium"],
-      luxurist: m["luxurist"],
-      mechanician: m["mechanician"],
+      hypopodium: m["hypopodium"] && decode_hypopodium(m["hypopodium"]),
+      luxurist: m["luxurist"] && decode_luxurist(m["luxurist"]),
+      mechanician: m["mechanician"] && decode_mechanician(m["mechanician"]),
       nonbookish: m["nonbookish"],
-      onopordon: m["Onopordon"],
-      podgily: m["podgily"],
-      reformableness: m["reformableness"],
-      scatterbrains: m["scatterbrains"],
-      seminuria: m["seminuria"],
-      sodomite: m["Sodomite"],
-      tramp: m["tramp"],
-      undueness: m["undueness"],
-      worthily: m["worthily"],
-      yankeeist: m["Yankeeist"],
+      onopordon: m["Onopordon"] && decode_onopordon(m["Onopordon"]),
+      podgily: m["podgily"] && decode_podgily(m["podgily"]),
+      reformableness: m["reformableness"] && decode_reformableness(m["reformableness"]),
+      scatterbrains: m["scatterbrains"] && decode_scatterbrains(m["scatterbrains"]),
+      seminuria: m["seminuria"] && decode_seminuria(m["seminuria"]),
+      sodomite: m["Sodomite"] && decode_sodomite(m["Sodomite"]),
+      tramp: m["tramp"] && decode_tramp(m["tramp"]),
+      undueness: m["undueness"] && decode_undueness(m["undueness"]),
+      worthily: m["worthily"] && decode_worthily(m["worthily"]),
+      yankeeist: m["Yankeeist"] && decode_yankeeist(m["Yankeeist"]),
     }
   end
 
@@ -2023,6 +2319,20 @@ defmodule TruantcyClass do
           yuman: nil | nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding TruantcyClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding TruantcyClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding TruantcyClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding TruantcyClass.chirotherium"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding TruantcyClass.disdiapason"}
 
@@ -2034,9 +2344,9 @@ defmodule TruantcyClass do
       alfiona: m["alfiona"],
       ascaridiasis: m["ascaridiasis"],
       bungey: m["bungey"],
-      catharticalness: m["catharticalness"],
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
       ceroxyle: m["ceroxyle"],
-      chirotherium: m["Chirotherium"],
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
       chorology: m["chorology"],
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
       enmarble: m["enmarble"],
@@ -2133,39 +2443,173 @@ defmodule UnimpeachablyClass do
           unsuggestedness: integer() | nil
         }
 
+  def decode_acerin(value) when is_integer(value), do: value
+  def decode_acerin(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.acerin"}
+
+  def encode_acerin(value) when is_integer(value), do: value
+  def encode_acerin(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.acerin"}
+
+  def decode_bobadil(value) when is_integer(value), do: value
+  def decode_bobadil(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.bobadil"}
+
+  def encode_bobadil(value) when is_integer(value), do: value
+  def encode_bobadil(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.bobadil"}
+
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.chirotherium"}
+
+  def decode_chlorophylligenous(value) when is_integer(value), do: value
+  def decode_chlorophylligenous(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.chlorophylligenous"}
+
+  def encode_chlorophylligenous(value) when is_integer(value), do: value
+  def encode_chlorophylligenous(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.chlorophylligenous"}
+
+  def decode_conversational(value) when is_integer(value), do: value
+  def decode_conversational(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.conversational"}
+
+  def encode_conversational(value) when is_integer(value), do: value
+  def encode_conversational(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.conversational"}
+
+  def decode_demiowl(value) when is_integer(value), do: value
+  def decode_demiowl(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.demiowl"}
+
+  def encode_demiowl(value) when is_integer(value), do: value
+  def encode_demiowl(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.demiowl"}
+
   def decode_disdiapason(value) when is_binary(value), do: value
   def decode_disdiapason(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.disdiapason"}
 
   def encode_disdiapason(value) when is_binary(value), do: value
   def encode_disdiapason(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.disdiapason"}
 
+  def decode_ectorhinal(value) when is_integer(value), do: value
+  def decode_ectorhinal(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.ectorhinal"}
+
+  def encode_ectorhinal(value) when is_integer(value), do: value
+  def encode_ectorhinal(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.ectorhinal"}
+
+  def decode_gamblesomeness(value) when is_integer(value), do: value
+  def decode_gamblesomeness(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.gamblesomeness"}
+
+  def encode_gamblesomeness(value) when is_integer(value), do: value
+  def encode_gamblesomeness(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.gamblesomeness"}
+
+  def decode_irrorate(value) when is_integer(value), do: value
+  def decode_irrorate(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.irrorate"}
+
+  def encode_irrorate(value) when is_integer(value), do: value
+  def encode_irrorate(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.irrorate"}
+
+  def decode_kindergartening(value) when is_integer(value), do: value
+  def decode_kindergartening(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.kindergartening"}
+
+  def encode_kindergartening(value) when is_integer(value), do: value
+  def encode_kindergartening(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.kindergartening"}
+
+  def decode_lateritic(value) when is_integer(value), do: value
+  def decode_lateritic(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.lateritic"}
+
+  def encode_lateritic(value) when is_integer(value), do: value
+  def encode_lateritic(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.lateritic"}
+
+  def decode_mespil(value) when is_integer(value), do: value
+  def decode_mespil(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.mespil"}
+
+  def encode_mespil(value) when is_integer(value), do: value
+  def encode_mespil(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.mespil"}
+
+  def decode_misconfiguration(value) when is_integer(value), do: value
+  def decode_misconfiguration(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.misconfiguration"}
+
+  def encode_misconfiguration(value) when is_integer(value), do: value
+  def encode_misconfiguration(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.misconfiguration"}
+
+  def decode_planometry(value) when is_integer(value), do: value
+  def decode_planometry(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.planometry"}
+
+  def encode_planometry(value) when is_integer(value), do: value
+  def encode_planometry(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.planometry"}
+
+  def decode_quiina(value) when is_integer(value), do: value
+  def decode_quiina(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.quiina"}
+
+  def encode_quiina(value) when is_integer(value), do: value
+  def encode_quiina(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.quiina"}
+
+  def decode_robert(value) when is_integer(value), do: value
+  def decode_robert(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.robert"}
+
+  def encode_robert(value) when is_integer(value), do: value
+  def encode_robert(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.robert"}
+
+  def decode_rot(value) when is_integer(value), do: value
+  def decode_rot(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.rot"}
+
+  def encode_rot(value) when is_integer(value), do: value
+  def encode_rot(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.rot"}
+
+  def decode_subcinctorium(value) when is_integer(value), do: value
+  def decode_subcinctorium(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.subcinctorium"}
+
+  def encode_subcinctorium(value) when is_integer(value), do: value
+  def encode_subcinctorium(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.subcinctorium"}
+
+  def decode_tussocker(value) when is_integer(value), do: value
+  def decode_tussocker(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.tussocker"}
+
+  def encode_tussocker(value) when is_integer(value), do: value
+  def encode_tussocker(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.tussocker"}
+
+  def decode_ultraproud(value) when is_integer(value), do: value
+  def decode_ultraproud(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.ultraproud"}
+
+  def encode_ultraproud(value) when is_integer(value), do: value
+  def encode_ultraproud(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.ultraproud"}
+
+  def decode_unsuggestedness(value) when is_integer(value), do: value
+  def decode_unsuggestedness(_), do: {:error, "Unexpected type when decoding UnimpeachablyClass.unsuggestedness"}
+
+  def encode_unsuggestedness(value) when is_integer(value), do: value
+  def encode_unsuggestedness(_), do: {:error, "Unexpected type when encoding UnimpeachablyClass.unsuggestedness"}
+
   def from_map(m) do
     %UnimpeachablyClass{
-      acerin: m["acerin"],
-      bobadil: m["Bobadil"],
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      chlorophylligenous: m["chlorophylligenous"],
-      conversational: m["conversational"],
-      demiowl: m["demiowl"],
+      acerin: m["acerin"] && decode_acerin(m["acerin"]),
+      bobadil: m["Bobadil"] && decode_bobadil(m["Bobadil"]),
+      catharticalness: m["catharticalness"] && decode_catharticalness(m["catharticalness"]),
+      chirotherium: m["Chirotherium"] && decode_chirotherium(m["Chirotherium"]),
+      chlorophylligenous: m["chlorophylligenous"] && decode_chlorophylligenous(m["chlorophylligenous"]),
+      conversational: m["conversational"] && decode_conversational(m["conversational"]),
+      demiowl: m["demiowl"] && decode_demiowl(m["demiowl"]),
       disdiapason: m["disdiapason"] && decode_disdiapason(m["disdiapason"]),
-      ectorhinal: m["ectorhinal"],
-      gamblesomeness: m["gamblesomeness"],
+      ectorhinal: m["ectorhinal"] && decode_ectorhinal(m["ectorhinal"]),
+      gamblesomeness: m["gamblesomeness"] && decode_gamblesomeness(m["gamblesomeness"]),
       homocerc: m["homocerc"],
-      irrorate: m["irrorate"],
-      kindergartening: m["kindergartening"],
-      lateritic: m["lateritic"],
-      mespil: m["mespil"],
-      misconfiguration: m["misconfiguration"],
+      irrorate: m["irrorate"] && decode_irrorate(m["irrorate"]),
+      kindergartening: m["kindergartening"] && decode_kindergartening(m["kindergartening"]),
+      lateritic: m["lateritic"] && decode_lateritic(m["lateritic"]),
+      mespil: m["mespil"] && decode_mespil(m["mespil"]),
+      misconfiguration: m["misconfiguration"] && decode_misconfiguration(m["misconfiguration"]),
       nonbookish: m["nonbookish"],
-      planometry: m["planometry"],
-      quiina: m["Quiina"],
-      robert: m["Robert"],
-      rot: m["rot"],
-      subcinctorium: m["subcinctorium"],
-      tussocker: m["tussocker"],
-      ultraproud: m["ultraproud"],
-      unsuggestedness: m["unsuggestedness"],
+      planometry: m["planometry"] && decode_planometry(m["planometry"]),
+      quiina: m["Quiina"] && decode_quiina(m["Quiina"]),
+      robert: m["Robert"] && decode_robert(m["Robert"]),
+      rot: m["rot"] && decode_rot(m["rot"]),
+      subcinctorium: m["subcinctorium"] && decode_subcinctorium(m["subcinctorium"]),
+      tussocker: m["tussocker"] && decode_tussocker(m["tussocker"]),
+      ultraproud: m["ultraproud"] && decode_ultraproud(m["ultraproud"]),
+      unsuggestedness: m["unsuggestedness"] && decode_unsuggestedness(m["unsuggestedness"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex
index d651b3f..1947dee 100644
--- a/base/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex
@@ -9092,6 +9092,45 @@ defmodule Right do
   end
 end
 
+defmodule S do
+  @enforce_keys [:s]
+  defstruct [:s]
+
+  @type t :: %__MODULE__{
+          s: integer()
+        }
+
+  def decode_s(value) when is_integer(value), do: value
+  def decode_s(_), do: {:error, "Unexpected type when decoding S.s"}
+
+  def encode_s(value) when is_integer(value), do: value
+  def encode_s(_), do: {:error, "Unexpected type when encoding S.s"}
+
+  def from_map(m) do
+    %S{
+      s: decode_s(m["s"]),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "s" => struct.s,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
+
 defmodule Sbyte do
   @enforce_keys [:sbyte]
   defstruct [:sbyte]
@@ -10809,8 +10848,8 @@ defmodule Undefined do
 end
 
 defmodule Obj4 do
-  @enforce_keys [:dummy, :obj4_self, :obj4_true, :obj4_type, :public, :quicktype, :raise, :range, :readonly, :ref, :register, :reinterpret_cast, :repeat, :require, :required, :requires, :restrict, :retain, :rethrows, :return, :right, :sbyte, :sealed, :sel, :select, :self, :serialize, :set, :short, :signed, :sizeof, :stackalloc, :static, :static_assert, :static_cast, :strictfp, :string, :struct, :subscript, :super, :switch, :symbol, :synchronized, :system, :template, :then, :this, :thread_local, :throw, :throws, :to_json, :top_level, :transient, :true_1, :try, :type, :typealias, :typedef, :typeid, :typename, :typeof, :uint, :ulong, :unchecked, :undefined]
-  defstruct [:dummy, :obj4_self, :obj4_true, :obj4_type, :public, :quicktype, :raise, :range, :readonly, :ref, :register, :reinterpret_cast, :repeat, :require, :required, :requires, :restrict, :retain, :rethrows, :return, :right, :sbyte, :sealed, :sel, :select, :self, :serialize, :set, :short, :signed, :sizeof, :stackalloc, :static, :static_assert, :static_cast, :strictfp, :string, :struct, :subscript, :super, :switch, :symbol, :synchronized, :system, :template, :then, :this, :thread_local, :throw, :throws, :to_json, :top_level, :transient, :true_1, :try, :type, :typealias, :typedef, :typeid, :typename, :typeof, :uint, :ulong, :unchecked, :undefined]
+  @enforce_keys [:dummy, :obj4_self, :obj4_true, :obj4_type, :public, :quicktype, :raise, :range, :readonly, :ref, :register, :reinterpret_cast, :repeat, :require, :required, :requires, :restrict, :retain, :rethrows, :return, :right, :s, :sbyte, :sealed, :sel, :select, :self, :serialize, :set, :short, :signed, :sizeof, :stackalloc, :static, :static_assert, :static_cast, :strictfp, :string, :struct, :subscript, :super, :switch, :symbol, :synchronized, :system, :template, :then, :this, :thread_local, :throw, :throws, :to_json, :top_level, :transient, :true_1, :try, :type, :typealias, :typedef, :typeid, :typename, :typeof, :uint, :ulong, :unchecked, :undefined]
+  defstruct [:dummy, :obj4_self, :obj4_true, :obj4_type, :public, :quicktype, :raise, :range, :readonly, :ref, :register, :reinterpret_cast, :repeat, :require, :required, :requires, :restrict, :retain, :rethrows, :return, :right, :s, :sbyte, :sealed, :sel, :select, :self, :serialize, :set, :short, :signed, :sizeof, :stackalloc, :static, :static_assert, :static_cast, :strictfp, :string, :struct, :subscript, :super, :switch, :symbol, :synchronized, :system, :template, :then, :this, :thread_local, :throw, :throws, :to_json, :top_level, :transient, :true_1, :try, :type, :typealias, :typedef, :typeid, :typename, :typeof, :uint, :ulong, :unchecked, :undefined]
 
   @type t :: %__MODULE__{
           dummy: integer(),
@@ -10834,6 +10873,7 @@ defmodule Obj4 do
           rethrows: Rethrows.t(),
           return: Return.t(),
           right: Right.t(),
+          s: S.t(),
           sbyte: Sbyte.t(),
           sealed: Sealed.t(),
           sel: Sel.t(),
@@ -10909,6 +10949,7 @@ defmodule Obj4 do
       rethrows: Rethrows.from_map(m["rethrows"]),
       return: Return.from_map(m["return"]),
       right: Right.from_map(m["right"]),
+      s: S.from_map(m["s"]),
       sbyte: Sbyte.from_map(m["sbyte"]),
       sealed: Sealed.from_map(m["sealed"]),
       sel: Sel.from_map(m["SEL"]),
@@ -10985,6 +11026,7 @@ defmodule Obj4 do
       "rethrows" => Rethrows.to_map(struct.rethrows),
       "return" => Return.to_map(struct.return),
       "right" => Right.to_map(struct.right),
+      "s" => S.to_map(struct.s),
       "sbyte" => Sbyte.to_map(struct.sbyte),
       "sealed" => Sealed.to_map(struct.sealed),
       "SEL" => Sel.to_map(struct.sel),
diff --git a/base/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
index b9b9eb4..9f670d9 100644
--- a/base/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
@@ -816,6 +816,12 @@ defmodule Scorer do
   def encode_name(value) when is_binary(value), do: value
   def encode_name(_), do: {:error, "Unexpected type when encoding Scorer.name"}
 
+  def decode_per(value) when is_integer(value), do: value
+  def decode_per(_), do: {:error, "Unexpected type when decoding Scorer.per"}
+
+  def encode_per(value) when is_integer(value), do: value
+  def encode_per(_), do: {:error, "Unexpected type when encoding Scorer.per"}
+
   def decode_player(value) when is_binary(value), do: value
   def decode_player(_), do: {:error, "Unexpected type when decoding Scorer.player"}
 
@@ -846,6 +852,12 @@ defmodule Scorer do
   def encode_tno(value) when is_integer(value), do: value
   def encode_tno(_), do: {:error, "Unexpected type when encoding Scorer.tno"}
 
+  def decode_tot(value) when is_integer(value), do: value
+  def decode_tot(_), do: {:error, "Unexpected type when decoding Scorer.tot"}
+
+  def encode_tot(value) when is_integer(value), do: value
+  def encode_tot(_), do: {:error, "Unexpected type when encoding Scorer.tot"}
+
   def from_map(m) do
     %Scorer{
       family_name: m["familyName"] && decode_family_name(m["familyName"]),
@@ -858,7 +870,7 @@ defmodule Scorer do
       international_first_name: m["internationalFirstName"] && decode_international_first_name(m["internationalFirstName"]),
       international_first_name_initial: m["internationalFirstNameInitial"] && FirstNameInitial.decode(m["internationalFirstNameInitial"]),
       name: m["name"] && decode_name(m["name"]),
-      per: m["per"],
+      per: m["per"] && decode_per(m["per"]),
       per_type: m["perType"] && PerType.decode(m["perType"]),
       player: m["player"] && decode_player(m["player"]),
       pno: decode_pno(m["pno"]),
@@ -867,7 +879,7 @@ defmodule Scorer do
       summary: m["summary"] && decode_summary(m["summary"]),
       times: m["times"] && Enum.map(m["times"], &TimeElement.from_map/1),
       tno: decode_tno(m["tno"]),
-      tot: m["tot"],
+      tot: m["tot"] && decode_tot(m["tot"]),
     }
   end
 
@@ -1130,6 +1142,12 @@ defmodule Pl do
   def encode_active(value) when is_integer(value), do: value
   def encode_active(_), do: {:error, "Unexpected type when encoding Pl.active"}
 
+  def decode_captain(value) when is_integer(value), do: value
+  def decode_captain(_), do: {:error, "Unexpected type when decoding Pl.captain"}
+
+  def encode_captain(value) when is_integer(value), do: value
+  def encode_captain(_), do: {:error, "Unexpected type when encoding Pl.captain"}
+
   def decode_eff_1(value) when is_integer(value), do: value
   def decode_eff_1(_), do: {:error, "Unexpected type when decoding Pl.eff_1"}
 
@@ -1389,7 +1407,7 @@ defmodule Pl do
   def from_map(m) do
     %Pl{
       active: decode_active(m["active"]),
-      captain: m["captain"],
+      captain: m["captain"] && decode_captain(m["captain"]),
       comp: m["comp"] && Comp.from_map(m["comp"]),
       eff_1: decode_eff_1(m["eff_1"]),
       eff_2: decode_eff_2(m["eff_2"]),
diff --git a/base/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
index de5128c..cb036e5 100644
--- a/base/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
@@ -2233,6 +2233,12 @@ defmodule Payload do
   def encode_description(value) when is_binary(value), do: value
   def encode_description(_), do: {:error, "Unexpected type when encoding Payload.description"}
 
+  def decode_distinct_size(value) when is_integer(value), do: value
+  def decode_distinct_size(_), do: {:error, "Unexpected type when decoding Payload.distinct_size"}
+
+  def encode_distinct_size(value) when is_integer(value), do: value
+  def encode_distinct_size(_), do: {:error, "Unexpected type when encoding Payload.distinct_size"}
+
   def decode_head(value) when is_binary(value), do: value
   def decode_head(_), do: {:error, "Unexpected type when decoding Payload.head"}
 
@@ -2245,6 +2251,18 @@ defmodule Payload do
   def encode_master_branch(value) when is_binary(value), do: value
   def encode_master_branch(_), do: {:error, "Unexpected type when encoding Payload.master_branch"}
 
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Payload.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Payload.number"}
+
+  def decode_push_id(value) when is_integer(value), do: value
+  def decode_push_id(_), do: {:error, "Unexpected type when decoding Payload.push_id"}
+
+  def encode_push_id(value) when is_integer(value), do: value
+  def encode_push_id(_), do: {:error, "Unexpected type when encoding Payload.push_id"}
+
   def decode_pusher_type(value) when is_binary(value), do: value
   def decode_pusher_type(_), do: {:error, "Unexpected type when decoding Payload.pusher_type"}
 
@@ -2263,6 +2281,12 @@ defmodule Payload do
   def encode_ref_type(value) when is_binary(value), do: value
   def encode_ref_type(_), do: {:error, "Unexpected type when encoding Payload.ref_type"}
 
+  def decode_size(value) when is_integer(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding Payload.size"}
+
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding Payload.size"}
+
   def from_map(m) do
     %Payload{
       action: m["action"] && decode_action(m["action"]),
@@ -2270,17 +2294,17 @@ defmodule Payload do
       comment: m["comment"] && Comment.from_map(m["comment"]),
       commits: m["commits"] && Enum.map(m["commits"], &Commit.from_map/1),
       description: m["description"] && decode_description(m["description"]),
-      distinct_size: m["distinct_size"],
+      distinct_size: m["distinct_size"] && decode_distinct_size(m["distinct_size"]),
       head: m["head"] && decode_head(m["head"]),
       issue: m["issue"] && Issue.from_map(m["issue"]),
       master_branch: m["master_branch"] && decode_master_branch(m["master_branch"]),
-      number: m["number"],
+      number: m["number"] && decode_number(m["number"]),
       pull_request: m["pull_request"] && PayloadPullRequest.from_map(m["pull_request"]),
-      push_id: m["push_id"],
+      push_id: m["push_id"] && decode_push_id(m["push_id"]),
       pusher_type: m["pusher_type"] && decode_pusher_type(m["pusher_type"]),
       ref: m["ref"] && decode_ref(m["ref"]),
       ref_type: m["ref_type"] && decode_ref_type(m["ref_type"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
     }
   end
 
diff --git a/head/elixir/test/inputs/json/samples/objc-control-characters.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/objc-control-characters.json/default/QuickType.ex
new file mode 100644
index 0000000..8233c81
--- /dev/null
+++ b/head/elixir/test/inputs/json/samples/objc-control-characters.json/default/QuickType.ex
@@ -0,0 +1,72 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule TopLevel do
+  @enforce_keys [:empty, :the_1, :top_level, :u001_b]
+  defstruct [:empty, :the_1, :top_level, :u001_b]
+
+  @type t :: %__MODULE__{
+          empty: String.t(),
+          the_1: String.t(),
+          top_level: String.t(),
+          u001_b: String.t()
+        }
+
+  def decode_empty(value) when is_binary(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding TopLevel.empty"}
+
+  def encode_empty(value) when is_binary(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding TopLevel.empty"}
+
+  def decode_the_1(value) when is_binary(value), do: value
+  def decode_the_1(_), do: {:error, "Unexpected type when decoding TopLevel.the_1"}
+
+  def encode_the_1(value) when is_binary(value), do: value
+  def encode_the_1(_), do: {:error, "Unexpected type when encoding TopLevel.the_1"}
+
+  def decode_top_level(value) when is_binary(value), do: value
+  def decode_top_level(_), do: {:error, "Unexpected type when decoding TopLevel.top_level"}
+
+  def encode_top_level(value) when is_binary(value), do: value
+  def encode_top_level(_), do: {:error, "Unexpected type when encoding TopLevel.top_level"}
+
+  def decode_u001_b(value) when is_binary(value), do: value
+  def decode_u001_b(_), do: {:error, "Unexpected type when decoding TopLevel.u001_b"}
+
+  def encode_u001_b(value) when is_binary(value), do: value
+  def encode_u001_b(_), do: {:error, "Unexpected type when encoding TopLevel.u001_b"}
+
+  def from_map(m) do
+    %TopLevel{
+      empty: decode_empty(m[" "]),
+      the_1: decode_the_1(m["😀"]),
+      top_level: decode_top_level(m[""]),
+      u001_b: decode_u001_b(m["\u001b"]),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "\u{0}\u{1}\u{1b}\u{1f}" => struct.empty,
+      "\u{1f600}" => struct.the_1,
+      "\u{7f}\u{80}\u{85}\u{9f}" => struct.top_level,
+      "\\u001b" => struct.u001_b,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex
index d78f11b..dd159fb 100644
--- a/base/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex
@@ -202,6 +202,12 @@ defmodule Pokemon do
   def encode_candy(value) when is_binary(value), do: value
   def encode_candy(_), do: {:error, "Unexpected type when encoding Pokemon.candy"}
 
+  def decode_candy_count(value) when is_integer(value), do: value
+  def decode_candy_count(_), do: {:error, "Unexpected type when decoding Pokemon.candy_count"}
+
+  def encode_candy_count(value) when is_integer(value), do: value
+  def encode_candy_count(_), do: {:error, "Unexpected type when encoding Pokemon.candy_count"}
+
   def decode_height(value) when is_binary(value), do: value
   def decode_height(_), do: {:error, "Unexpected type when decoding Pokemon.height"}
 
@@ -276,7 +282,7 @@ defmodule Pokemon do
     %Pokemon{
       avg_spawns: decode_avg_spawns(m["avg_spawns"]),
       candy: decode_candy(m["candy"]),
-      candy_count: m["candy_count"],
+      candy_count: m["candy_count"] && decode_candy_count(m["candy_count"]),
       egg: Egg.decode(m["egg"]),
       height: decode_height(m["height"]),
       id: decode_id(m["id"]),
diff --git a/base/elm/test/inputs/json/priority/keywords.json/default/QuickType.elm b/head/elm/test/inputs/json/priority/keywords.json/default/QuickType.elm
index 77707ee..7df6f5d 100644
--- a/base/elm/test/inputs/json/priority/keywords.json/default/QuickType.elm
+++ b/head/elm/test/inputs/json/priority/keywords.json/default/QuickType.elm
@@ -237,6 +237,7 @@ module QuickType exposing
     , Rethrows
     , Return
     , Right
+    , S
     , Sbyte
     , Sealed
     , Sel
@@ -1327,6 +1328,7 @@ type alias Obj4 =
     , rethrows : Rethrows
     , return : Return
     , right : Right
+    , s : S
     , sbyte : Sbyte
     , sealed : Sealed
     , sel : Sel
@@ -1462,6 +1464,10 @@ type alias Right =
     { right : Int
     }
 
+type alias S =
+    { s : Int
+    }
+
 type alias Sbyte =
     { sbyte : Int
     }
@@ -4357,6 +4363,7 @@ obj4 =
         |> Jpipe.required "rethrows" rethrows
         |> Jpipe.required "return" return
         |> Jpipe.required "right" right
+        |> Jpipe.required "s" s
         |> Jpipe.required "sbyte" sbyte
         |> Jpipe.required "sealed" sealed
         |> Jpipe.required "SEL" sel
@@ -4426,6 +4433,7 @@ encodeObj4 x =
         , ("rethrows", encodeRethrows x.rethrows)
         , ("return", encodeReturn x.return)
         , ("right", encodeRight x.right)
+        , ("s", encodeS x.s)
         , ("sbyte", encodeSbyte x.sbyte)
         , ("sealed", encodeSealed x.sealed)
         , ("SEL", encodeSel x.sel)
@@ -4722,6 +4730,17 @@ encodeRight x =
         [ ("right", Jenc.int x.right)
         ]
 
+s : Jdec.Decoder S
+s =
+    Jdec.succeed S
+        |> Jpipe.required "s" Jdec.int
+
+encodeS : S -> Jenc.Value
+encodeS x =
+    Jenc.object
+        [ ("s", Jenc.int x.s)
+        ]
+
 sbyte : Jdec.Decoder Sbyte
 sbyte =
     Jdec.succeed Sbyte
diff --git a/head/elm/test/inputs/json/samples/objc-control-characters.json/default/QuickType.elm b/head/elm/test/inputs/json/samples/objc-control-characters.json/default/QuickType.elm
new file mode 100644
index 0000000..1d4cd4b
--- /dev/null
+++ b/head/elm/test/inputs/json/samples/objc-control-characters.json/default/QuickType.elm
@@ -0,0 +1,66 @@
+-- To decode the JSON data, add this file to your project, run
+--
+--     elm install NoRedInk/elm-json-decode-pipeline
+--
+-- add these imports
+--
+--     import Json.Decode exposing (decodeString)
+--     import QuickType exposing (quickType)
+--
+-- and you're off to the races with
+--
+--     decodeString quickType myJsonString
+
+module QuickType exposing
+    ( QuickType
+    , quickTypeToString
+    , quickType
+    )
+
+import Json.Decode as Jdec
+import Json.Decode.Pipeline as Jpipe
+import Json.Encode as Jenc
+import Dict exposing (Dict)
+
+type alias QuickType =
+    { empty : String
+    , purple : String
+    , quickType : String
+    , u001B : String
+    }
+
+-- decoders and encoders
+optionalField key decoder fallback =
+    Jdec.dict Jdec.value
+        |> Jdec.andThen (\m ->
+            case Dict.get key m of
+                Nothing -> Jdec.succeed fallback
+                Just x -> Jdec.decodeValue decoder x |> Result.map Jdec.succeed |> Result.withDefault (Jdec.fail ("Invalid " ++ key)))
+
+quickTypeToString : QuickType -> String
+quickTypeToString r = Jenc.encode 0 (encodeQuickType r)
+
+quickType : Jdec.Decoder QuickType
+quickType =
+    Jdec.succeed QuickType
+        |> Jpipe.required "\u{0000}\u{0001}\u{001B}\u{001F}" Jdec.string
+        |> Jpipe.required "\u{1F600}" Jdec.string
+        |> Jpipe.required "\u{007F}\u{0080}\u{0085}\u{009F}" Jdec.string
+        |> Jpipe.required "\\u001b" Jdec.string
+
+encodeQuickType : QuickType -> Jenc.Value
+encodeQuickType x =
+    Jenc.object
+        [ ("\u{0000}\u{0001}\u{001B}\u{001F}", Jenc.string x.empty)
+        , ("\u{1F600}", Jenc.string x.purple)
+        , ("\u{007F}\u{0080}\u{0085}\u{009F}", Jenc.string x.quickType)
+        , ("\\u001b", Jenc.string x.u001B)
+        ]
+
+--- encoder helpers
+
+makeNullableEncoder : (a -> Jenc.Value) -> Maybe a -> Jenc.Value
+makeNullableEncoder f m =
+    case m of
+    Just x -> f x
+    Nothing -> Jenc.null
diff --git a/base/flow/test/inputs/json/priority/keywords.json/default/TopLevel.js b/head/flow/test/inputs/json/priority/keywords.json/default/TopLevel.js
index fcb98df..276a37b 100644
--- a/base/flow/test/inputs/json/priority/keywords.json/default/TopLevel.js
+++ b/head/flow/test/inputs/json/priority/keywords.json/default/TopLevel.js
@@ -1028,6 +1028,7 @@ export type Obj4 = {
     rethrows:         Rethrows;
     return:           Return;
     right:            Right;
+    s:                S;
     sbyte:            Sbyte;
     sealed:           Sealed;
     select:           Select;
@@ -1157,6 +1158,10 @@ export type Right = {
     right: number;
 };
 
+export type S = {
+    s: number;
+};
+
 export type Sbyte = {
     sbyte: number;
 };
@@ -2438,6 +2443,7 @@ const typeMap: any = {
         { json: "rethrows", js: "rethrows", typ: r("Rethrows") },
         { json: "return", js: "return", typ: r("Return") },
         { json: "right", js: "right", typ: r("Right") },
+        { json: "s", js: "s", typ: r("S") },
         { json: "sbyte", js: "sbyte", typ: r("Sbyte") },
         { json: "sealed", js: "sealed", typ: r("Sealed") },
         { json: "select", js: "select", typ: r("Select") },
@@ -2545,6 +2551,9 @@ const typeMap: any = {
     "Right": o([
         { json: "right", js: "right", typ: i(0) },
     ], false),
+    "S": o([
+        { json: "s", js: "s", typ: i(0) },
+    ], false),
     "Sbyte": o([
         { json: "sbyte", js: "sbyte", typ: i(0) },
     ], false),
diff --git a/head/flow/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.js b/head/flow/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.js
new file mode 100644
index 0000000..0a1a834
--- /dev/null
+++ b/head/flow/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.js
@@ -0,0 +1,215 @@
+// @flow
+
+// To parse this data:
+//
+//   const Convert = require("./TopLevel");
+//
+//   const topLevel = Convert.toTopLevel(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export type TopLevel = {
+    "\u0000\u0001\u001b\u001f": string;
+    "\\u001b":                  string;
+    "\u007f\u0080\u0085\u009f": string;
+    "\ud83d\ude00":             string;
+};
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+function toTopLevel(json: string): TopLevel {
+    return cast(JSON.parse(json), r("TopLevel"));
+}
+
+function topLevelToJson(value: TopLevel): string {
+    return JSON.stringify(uncast(value, r("TopLevel")), null, 2);
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = '') {
+    const prettyTyp = prettyTypeName(typ);
+    const parentText = parent ? ` on ${parent}` : '';
+    const keyText = key ? ` for key "${key}"` : '';
+    throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+    if (Array.isArray(typ)) {
+        if (typ.length === 2 && typ[0] === undefined) {
+            return `an optional ${prettyTypeName(typ[1])}`;
+        } else {
+            return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+        }
+    } else if (typeof typ === "object" && typ.literal !== undefined) {
+        return typ.literal;
+    } else {
+        return typeof typ;
+    }
+}
+
+function jsonToJSProps(typ: any): any {
+    if (typ.jsonToJS === undefined) {
+        const map: any = {};
+        typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+        typ.jsonToJS = map;
+    }
+    return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+    if (typ.jsToJSON === undefined) {
+        const map: any = {};
+        typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+        typ.jsToJSON = map;
+    }
+    return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+    function transformPrimitive(typ: string, val: any): any {
+        if (typeof typ === typeof val) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+
+    function transformUnion(typs: any[], val: any): any {
+        // val must validate against one typ in typs
+        const l = typs.length;
+        for (let i = 0; i < l; i++) {
+            const typ = typs[i];
+            try {
+                return transform(val, typ, getProps);
+            } catch (_) {}
+        }
+        return invalidValue(typs, val, key, parent);
+    }
+
+    function transformEnum(cases: string[], val: any): any {
+        if (cases.indexOf(val) !== -1) return val;
+        return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+    }
+
+    function transformArray(typ: any, val: any): any {
+        // val must be an array with no invalid elements
+        if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+
+        return val.map(el => transform(el, typ, getProps));
+    }
+
+    function transformDate(val: any): any {
+        if (val === null) {
+            return null;
+        }
+        const d = new Date(val);
+        if (isNaN(d.valueOf())) {
+            return invalidValue(l("Date"), val, key, parent);
+        }
+        return d;
+    }
+
+    function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+        if (val === null || typeof val !== "object" || Array.isArray(val)) {
+            return invalidValue(l(ref || "object"), val, key, parent);
+        }
+        const result: any = {};
+        Object.getOwnPropertyNames(props).forEach(key => {
+            const prop = props[key];
+            const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+            result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+        });
+        Object.getOwnPropertyNames(val).forEach(key => {
+            if (!Object.prototype.hasOwnProperty.call(props, key)) {
+                result[key] = transform(val[key], additional, getProps, key, ref);
+            }
+        });
+        return result;
+    }
+
+    if (typ === "any") return val;
+    if (typ === null) {
+        if (val === null) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+    if (typ === false) return invalidValue(typ, val, key, parent);
+    let ref: any = undefined;
+    while (typeof typ === "object" && typ.ref !== undefined) {
+        ref = typ.ref;
+        typ = typeMap[typ.ref];
+    }
+    if (Array.isArray(typ)) return transformEnum(typ, val);
+    if (typeof typ === "object") {
+        return typ.hasOwnProperty("pattern")      ? typeof val === "string" && new RegExp(typ.pattern).test(val) ? val : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("string")       ? typeof val === "string" && (typ.min === undefined || val.length >= typ.min) && (typ.max === undefined || val.length <= typ.max) ? transform(val, typ.string, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("number")       ? typeof val === "number" && (typ.min === undefined || val >= typ.min) && (typ.max === undefined || val <= typ.max) ? transform(val, typ.number, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("integer")      ? typeof val === "number" && val % 1 === 0 ? val : invalidValue(l("integer"), val, key, parent)
+            : typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+            : typ.hasOwnProperty("arrayItems")    ? transformArray(typ.arrayItems, val)
+            : typ.hasOwnProperty("props")         ? transformObject(getProps(typ), typ.additional, val)
+            : invalidValue(typ, val, key, parent);
+    }
+    // Numbers can be parsed by Date but shouldn't be.
+    if (typ === Date && typeof val !== "number") return transformDate(val);
+    return transformPrimitive(typ, val);
+}
+
+function cast<T>(val: any, typ: any): T {
+    return transform(val, typ, jsonToJSProps);
+}
+
+function uncast<T>(val: T, typ: any): any {
+    return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+    return { literal: typ };
+}
+
+function a(typ: any) {
+    return { arrayItems: typ };
+}
+
+function i(typ: any) {
+    return { integer: typ };
+}
+
+function p(pattern: any) {
+    return { pattern };
+}
+
+function s(typ: any, min: any, max: any) {
+    return { string: typ, min, max };
+}
+
+function n(typ: any, min: any, max: any) {
+    return { number: typ, min, max };
+}
+
+function u(...typs: any[]) {
+    return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+    return { props, additional };
+}
+
+function m(additional: any) {
+    const props: any[] = [];
+    return { props, additional };
+}
+
+function r(name: string) {
+    return { ref: name };
+}
+
+const typeMap: any = {
+    "TopLevel": o([
+        { json: "\u0000\u0001\u001b\u001f", js: "\u0000\u0001\u001b\u001f", typ: "" },
+        { json: "\\u001b", js: "\\u001b", typ: "" },
+        { json: "\u007f\u0080\u0085\u009f", js: "\u007f\u0080\u0085\u009f", typ: "" },
+        { json: "\ud83d\ude00", js: "\ud83d\ude00", typ: "" },
+    ], false),
+};
+
+module.exports = {
+    "topLevelToJson": topLevelToJson,
+    "toTopLevel": toTopLevel,
+};
diff --git a/base/golang/test/inputs/json/priority/keywords.json/default/quicktype.go b/head/golang/test/inputs/json/priority/keywords.json/default/quicktype.go
index 500118c..260e9db 100644
--- a/base/golang/test/inputs/json/priority/keywords.json/default/quicktype.go
+++ b/head/golang/test/inputs/json/priority/keywords.json/default/quicktype.go
@@ -1036,6 +1036,7 @@ type Obj4 struct {
 	Rethrows        Rethrows        `json:"rethrows"`
 	Return          Return          `json:"return"`
 	Right           Right           `json:"right"`
+	S               S               `json:"s"`
 	Sbyte           Sbyte           `json:"sbyte"`
 	Sealed          Sealed          `json:"sealed"`
 	Sel             Sel             `json:"SEL"`
@@ -1162,6 +1163,10 @@ type Right struct {
 	Right int64 `json:"right"`
 }
 
+type S struct {
+	S int64 `json:"s"`
+}
+
 type Sbyte struct {
 	Sbyte int64 `json:"sbyte"`
 }
diff --git a/head/golang/test/inputs/json/samples/objc-control-characters.json/default/quicktype.go b/head/golang/test/inputs/json/samples/objc-control-characters.json/default/quicktype.go
new file mode 100644
index 0000000..71e30e3
--- /dev/null
+++ b/head/golang/test/inputs/json/samples/objc-control-characters.json/default/quicktype.go
@@ -0,0 +1,26 @@
+// Code generated from JSON Schema using quicktype. DO NOT EDIT.
+// To parse and unparse this JSON data, add this code to your project and do:
+//
+//    topLevel, err := UnmarshalTopLevel(bytes)
+//    bytes, err = topLevel.Marshal()
+
+package main
+
+import "encoding/json"
+
+func UnmarshalTopLevel(data []byte) (TopLevel, error) {
+	var r TopLevel
+	err := json.Unmarshal(data, &r)
+	return r, err
+}
+
+func (r *TopLevel) Marshal() ([]byte, error) {
+	return json.Marshal(r)
+}
+
+type TopLevel struct {
+	Empty    string `json:"\u0000\u0001\u001b\u001f"`
+	Purple   string `json:"\U0001f600"`
+	TopLevel string `json:"\u007f\u0080\u0085\u009f"`
+	U001B    string `json:"\\u001b"`
+}
diff --git a/base/haskell/test/inputs/json/priority/keywords.json/default/QuickType.hs b/head/haskell/test/inputs/json/priority/keywords.json/default/QuickType.hs
index c0a99ee..7c9af54 100644
--- a/base/haskell/test/inputs/json/priority/keywords.json/default/QuickType.hs
+++ b/head/haskell/test/inputs/json/priority/keywords.json/default/QuickType.hs
@@ -224,6 +224,7 @@ module QuickType
     , Rethrows (..)
     , Return (..)
     , RightClass (..)
+    , S (..)
     , Sbyte (..)
     , Sealed (..)
     , Sel (..)
@@ -1316,6 +1317,7 @@ data Obj4 = Obj4
     , rethrowsObj4 :: Rethrows
     , returnObj4 :: Return
     , rightObj4 :: RightClass
+    , sObj4 :: S
     , sbyteObj4 :: Sbyte
     , sealedObj4 :: Sealed
     , selObj4 :: Sel
@@ -1448,6 +1450,10 @@ data RightClass = RightClass
     { rightRightClass :: Int
     } deriving (Show)
 
+data S = S
+    { sS :: Int
+    } deriving (Show)
+
 data Sbyte = Sbyte
     { sbyteSbyte :: Int
     } deriving (Show)
@@ -4114,7 +4120,7 @@ instance FromJSON Protocol where
         <$> v .: "Protocol"
 
 instance ToJSON Obj4 where
-    toJSON (Obj4 dummyObj4 obj4SelfObj4 obj4ThenObj4 obj4TrueObj4 obj4TypeObj4 publicObj4 purpleTypeObj4 quicktypeObj4 raiseObj4 rangeObj4 readonlyObj4 refObj4 registerObj4 reinterpretCastObj4 repeatObj4 requireObj4 requiredObj4 requiresObj4 restrictObj4 retainObj4 rethrowsObj4 returnObj4 rightObj4 sbyteObj4 sealedObj4 selObj4 selectObj4 selfObj4 serializeObj4 setObj4 shortObj4 signedObj4 sizeofObj4 stackallocObj4 staticObj4 staticAssertObj4 staticCastObj4 strictfpObj4 stringObj4 structObj4 subscriptObj4 superObj4 switchObj4 symbolObj4 synchronizedObj4 systemObj4 templateObj4 thisObj4 threadLocalObj4 throwObj4 throwsObj4 toJSONObj4 topLevelObj4 transientObj4 trueObj4 tryObj4 typealiasObj4 typedefObj4 typeidObj4 typenameObj4 typeofObj4 uintObj4 ulongObj4 uncheckedObj4 undefinedObj4) =
+    toJSON (Obj4 dummyObj4 obj4SelfObj4 obj4ThenObj4 obj4TrueObj4 obj4TypeObj4 publicObj4 purpleTypeObj4 quicktypeObj4 raiseObj4 rangeObj4 readonlyObj4 refObj4 registerObj4 reinterpretCastObj4 repeatObj4 requireObj4 requiredObj4 requiresObj4 restrictObj4 retainObj4 rethrowsObj4 returnObj4 rightObj4 sObj4 sbyteObj4 sealedObj4 selObj4 selectObj4 selfObj4 serializeObj4 setObj4 shortObj4 signedObj4 sizeofObj4 stackallocObj4 staticObj4 staticAssertObj4 staticCastObj4 strictfpObj4 stringObj4 structObj4 subscriptObj4 superObj4 switchObj4 symbolObj4 synchronizedObj4 systemObj4 templateObj4 thisObj4 threadLocalObj4 throwObj4 throwsObj4 toJSONObj4 topLevelObj4 transientObj4 trueObj4 tryObj4 typealiasObj4 typedefObj4 typeidObj4 typenameObj4 typeofObj4 uintObj4 ulongObj4 uncheckedObj4 undefinedObj4) =
         object
         [ "dummy" .= dummyObj4
         , "self" .= obj4SelfObj4
@@ -4139,6 +4145,7 @@ instance ToJSON Obj4 where
         , "rethrows" .= rethrowsObj4
         , "return" .= returnObj4
         , "right" .= rightObj4
+        , "s" .= sObj4
         , "sbyte" .= sbyteObj4
         , "sealed" .= sealedObj4
         , "SEL" .= selObj4
@@ -4208,6 +4215,7 @@ instance FromJSON Obj4 where
         <*> v .: "rethrows"
         <*> v .: "return"
         <*> v .: "right"
+        <*> v .: "s"
         <*> v .: "sbyte"
         <*> v .: "sealed"
         <*> v .: "SEL"
@@ -4471,6 +4479,16 @@ instance FromJSON RightClass where
     parseJSON (Object v) = RightClass
         <$> v .: "right"
 
+instance ToJSON S where
+    toJSON (S sS) =
+        object
+        [ "s" .= sS
+        ]
+
+instance FromJSON S where
+    parseJSON (Object v) = S
+        <$> v .: "s"
+
 instance ToJSON Sbyte where
     toJSON (Sbyte sbyteSbyte) =
         object
diff --git a/head/haskell/test/inputs/json/samples/objc-control-characters.json/default/QuickType.hs b/head/haskell/test/inputs/json/samples/objc-control-characters.json/default/QuickType.hs
new file mode 100644
index 0000000..fee67b3
--- /dev/null
+++ b/head/haskell/test/inputs/json/samples/objc-control-characters.json/default/QuickType.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module QuickType
+    ( QuickType (..)
+    , decodeTopLevel
+    ) where
+
+import Data.Aeson
+import Data.Aeson.Types (emptyObject)
+import Data.ByteString.Lazy (ByteString)
+import Data.HashMap.Strict (HashMap)
+import Data.Text (Text)
+
+data QuickType = QuickType
+    { emptyQuickType :: Text
+    , purpleQuickType :: Text
+    , quickTypeQuickType :: Text
+    , u001BQuickType :: Text
+    } deriving (Show)
+
+decodeTopLevel :: ByteString -> Maybe QuickType
+decodeTopLevel = decode
+
+instance ToJSON QuickType where
+    toJSON (QuickType emptyQuickType purpleQuickType quickTypeQuickType u001BQuickType) =
+        object
+        [ "\x0000\&\x0001\&\x001b\&\x001f\&" .= emptyQuickType
+        , "\x0001f600\&" .= purpleQuickType
+        , "\x007f\&\x0080\&\x0085\&\x009f\&" .= quickTypeQuickType
+        , "\\x001b\&" .= u001BQuickType
+        ]
+
+instance FromJSON QuickType where
+    parseJSON (Object v) = QuickType
+        <$> v .: "\x0000\&\x0001\&\x001b\&\x001f\&"
+        <*> v .: "\x0001f600\&"
+        <*> v .: "\x007f\&\x0080\&\x0085\&\x009f\&"
+        <*> v .: "\\x001b\&"
diff --git a/base/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java b/head/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
index fb5fed6..d8860f6 100644
--- a/base/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
+++ b/head/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
@@ -36,6 +36,7 @@ public class Obj4 {
     private Retain retain;
     private Rethrows rethrows;
     private Right right;
+    private S s;
     private Sbyte sbyte;
     private Sealed sealed;
     private Sel sel;
@@ -234,6 +235,11 @@ public class Obj4 {
     @JsonProperty("right")
     public void setRight(Right value) { this.right = value; }
 
+    @JsonProperty("s")
+    public S getS() { return s; }
+    @JsonProperty("s")
+    public void setS(S value) { this.s = value; }
+
     @JsonProperty("sbyte")
     public Sbyte getSbyte() { return sbyte; }
     @JsonProperty("sbyte")
diff --git a/head/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java b/head/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java
new file mode 100644
index 0000000..d949cd5
--- /dev/null
+++ b/head/java/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java
@@ -0,0 +1,12 @@
+package io.quicktype;
+
+import com.fasterxml.jackson.annotation.*;
+
+public class S {
+    private long s;
+
+    @JsonProperty("s")
+    public long getS() { return s; }
+    @JsonProperty("s")
+    public void setS(long value) { this.s = value; }
+}
diff --git a/head/java/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java b/head/java/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java
new file mode 100644
index 0000000..cf0c886
--- /dev/null
+++ b/head/java/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java
@@ -0,0 +1,102 @@
+// To use this code, add the following Maven dependency to your project:
+//
+//
+//     com.fasterxml.jackson.core     : jackson-databind          : 2.9.0
+//     com.fasterxml.jackson.datatype : jackson-datatype-jsr310   : 2.9.0
+//
+// Import this package:
+//
+//     import io.quicktype.Converter;
+//
+// Then you can deserialize a JSON string with
+//
+//     TopLevel data = Converter.fromJsonString(jsonString);
+
+package io.quicktype;
+
+import java.io.IOException;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import java.util.*;
+import java.time.LocalDate;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.temporal.ChronoField;
+
+public class Converter {
+    // Date-time helpers
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
+            .appendOptional(DateTimeFormatter.ISO_DATE_TIME)
+            .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
+            .appendOptional(DateTimeFormatter.ISO_INSTANT)
+            .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SX"))
+            .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX"))
+            .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+            .toFormatter()
+            .withZone(ZoneOffset.UTC);
+
+    public static OffsetDateTime parseDateTimeString(String str) {
+        return ZonedDateTime.from(Converter.DATE_TIME_FORMATTER.parse(str)).toOffsetDateTime();
+    }
+
+    private static final DateTimeFormatter TIME_FORMATTER = new DateTimeFormatterBuilder()
+            .appendOptional(DateTimeFormatter.ISO_TIME)
+            .appendOptional(DateTimeFormatter.ISO_OFFSET_TIME)
+            .parseDefaulting(ChronoField.YEAR, 2020)
+            .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
+            .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
+            .toFormatter()
+            .withZone(ZoneOffset.UTC);
+
+    public static OffsetTime parseTimeString(String str) {
+        return ZonedDateTime.from(Converter.TIME_FORMATTER.parse(str)).toOffsetDateTime().toOffsetTime();
+    }
+    // Serialize/deserialize helpers
+
+    public static TopLevel fromJsonString(String json) throws IOException {
+        return getObjectReader().readValue(json);
+    }
+
+    public static String toJsonString(TopLevel obj) throws JsonProcessingException {
+        return getObjectWriter().writeValueAsString(obj);
+    }
+
+    private static ObjectReader reader;
+    private static ObjectWriter writer;
+
+    private static void instantiateMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.findAndRegisterModules();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+        SimpleModule module = new SimpleModule();
+        module.addDeserializer(OffsetDateTime.class, new JsonDeserializer<OffsetDateTime>() {
+            @Override
+            public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+                String value = jsonParser.getText();
+                return Converter.parseDateTimeString(value);
+            }
+        });
+        mapper.registerModule(module);
+        reader = mapper.readerFor(TopLevel.class);
+        writer = mapper.writerFor(TopLevel.class);
+    }
+
+    private static ObjectReader getObjectReader() {
+        if (reader == null) instantiateMapper();
+        return reader;
+    }
+
+    private static ObjectWriter getObjectWriter() {
+        if (writer == null) instantiateMapper();
+        return writer;
+    }
+}
diff --git a/head/java/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java b/head/java/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java
new file mode 100644
index 0000000..da9048a
--- /dev/null
+++ b/head/java/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java
@@ -0,0 +1,30 @@
+package io.quicktype;
+
+import com.fasterxml.jackson.annotation.*;
+
+public class TopLevel {
+    private String empty;
+    private String purple;
+    private String topLevel;
+    private String u001B;
+
+    @JsonProperty(" ")
+    public String getEmpty() { return empty; }
+    @JsonProperty(" ")
+    public void setEmpty(String value) { this.empty = value; }
+
+    @JsonProperty("\ud83d\ude00")
+    public String getPurple() { return purple; }
+    @JsonProperty("\ud83d\ude00")
+    public void setPurple(String value) { this.purple = value; }
+
+    @JsonProperty("\u0080\u0085\u009f")
+    public String getTopLevel() { return topLevel; }
+    @JsonProperty("\u0080\u0085\u009f")
+    public void setTopLevel(String value) { this.topLevel = value; }
+
+    @JsonProperty("\\u001b")
+    public String getU001B() { return u001B; }
+    @JsonProperty("\\u001b")
+    public void setU001B(String value) { this.u001B = value; }
+}
diff --git a/base/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java b/head/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
index fb5fed6..d8860f6 100644
--- a/base/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
+++ b/head/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
@@ -36,6 +36,7 @@ public class Obj4 {
     private Retain retain;
     private Rethrows rethrows;
     private Right right;
+    private S s;
     private Sbyte sbyte;
     private Sealed sealed;
     private Sel sel;
@@ -234,6 +235,11 @@ public class Obj4 {
     @JsonProperty("right")
     public void setRight(Right value) { this.right = value; }
 
+    @JsonProperty("s")
+    public S getS() { return s; }
+    @JsonProperty("s")
+    public void setS(S value) { this.s = value; }
+
     @JsonProperty("sbyte")
     public Sbyte getSbyte() { return sbyte; }
     @JsonProperty("sbyte")
diff --git a/head/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java b/head/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java
new file mode 100644
index 0000000..d949cd5
--- /dev/null
+++ b/head/java-datetime-legacy/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java
@@ -0,0 +1,12 @@
+package io.quicktype;
+
+import com.fasterxml.jackson.annotation.*;
+
+public class S {
+    private long s;
+
+    @JsonProperty("s")
+    public long getS() { return s; }
+    @JsonProperty("s")
+    public void setS(long value) { this.s = value; }
+}
diff --git a/head/java-datetime-legacy/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java b/head/java-datetime-legacy/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java
new file mode 100644
index 0000000..322888e
--- /dev/null
+++ b/head/java-datetime-legacy/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java
@@ -0,0 +1,123 @@
+// To use this code, add the following Maven dependency to your project:
+//
+//
+//     com.fasterxml.jackson.core     : jackson-databind          : 2.9.0
+//
+//
+// Import this package:
+//
+//     import io.quicktype.Converter;
+//
+// Then you can deserialize a JSON string with
+//
+//     TopLevel data = Converter.fromJsonString(jsonString);
+
+package io.quicktype;
+
+import java.io.IOException;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import java.util.*;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+
+public class Converter {
+    // Date-time helpers
+
+    private static final String[] DATE_TIME_FORMATS = {
+            "yyyy-MM-dd'T'HH:mm:ss.SX",
+            "yyyy-MM-dd'T'HH:mm:ss.S",
+            "yyyy-MM-dd'T'HH:mm:ssX",
+            "yyyy-MM-dd'T'HH:mm:ss",
+            "yyyy-MM-dd HH:mm:ss.SX",
+            "yyyy-MM-dd HH:mm:ss.S",
+            "yyyy-MM-dd HH:mm:ssX",
+            "yyyy-MM-dd HH:mm:ss",
+            "HH:mm:ss.SZ",
+            "HH:mm:ss.S",
+            "HH:mm:ssZ",
+            "HH:mm:ss",
+            "yyyy-MM-dd",
+    };
+
+    public static Date parseAllDateTimeString(String str) {
+        str = str.replaceFirst("(\\.\\d{3})\\d+", "$1");
+        for (String format : DATE_TIME_FORMATS) {
+            try {
+                return new SimpleDateFormat(format).parse(str);
+            } catch (Exception ex) {
+                // Ignored
+            }
+        }
+        return null;
+    }
+
+    public static String serializeDateTime(Date datetime) {
+        return new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ").format(datetime);
+    }
+
+    public static String serializeDate(Date datetime) {
+        return new SimpleDateFormat("yyyy-MM-dd").format(datetime);
+    }
+
+    public static String serializeTime(Date datetime) {
+        return new SimpleDateFormat("hh:mm:ssZ").format(datetime);
+    }
+    // Serialize/deserialize helpers
+
+    public static TopLevel fromJsonString(String json) throws IOException {
+        return getObjectReader().readValue(json);
+    }
+
+    public static String toJsonString(TopLevel obj) throws JsonProcessingException {
+        return getObjectWriter().writeValueAsString(obj);
+    }
+
+    private static ObjectReader reader;
+    private static ObjectWriter writer;
+
+    private static void instantiateMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.findAndRegisterModules();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+        SimpleModule module = new SimpleModule();
+        module.addDeserializer(Date.class, new JsonDeserializer<Date>() {
+            @Override
+            public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+                String value = jsonParser.getText();
+                return Converter.parseAllDateTimeString(value);
+            }
+        });
+        module.addDeserializer(Date.class, new JsonDeserializer<Date>() {
+            @Override
+            public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+                String value = jsonParser.getText();
+                return Converter.parseAllDateTimeString(value);
+            }
+        });
+        module.addDeserializer(Date.class, new JsonDeserializer<Date>() {
+            @Override
+            public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+                String value = jsonParser.getText();
+                return Converter.parseAllDateTimeString(value);
+            }
+        });
+        mapper.registerModule(module);
+        reader = mapper.readerFor(TopLevel.class);
+        writer = mapper.writerFor(TopLevel.class);
+    }
+
+    private static ObjectReader getObjectReader() {
+        if (reader == null) instantiateMapper();
+        return reader;
+    }
+
+    private static ObjectWriter getObjectWriter() {
+        if (writer == null) instantiateMapper();
+        return writer;
+    }
+}
diff --git a/head/java-datetime-legacy/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java b/head/java-datetime-legacy/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java
new file mode 100644
index 0000000..da9048a
--- /dev/null
+++ b/head/java-datetime-legacy/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java
@@ -0,0 +1,30 @@
+package io.quicktype;
+
+import com.fasterxml.jackson.annotation.*;
+
+public class TopLevel {
+    private String empty;
+    private String purple;
+    private String topLevel;
+    private String u001B;
+
+    @JsonProperty(" ")
+    public String getEmpty() { return empty; }
+    @JsonProperty(" ")
+    public void setEmpty(String value) { this.empty = value; }
+
+    @JsonProperty("\ud83d\ude00")
+    public String getPurple() { return purple; }
+    @JsonProperty("\ud83d\ude00")
+    public void setPurple(String value) { this.purple = value; }
+
+    @JsonProperty("\u0080\u0085\u009f")
+    public String getTopLevel() { return topLevel; }
+    @JsonProperty("\u0080\u0085\u009f")
+    public void setTopLevel(String value) { this.topLevel = value; }
+
+    @JsonProperty("\\u001b")
+    public String getU001B() { return u001B; }
+    @JsonProperty("\\u001b")
+    public void setU001B(String value) { this.u001B = value; }
+}
diff --git a/base/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java b/head/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
index fb5fed6..d8860f6 100644
--- a/base/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
+++ b/head/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/Obj4.java
@@ -36,6 +36,7 @@ public class Obj4 {
     private Retain retain;
     private Rethrows rethrows;
     private Right right;
+    private S s;
     private Sbyte sbyte;
     private Sealed sealed;
     private Sel sel;
@@ -234,6 +235,11 @@ public class Obj4 {
     @JsonProperty("right")
     public void setRight(Right value) { this.right = value; }
 
+    @JsonProperty("s")
+    public S getS() { return s; }
+    @JsonProperty("s")
+    public void setS(S value) { this.s = value; }
+
     @JsonProperty("sbyte")
     public Sbyte getSbyte() { return sbyte; }
     @JsonProperty("sbyte")
diff --git a/head/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java b/head/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java
new file mode 100644
index 0000000..d949cd5
--- /dev/null
+++ b/head/java-lombok/test/inputs/json/priority/keywords.json/default/src/main/java/io/quicktype/S.java
@@ -0,0 +1,12 @@
+package io.quicktype;
+
+import com.fasterxml.jackson.annotation.*;
+
+public class S {
+    private long s;
+
+    @JsonProperty("s")
+    public long getS() { return s; }
+    @JsonProperty("s")
+    public void setS(long value) { this.s = value; }
+}
diff --git a/head/java-lombok/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java b/head/java-lombok/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java
new file mode 100644
index 0000000..cf0c886
--- /dev/null
+++ b/head/java-lombok/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/Converter.java
@@ -0,0 +1,102 @@
+// To use this code, add the following Maven dependency to your project:
+//
+//
+//     com.fasterxml.jackson.core     : jackson-databind          : 2.9.0
+//     com.fasterxml.jackson.datatype : jackson-datatype-jsr310   : 2.9.0
+//
+// Import this package:
+//
+//     import io.quicktype.Converter;
+//
+// Then you can deserialize a JSON string with
+//
+//     TopLevel data = Converter.fromJsonString(jsonString);
+
+package io.quicktype;
+
+import java.io.IOException;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import java.util.*;
+import java.time.LocalDate;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.temporal.ChronoField;
+
+public class Converter {
+    // Date-time helpers
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
+            .appendOptional(DateTimeFormatter.ISO_DATE_TIME)
+            .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
+            .appendOptional(DateTimeFormatter.ISO_INSTANT)
+            .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SX"))
+            .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX"))
+            .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+            .toFormatter()
+            .withZone(ZoneOffset.UTC);
+
+    public static OffsetDateTime parseDateTimeString(String str) {
+        return ZonedDateTime.from(Converter.DATE_TIME_FORMATTER.parse(str)).toOffsetDateTime();
+    }
+
+    private static final DateTimeFormatter TIME_FORMATTER = new DateTimeFormatterBuilder()
+            .appendOptional(DateTimeFormatter.ISO_TIME)
+            .appendOptional(DateTimeFormatter.ISO_OFFSET_TIME)
+            .parseDefaulting(ChronoField.YEAR, 2020)
+            .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
+            .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
+            .toFormatter()
+            .withZone(ZoneOffset.UTC);
+
+    public static OffsetTime parseTimeString(String str) {
+        return ZonedDateTime.from(Converter.TIME_FORMATTER.parse(str)).toOffsetDateTime().toOffsetTime();
+    }
+    // Serialize/deserialize helpers
+
+    public static TopLevel fromJsonString(String json) throws IOException {
+        return getObjectReader().readValue(json);
+    }
+
+    public static String toJsonString(TopLevel obj) throws JsonProcessingException {
+        return getObjectWriter().writeValueAsString(obj);
+    }
+
+    private static ObjectReader reader;
+    private static ObjectWriter writer;
+
+    private static void instantiateMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.findAndRegisterModules();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+        SimpleModule module = new SimpleModule();
+        module.addDeserializer(OffsetDateTime.class, new JsonDeserializer<OffsetDateTime>() {
+            @Override
+            public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+                String value = jsonParser.getText();
+                return Converter.parseDateTimeString(value);
+            }
+        });
+        mapper.registerModule(module);
+        reader = mapper.readerFor(TopLevel.class);
+        writer = mapper.writerFor(TopLevel.class);
+    }
+
+    private static ObjectReader getObjectReader() {
+        if (reader == null) instantiateMapper();
+        return reader;
+    }
+
+    private static ObjectWriter getObjectWriter() {
+        if (writer == null) instantiateMapper();
+        return writer;
+    }
+}
diff --git a/head/java-lombok/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java b/head/java-lombok/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java
new file mode 100644
index 0000000..da9048a
--- /dev/null
+++ b/head/java-lombok/test/inputs/json/samples/objc-control-characters.json/default/src/main/java/io/quicktype/TopLevel.java
@@ -0,0 +1,30 @@
+package io.quicktype;
+
+import com.fasterxml.jackson.annotation.*;
+
+public class TopLevel {
+    private String empty;
+    private String purple;
+    private String topLevel;
+    private String u001B;
+
+    @JsonProperty(" ")
+    public String getEmpty() { return empty; }
+    @JsonProperty(" ")
+    public void setEmpty(String value) { this.empty = value; }
+
+    @JsonProperty("\ud83d\ude00")
+    public String getPurple() { return purple; }
+    @JsonProperty("\ud83d\ude00")
+    public void setPurple(String value) { this.purple = value; }
+
+    @JsonProperty("\u0080\u0085\u009f")
+    public String getTopLevel() { return topLevel; }
+    @JsonProperty("\u0080\u0085\u009f")
+    public void setTopLevel(String value) { this.topLevel = value; }
+
+    @JsonProperty("\\u001b")
+    public String getU001B() { return u001B; }
+    @JsonProperty("\\u001b")
+    public void setU001B(String value) { this.u001B = value; }
+}
diff --git a/base/javascript/test/inputs/json/priority/keywords.json/default/TopLevel.js b/head/javascript/test/inputs/json/priority/keywords.json/default/TopLevel.js
index a07148f..cbfaf42 100644
--- a/base/javascript/test/inputs/json/priority/keywords.json/default/TopLevel.js
+++ b/head/javascript/test/inputs/json/priority/keywords.json/default/TopLevel.js
@@ -1012,6 +1012,7 @@ const typeMap = {
         { json: "rethrows", js: "rethrows", typ: r("Rethrows") },
         { json: "return", js: "return", typ: r("Return") },
         { json: "right", js: "right", typ: r("Right") },
+        { json: "s", js: "s", typ: r("S") },
         { json: "sbyte", js: "sbyte", typ: r("Sbyte") },
         { json: "sealed", js: "sealed", typ: r("Sealed") },
         { json: "select", js: "select", typ: r("Select") },
@@ -1119,6 +1120,9 @@ const typeMap = {
     "Right": o([
         { json: "right", js: "right", typ: i(0) },
     ], false),
+    "S": o([
+        { json: "s", js: "s", typ: i(0) },
+    ], false),
     "Sbyte": o([
         { json: "sbyte", js: "sbyte", typ: i(0) },
     ], false),
diff --git a/head/javascript/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.js b/head/javascript/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.js
new file mode 100644
index 0000000..17e7ea6
--- /dev/null
+++ b/head/javascript/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.js
@@ -0,0 +1,206 @@
+// To parse this data:
+//
+//   const Convert = require("./TopLevel");
+//
+//   const topLevel = Convert.toTopLevel(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+function toTopLevel(json) {
+    return cast(JSON.parse(json), r("TopLevel"));
+}
+
+function topLevelToJson(value) {
+    return JSON.stringify(uncast(value, r("TopLevel")), null, 2);
+}
+
+function invalidValue(typ, val, key, parent = '') {
+    const prettyTyp = prettyTypeName(typ);
+    const parentText = parent ? ` on ${parent}` : '';
+    const keyText = key ? ` for key "${key}"` : '';
+    throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ) {
+    if (Array.isArray(typ)) {
+        if (typ.length === 2 && typ[0] === undefined) {
+            return `an optional ${prettyTypeName(typ[1])}`;
+        } else {
+            return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+        }
+    } else if (typeof typ === "object" && typ.literal !== undefined) {
+        return typ.literal;
+    } else {
+        return typeof typ;
+    }
+}
+
+function jsonToJSProps(typ) {
+    if (typ.jsonToJS === undefined) {
+        const map = {};
+        typ.props.forEach((p) => map[p.json] = { key: p.js, typ: p.typ });
+        typ.jsonToJS = map;
+    }
+    return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ) {
+    if (typ.jsToJSON === undefined) {
+        const map = {};
+        typ.props.forEach((p) => map[p.js] = { key: p.json, typ: p.typ });
+        typ.jsToJSON = map;
+    }
+    return typ.jsToJSON;
+}
+
+function transform(val, typ, getProps, key = '', parent = '') {
+    function transformPrimitive(typ, val) {
+        if (typeof typ === typeof val) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+
+    function transformUnion(typs, val) {
+        // val must validate against one typ in typs
+        const l = typs.length;
+        for (let i = 0; i < l; i++) {
+            const typ = typs[i];
+            try {
+                return transform(val, typ, getProps);
+            } catch (_) {}
+        }
+        return invalidValue(typs, val, key, parent);
+    }
+
+    function transformEnum(cases, val) {
+        if (cases.indexOf(val) !== -1) return val;
+        return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+    }
+
+    function transformArray(typ, val) {
+        // val must be an array with no invalid elements
+        if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+
+        return val.map(el => transform(el, typ, getProps));
+    }
+
+    function transformDate(val) {
+        if (val === null) {
+            return null;
+        }
+        const d = new Date(val);
+        if (isNaN(d.valueOf())) {
+            return invalidValue(l("Date"), val, key, parent);
+        }
+        return d;
+    }
+
+    function transformObject(props, additional, val) {
+        if (val === null || typeof val !== "object" || Array.isArray(val)) {
+            return invalidValue(l(ref || "object"), val, key, parent);
+        }
+        const result = {};
+        Object.getOwnPropertyNames(props).forEach(key => {
+            const prop = props[key];
+            const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+            result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+        });
+        Object.getOwnPropertyNames(val).forEach(key => {
+            if (!Object.prototype.hasOwnProperty.call(props, key)) {
+                result[key] = transform(val[key], additional, getProps, key, ref);
+            }
+        });
+        return result;
+    }
+
+    if (typ === "any") return val;
+    if (typ === null) {
+        if (val === null) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+    if (typ === false) return invalidValue(typ, val, key, parent);
+    let ref = undefined;
+    while (typeof typ === "object" && typ.ref !== undefined) {
+        ref = typ.ref;
+        typ = typeMap[typ.ref];
+    }
+    if (Array.isArray(typ)) return transformEnum(typ, val);
+    if (typeof typ === "object") {
+        return typ.hasOwnProperty("pattern")      ? typeof val === "string" && new RegExp(typ.pattern).test(val) ? val : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("string")       ? typeof val === "string" && (typ.min === undefined || val.length >= typ.min) && (typ.max === undefined || val.length <= typ.max) ? transform(val, typ.string, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("number")       ? typeof val === "number" && (typ.min === undefined || val >= typ.min) && (typ.max === undefined || val <= typ.max) ? transform(val, typ.number, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("integer")      ? typeof val === "number" && val % 1 === 0 ? val : invalidValue(l("integer"), val, key, parent)
+            : typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+            : typ.hasOwnProperty("arrayItems")    ? transformArray(typ.arrayItems, val)
+            : typ.hasOwnProperty("props")         ? transformObject(getProps(typ), typ.additional, val)
+            : invalidValue(typ, val, key, parent);
+    }
+    // Numbers can be parsed by Date but shouldn't be.
+    if (typ === Date && typeof val !== "number") return transformDate(val);
+    return transformPrimitive(typ, val);
+}
+
+function cast(val, typ) {
+    return transform(val, typ, jsonToJSProps);
+}
+
+function uncast(val, typ) {
+    return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ) {
+    return { literal: typ };
+}
+
+function a(typ) {
+    return { arrayItems: typ };
+}
+
+function i(typ) {
+    return { integer: typ };
+}
+
+function p(pattern) {
+    return { pattern };
+}
+
+function s(typ, min, max) {
+    return { string: typ, min, max };
+}
+
+function n(typ, min, max) {
+    return { number: typ, min, max };
+}
+
+function u(...typs) {
+    return { unionMembers: typs };
+}
+
+function o(props, additional) {
+    return { props, additional };
+}
+
+function m(additional) {
+    const props = [];
+    return { props, additional };
+}
+
+function r(name) {
+    return { ref: name };
+}
+
+const typeMap = {
+    "TopLevel": o([
+        { json: "\u0000\u0001\u001b\u001f", js: "\u0000\u0001\u001b\u001f", typ: "" },
+        { json: "\\u001b", js: "\\u001b", typ: "" },
+        { json: "\u007f\u0080\u0085\u009f", js: "\u007f\u0080\u0085\u009f", typ: "" },
+        { json: "\ud83d\ude00", js: "\ud83d\ude00", typ: "" },
+    ], false),
+};
+
+module.exports = {
+    "topLevelToJson": topLevelToJson,
+    "toTopLevel": toTopLevel,
+};
diff --git a/base/javascript-prop-types/test/inputs/json/priority/keywords.json/default/toplevel.js b/head/javascript-prop-types/test/inputs/json/priority/keywords.json/default/toplevel.js
index f20178d..e00479f 100644
--- a/base/javascript-prop-types/test/inputs/json/priority/keywords.json/default/toplevel.js
+++ b/head/javascript-prop-types/test/inputs/json/priority/keywords.json/default/toplevel.js
@@ -234,6 +234,7 @@ let _Retain;
 let _Rethrows;
 let _Return;
 let _Right;
+let _S;
 let _Sbyte;
 let _Sealed;
 let _Select;
@@ -1150,6 +1151,9 @@ _Return = PropTypes.shape({
 _Right = PropTypes.shape({
     "right": PropTypes.oneOfType([Integer]).isRequired,
 });
+_S = PropTypes.shape({
+    "s": PropTypes.oneOfType([Integer]).isRequired,
+});
 _Sbyte = PropTypes.shape({
     "sbyte": PropTypes.oneOfType([Integer]).isRequired,
 });
@@ -1302,6 +1306,7 @@ _Obj4 = PropTypes.shape({
     "rethrows": _Rethrows,
     "return": _Return,
     "right": _Right,
+    "s": _S,
     "sbyte": _Sbyte,
     "sealed": _Sealed,
     "select": _Select,
diff --git a/head/javascript-prop-types/test/inputs/json/samples/objc-control-characters.json/default/toplevel.js b/head/javascript-prop-types/test/inputs/json/samples/objc-control-characters.json/default/toplevel.js
new file mode 100644
index 0000000..c1e00ac
--- /dev/null
+++ b/head/javascript-prop-types/test/inputs/json/samples/objc-control-characters.json/default/toplevel.js
@@ -0,0 +1,23 @@
+// Example usage:
+//
+// import { MyShape } from ./myShape.js;
+//
+// class MyComponent extends React.Component {
+//   //
+// }
+//
+// MyComponent.propTypes = {
+//   input: MyShape
+// };
+
+import PropTypes from "prop-types";
+
+let _TopLevel;
+_TopLevel = PropTypes.shape({
+    "\u0000\u0001\u001b\u001f": PropTypes.oneOfType([PropTypes.string]).isRequired,
+    "\\u001b": PropTypes.oneOfType([PropTypes.string]).isRequired,
+    "\u007f\u0080\u0085\u009f": PropTypes.oneOfType([PropTypes.string]).isRequired,
+    "\ud83d\ude00": PropTypes.oneOfType([PropTypes.string]).isRequired,
+});
+
+export const TopLevel = _TopLevel;
diff --git a/base/kotlin/test/inputs/json/priority/keywords.json/default/TopLevel.kt b/head/kotlin/test/inputs/json/priority/keywords.json/default/TopLevel.kt
index c059c6f..250ed16 100644
--- a/base/kotlin/test/inputs/json/priority/keywords.json/default/TopLevel.kt
+++ b/head/kotlin/test/inputs/json/priority/keywords.json/default/TopLevel.kt
@@ -1247,6 +1247,7 @@ data class Obj4 (
     val retain: Retain,
     val rethrows: Rethrows,
     val right: Right,
+    val s: S,
     val sbyte: Sbyte,
     val sealed: Sealed,
 
@@ -1426,6 +1427,10 @@ data class Right (
     val right: Long
 )
 
+data class S (
+    val s: Long
+)
+
 data class Sbyte (
     val sbyte: Long
 )
diff --git a/head/kotlin/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt b/head/kotlin/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt
new file mode 100644
index 0000000..02d617a
--- /dev/null
+++ b/head/kotlin/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt
@@ -0,0 +1,29 @@
+// To parse the JSON, install Klaxon and do:
+//
+//   val topLevel = TopLevel.fromJson(jsonString)
+
+package quicktype
+
+import com.beust.klaxon.*
+
+private val klaxon = Klaxon()
+
+data class TopLevel (
+    @Json(name = "\u0000\u0001\u001b\u001f")
+    val empty: String,
+
+    @Json(name = "\ud83d\ude00")
+    val purple: String,
+
+    @Json(name = "\u007f\u0080\u0085\u009f")
+    val topLevel: String,
+
+    @Json(name = "\\u001b")
+    val u001B: String
+) {
+    public fun toJson() = klaxon.toJsonString(this)
+
+    companion object {
+        public fun fromJson(json: String) = klaxon.parse<TopLevel>(json)
+    }
+}
diff --git a/base/kotlin-jackson/test/inputs/json/priority/keywords.json/default/TopLevel.kt b/head/kotlin-jackson/test/inputs/json/priority/keywords.json/default/TopLevel.kt
index ab3695c..d41f7a7 100644
--- a/base/kotlin-jackson/test/inputs/json/priority/keywords.json/default/TopLevel.kt
+++ b/head/kotlin-jackson/test/inputs/json/priority/keywords.json/default/TopLevel.kt
@@ -1705,6 +1705,9 @@ data class Obj4 (
     @get:JsonProperty(required=true)@field:JsonProperty(required=true)
     val right: Right,
 
+    @get:JsonProperty(required=true)@field:JsonProperty(required=true)
+    val s: S,
+
     @get:JsonProperty(required=true)@field:JsonProperty(required=true)
     val sbyte: Sbyte,
 
@@ -1952,6 +1955,11 @@ data class Right (
     val right: Long
 )
 
+data class S (
+    @get:JsonProperty(required=true)@field:JsonProperty(required=true)
+    val s: Long
+)
+
 data class Sbyte (
     @get:JsonProperty(required=true)@field:JsonProperty(required=true)
     val sbyte: Long
diff --git a/head/kotlin-jackson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt b/head/kotlin-jackson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt
new file mode 100644
index 0000000..be7a0dd
--- /dev/null
+++ b/head/kotlin-jackson/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt
@@ -0,0 +1,39 @@
+// To parse the JSON, install jackson-module-kotlin and do:
+//
+//   val topLevel = TopLevel.fromJson(jsonString)
+
+package quicktype
+
+import com.fasterxml.jackson.annotation.*
+import com.fasterxml.jackson.core.*
+import com.fasterxml.jackson.databind.*
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer
+import com.fasterxml.jackson.databind.module.SimpleModule
+import com.fasterxml.jackson.databind.node.*
+import com.fasterxml.jackson.databind.ser.std.StdSerializer
+import com.fasterxml.jackson.module.kotlin.*
+
+val mapper = jacksonObjectMapper().apply {
+    propertyNamingStrategy = object : PropertyNamingStrategy.PropertyNamingStrategyBase() { override fun translate(name: String) = if (name == "empty") "" else name }
+    setSerializationInclusion(JsonInclude.Include.NON_NULL)
+}
+
+data class TopLevel (
+    @get:JsonProperty("\u0000\u0001\u001b\u001f", required=true)@field:JsonProperty("\u0000\u0001\u001b\u001f", required=true)
+    val empty: String,
+
+    @get:JsonProperty("\ud83d\ude00", required=true)@field:JsonProperty("\ud83d\ude00", required=true)
+    val purple: String,
+
+    @get:JsonProperty("\u007f\u0080\u0085\u009f", required=true)@field:JsonProperty("\u007f\u0080\u0085\u009f", required=true)
+    val topLevel: String,
+
+    @get:JsonProperty("\\u001b", required=true)@field:JsonProperty("\\u001b", required=true)
+    val u001B: String
+) {
+    fun toJson() = mapper.writeValueAsString(this)
+
+    companion object {
+        fun fromJson(json: String) = mapper.readValue<TopLevel>(json)
+    }
+}
diff --git a/base/kotlinx/test/inputs/json/priority/keywords.json/default/TopLevel.kt b/head/kotlinx/test/inputs/json/priority/keywords.json/default/TopLevel.kt
index 0c822b1..c0ac134 100644
--- a/base/kotlinx/test/inputs/json/priority/keywords.json/default/TopLevel.kt
+++ b/head/kotlinx/test/inputs/json/priority/keywords.json/default/TopLevel.kt
@@ -1443,6 +1443,7 @@ data class Obj4 (
     val retain: Retain,
     val rethrows: Rethrows,
     val right: Right,
+    val s: S,
     val sbyte: Sbyte,
     val sealed: Sealed,
 
@@ -1649,6 +1650,11 @@ data class Right (
     val right: Long
 )
 
+@Serializable
+data class S (
+    val s: Long
+)
+
 @Serializable
 data class Sbyte (
     val sbyte: Long
diff --git a/head/kotlinx/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt b/head/kotlinx/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt
new file mode 100644
index 0000000..e001596
--- /dev/null
+++ b/head/kotlinx/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.kt
@@ -0,0 +1,26 @@
+// To parse the JSON, install kotlin's serialization plugin and do:
+//
+// val json     = Json { allowStructuredMapKeys = true }
+// val topLevel = json.parse(TopLevel.serializer(), jsonString)
+
+package quicktype
+
+import kotlinx.serialization.*
+import kotlinx.serialization.json.*
+import kotlinx.serialization.descriptors.*
+import kotlinx.serialization.encoding.*
+
+@Serializable
+data class TopLevel (
+    @SerialName("\u0000\u0001\u001b\u001f")
+    val empty: String,
+
+    @SerialName("\ud83d\ude00")
+    val purple: String,
+
+    @SerialName("\u007f\u0080\u0085\u009f")
+    val topLevel: String,
+
+    @SerialName("\\u001b")
+    val u001B: String
+)
diff --git a/base/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.h b/head/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.h
index cba566c..9c4b79d 100644
--- a/base/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.h
+++ b/head/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.h
@@ -233,6 +233,7 @@
 @class QTRequires;
 @class QTRethrows;
 @class QTRight;
+@class QTS;
 @class QTSbyte;
 @class QTSealed;
 @class QTSel;
@@ -1333,6 +1334,7 @@ NSString   *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding en
 @property (nonatomic, strong) QTRequires *requires;
 @property (nonatomic, strong) QTRethrows *rethrows;
 @property (nonatomic, strong) QTRight *right;
+@property (nonatomic, strong) QTS *s;
 @property (nonatomic, strong) QTSbyte *sbyte;
 @property (nonatomic, strong) QTSealed *sealed;
 @property (nonatomic, strong) QTSel *sel;
@@ -1483,6 +1485,10 @@ NSString   *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding en
 @property (nonatomic, assign) NSInteger right;
 @end
 
+@interface QTS : NSObject
+@property (nonatomic, assign) NSInteger s;
+@end
+
 @interface QTSbyte : NSObject
 @property (nonatomic, assign) NSInteger sbyte;
 @end
diff --git a/base/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m
index 9c3d8bf..4e4d813 100644
--- a/base/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m
@@ -1148,6 +1148,11 @@ NS_ASSUME_NONNULL_BEGIN
 - (NSDictionary *)JSONDictionary;
 @end
 
+@interface QTS (JSONConversion)
++ (instancetype)fromJSONDictionary:(NSDictionary *)dict;
+- (NSDictionary *)JSONDictionary;
+@end
+
 @interface QTSbyte (JSONConversion)
 + (instancetype)fromJSONDictionary:(NSDictionary *)dict;
 - (NSDictionary *)JSONDictionary;
@@ -11565,6 +11570,7 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         @"requires": @"requires",
         @"rethrows": @"rethrows",
         @"right": @"right",
+        @"s": @"s",
         @"sbyte": @"sbyte",
         @"sealed": @"sealed",
         @"SEL": @"sel",
@@ -11642,6 +11648,7 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"requires"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"rethrows"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"right"] isKindOfClass:NSDictionary.class]) return nil;
+        if (![dict[@"s"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"sbyte"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"sealed"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"SEL"] isKindOfClass:NSDictionary.class]) return nil;
@@ -11735,6 +11742,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!_rethrows && dict[@"rethrows"] && ![dict[@"rethrows"] isKindOfClass:NSNull.class]) return nil;
         _right = [QTRight fromJSONDictionary:(id)_right];
         if (!_right && dict[@"right"] && ![dict[@"right"] isKindOfClass:NSNull.class]) return nil;
+        _s = [QTS fromJSONDictionary:(id)_s];
+        if (!_s && dict[@"s"] && ![dict[@"s"] isKindOfClass:NSNull.class]) return nil;
         _sbyte = [QTSbyte fromJSONDictionary:(id)_sbyte];
         if (!_sbyte && dict[@"sbyte"] && ![dict[@"sbyte"] isKindOfClass:NSNull.class]) return nil;
         _sealed = [QTSealed fromJSONDictionary:(id)_sealed];
@@ -11864,6 +11873,7 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         @"requires": [_requires JSONDictionary],
         @"rethrows": [_rethrows JSONDictionary],
         @"right": [_right JSONDictionary],
+        @"s": [_s JSONDictionary],
         @"sbyte": [_sbyte JSONDictionary],
         @"sealed": [_sealed JSONDictionary],
         @"SEL": [_sel JSONDictionary],
@@ -13222,6 +13232,48 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 }
 @end
 
+@implementation QTS
++ (NSDictionary<NSString *, NSString *> *)properties
+{
+    static NSDictionary<NSString *, NSString *> *properties;
+    return properties = properties ? properties : @{
+        @"s": @"s",
+    };
+}
+
++ (instancetype)fromJSONDictionary:(NSDictionary *)dict
+{
+    return [dict isKindOfClass:NSDictionary.class] ? [[QTS alloc] initWithJSONDictionary:dict] : nil;
+}
+
+- (instancetype)initWithJSONDictionary:(NSDictionary *)dict
+{
+    if (self = [super init]) {
+        if (![dict[@"s"] isKindOfClass:NSNumber.class]) return nil;
+        if ([dict[@"s"] doubleValue] != [dict[@"s"] longLongValue]) return nil;
+        [self setValuesForKeysWithDictionary:dict];
+    }
+    return self;
+}
+
+- (void)setValue:(nullable id)value forKey:(NSString *)key
+{
+    id resolved = QTS.properties[key];
+    if (resolved) [super setValue:value forKey:resolved];
+}
+
+- (void)setNilValueForKey:(NSString *)key
+{
+    id resolved = QTS.properties[key];
+    if (resolved) [super setValue:@(0) forKey:resolved];
+}
+
+- (NSDictionary *)JSONDictionary
+{
+    return [self dictionaryWithValuesForKeys:QTS.properties.allValues];
+}
+@end
+
 @implementation QTSbyte
 + (NSDictionary<NSString *, NSString *> *)properties
 {
diff --git a/head/objective-c/test/inputs/json/samples/objc-control-characters.json/default/QTTopLevel.h b/head/objective-c/test/inputs/json/samples/objc-control-characters.json/default/QTTopLevel.h
new file mode 100644
index 0000000..dee00b3
--- /dev/null
+++ b/head/objective-c/test/inputs/json/samples/objc-control-characters.json/default/QTTopLevel.h
@@ -0,0 +1,33 @@
+// To parse this JSON:
+//
+//   NSError *error;
+//   QTTopLevel *topLevel = [QTTopLevel fromJSON:json encoding:NSUTF8Encoding error:&error];
+
+#import <Foundation/Foundation.h>
+
+@class QTTopLevel;
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark - Top-level marshaling functions
+
+QTTopLevel *_Nullable QTTopLevelFromData(NSData *data, NSError **error);
+QTTopLevel *_Nullable QTTopLevelFromJSON(NSString *json, NSStringEncoding encoding, NSError **error);
+NSData     *_Nullable QTTopLevelToData(QTTopLevel *topLevel, NSError **error);
+NSString   *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding encoding, NSError **error);
+
+#pragma mark - Object interfaces
+
+@interface QTTopLevel : NSObject
+@property (nonatomic, copy) NSString *empty;
+@property (nonatomic, copy) NSString *qtTopLevel;
+@property (nonatomic, copy) NSString *the;
+@property (nonatomic, copy) NSString *u001B;
+
++ (_Nullable instancetype)fromJSON:(NSString *)json encoding:(NSStringEncoding)encoding error:(NSError *_Nullable *)error;
++ (_Nullable instancetype)fromData:(NSData *)data error:(NSError *_Nullable *)error;
+- (NSString *_Nullable)toJSON:(NSStringEncoding)encoding error:(NSError *_Nullable *)error;
+- (NSData *_Nullable)toData:(NSError *_Nullable *)error;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/head/objective-c/test/inputs/json/samples/objc-control-characters.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/samples/objc-control-characters.json/default/QTTopLevel.m
new file mode 100644
index 0000000..3862306
--- /dev/null
+++ b/head/objective-c/test/inputs/json/samples/objc-control-characters.json/default/QTTopLevel.m
@@ -0,0 +1,129 @@
+#import "QTTopLevel.h"
+
+#define λ(decl, expr) (^(decl) { return (expr); })
+
+static id NSNullify(id _Nullable x) {
+    return (x == nil || x == NSNull.null) ? NSNull.null : x;
+}
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface QTTopLevel (JSONConversion)
++ (instancetype)fromJSONDictionary:(NSDictionary *)dict;
+- (NSDictionary *)JSONDictionary;
+@end
+
+#pragma mark - JSON serialization
+
+QTTopLevel *_Nullable QTTopLevelFromData(NSData *data, NSError **error)
+{
+    @try {
+        id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:error];
+        return *error ? nil : [QTTopLevel fromJSONDictionary:json];
+    } @catch (NSException *exception) {
+        *error = [NSError errorWithDomain:@"JSONSerialization" code:-1 userInfo:@{ @"exception": exception }];
+        return nil;
+    }
+}
+
+QTTopLevel *_Nullable QTTopLevelFromJSON(NSString *json, NSStringEncoding encoding, NSError **error)
+{
+    return QTTopLevelFromData([json dataUsingEncoding:encoding], error);
+}
+
+NSData *_Nullable QTTopLevelToData(QTTopLevel *topLevel, NSError **error)
+{
+    @try {
+        id json = [topLevel JSONDictionary];
+        NSData *data = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingFragmentsAllowed error:error];
+        return *error ? nil : data;
+    } @catch (NSException *exception) {
+        *error = [NSError errorWithDomain:@"JSONSerialization" code:-1 userInfo:@{ @"exception": exception }];
+        return nil;
+    }
+}
+
+NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding encoding, NSError **error)
+{
+    NSData *data = QTTopLevelToData(topLevel, error);
+    return data ? [[NSString alloc] initWithData:data encoding:encoding] : nil;
+}
+
+@implementation QTTopLevel
++ (NSDictionary<NSString *, NSString *> *)properties
+{
+    static NSDictionary<NSString *, NSString *> *properties;
+    return properties = properties ? properties : @{
+        @"\000\001\033\037": @"empty",
+        @"\177\302\200\302\205\302\237": @"qtTopLevel",
+        @"\U0001f600": @"the",
+        @"\\u001b": @"u001B",
+    };
+}
+
++ (_Nullable instancetype)fromData:(NSData *)data error:(NSError *_Nullable *)error
+{
+    return QTTopLevelFromData(data, error);
+}
+
++ (_Nullable instancetype)fromJSON:(NSString *)json encoding:(NSStringEncoding)encoding error:(NSError *_Nullable *)error
+{
+    return QTTopLevelFromJSON(json, encoding, error);
+}
+
++ (instancetype)fromJSONDictionary:(NSDictionary *)dict
+{
+    return [dict isKindOfClass:NSDictionary.class] ? [[QTTopLevel alloc] initWithJSONDictionary:dict] : nil;
+}
+
+- (instancetype)initWithJSONDictionary:(NSDictionary *)dict
+{
+    if (self = [super init]) {
+        if (![dict[@"\000\001\033\037"] isKindOfClass:NSString.class]) return nil;
+        if (![dict[@"\177\302\200\302\205\302\237"] isKindOfClass:NSString.class]) return nil;
+        if (![dict[@"\U0001f600"] isKindOfClass:NSString.class]) return nil;
+        if (![dict[@"\\u001b"] isKindOfClass:NSString.class]) return nil;
+        [self setValuesForKeysWithDictionary:dict];
+    }
+    return self;
+}
+
+- (void)setValue:(nullable id)value forKey:(NSString *)key
+{
+    id resolved = QTTopLevel.properties[key];
+    if (resolved) [super setValue:value forKey:resolved];
+}
+
+- (void)setNilValueForKey:(NSString *)key
+{
+    id resolved = QTTopLevel.properties[key];
+    if (resolved) [super setValue:@(0) forKey:resolved];
+}
+
+- (NSDictionary *)JSONDictionary
+{
+    id dict = [[self dictionaryWithValuesForKeys:QTTopLevel.properties.allValues] mutableCopy];
+
+    for (id jsonName in QTTopLevel.properties) {
+        id propertyName = QTTopLevel.properties[jsonName];
+        if (![jsonName isEqualToString:propertyName]) {
+            dict[jsonName] = dict[propertyName];
+            [dict removeObjectForKey:propertyName];
+        }
+    }
+
+    return dict;
+}
+
+- (NSData *_Nullable)toData:(NSError *_Nullable *)error
+{
+    return QTTopLevelToData(self, error);
+}
+
+- (NSString *_Nullable)toJSON:(NSStringEncoding)encoding error:(NSError *_Nullable *)error
+{
+    return QTTopLevelToJSON(self, encoding, error);
+}
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/base/php/test/inputs/json/priority/keywords.json/default/TopLevel.php b/head/php/test/inputs/json/priority/keywords.json/default/TopLevel.php
index 4fbc2b0..2d52bc4 100644
--- a/base/php/test/inputs/json/priority/keywords.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/priority/keywords.json/default/TopLevel.php
@@ -31725,6 +31725,7 @@ class Obj4 {
     private Rethrows $rethrows; // json:rethrows Required
     private ReturnClass $return; // json:return Required
     private Right $right; // json:right Required
+    private S $s; // json:s Required
     private Sbyte $sbyte; // json:sbyte Required
     private Sealed $sealed; // json:sealed Required
     private Sel $sel; // json:SEL Required
@@ -31792,6 +31793,7 @@ class Obj4 {
      * @param Rethrows $rethrows
      * @param ReturnClass $return
      * @param Right $right
+     * @param S $s
      * @param Sbyte $sbyte
      * @param Sealed $sealed
      * @param Sel $sel
@@ -31836,7 +31838,7 @@ class Obj4 {
      * @param Unchecked $unchecked
      * @param Undefined $undefined
      */
-    public function __construct(int $dummy, Obj4Self $obj4Self, This $obj4This, Obj4True $obj4True, TypeClass $obj4Type, PublicClass $public, Quicktype $quicktype, Raise $raise, Range $range, ReadonlyClass $readonly, Ref $ref, Register $register, ReinterpretCast $reinterpretCast, Repeat $repeat, RequireClass $require, Required $required, Requires $requires, Restrict $restrict, Retain $retain, Rethrows $rethrows, ReturnClass $return, Right $right, Sbyte $sbyte, Sealed $sealed, Sel $sel, Select $select, SelfClass $self, Serialize $serialize, Set $set, Short $short, Signed $signed, Sizeof $sizeof, Stackalloc $stackalloc, StaticClass $static, StaticAssert $staticAssert, StaticCast $staticCast, Strictfp $strictfp, StringClass $string, Struct $struct, Subscript $subscript, Super $super, SwitchClass $switch, Symbol $symbol, Synchronized $synchronized, System $system, Template $template, Then $then, ThreadLocal $threadLocal, ThrowClass $throw, Throws $throws, ToJSON $toJSON, TopLevelClass $topLevel, Transient $transient, TrueClass $true, TryClass $try, Type $type, Typealias $typealias, Typedef $typedef, Typeid $typeid, Typename $typename, Typeof $typeof, Uint $uint, Ulong $ulong, Unchecked $unchecked, Undefined $undefined) {
+    public function __construct(int $dummy, Obj4Self $obj4Self, This $obj4This, Obj4True $obj4True, TypeClass $obj4Type, PublicClass $public, Quicktype $quicktype, Raise $raise, Range $range, ReadonlyClass $readonly, Ref $ref, Register $register, ReinterpretCast $reinterpretCast, Repeat $repeat, RequireClass $require, Required $required, Requires $requires, Restrict $restrict, Retain $retain, Rethrows $rethrows, ReturnClass $return, Right $right, S $s, Sbyte $sbyte, Sealed $sealed, Sel $sel, Select $select, SelfClass $self, Serialize $serialize, Set $set, Short $short, Signed $signed, Sizeof $sizeof, Stackalloc $stackalloc, StaticClass $static, StaticAssert $staticAssert, StaticCast $staticCast, Strictfp $strictfp, StringClass $string, Struct $struct, Subscript $subscript, Super $super, SwitchClass $switch, Symbol $symbol, Synchronized $synchronized, System $system, Template $template, Then $then, ThreadLocal $threadLocal, ThrowClass $throw, Throws $throws, ToJSON $toJSON, TopLevelClass $topLevel, Transient $transient, TrueClass $true, TryClass $try, Type $type, Typealias $typealias, Typedef $typedef, Typeid $typeid, Typename $typename, Typeof $typeof, Uint $uint, Ulong $ulong, Unchecked $unchecked, Undefined $undefined) {
         $this->dummy = $dummy;
         $this->obj4Self = $obj4Self;
         $this->obj4This = $obj4This;
@@ -31859,6 +31861,7 @@ class Obj4 {
         $this->rethrows = $rethrows;
         $this->return = $return;
         $this->right = $right;
+        $this->s = $s;
         $this->sbyte = $sbyte;
         $this->sealed = $sealed;
         $this->sel = $sel;
@@ -32959,6 +32962,54 @@ class Obj4 {
         return Right::sample(); /*52:right*/
     }
 
+    /**
+     * @param stdClass $value
+     * @throws Exception
+     * @return S
+     */
+    public static function fromS(stdClass $value): S {
+        return S::from($value); /*class*/
+    }
+
+    /**
+     * @throws Exception
+     * @return stdClass
+     */
+    public function toS(): stdClass {
+        if (Obj4::validateS($this->s))  {
+            return $this->s->to(); /*class*/
+        }
+        throw new Exception('never get to this Obj4::s');
+    }
+
+    /**
+     * @param S
+     * @return bool
+     * @throws Exception
+     */
+    public static function validateS(S $value): bool {
+        $value->validate();
+        return true;
+    }
+
+    /**
+     * @throws Exception
+     * @return S
+     */
+    public function getS(): S {
+        if (Obj4::validateS($this->s))  {
+            return $this->s;
+        }
+        throw new Exception('never get to getS Obj4::s');
+    }
+
+    /**
+     * @return S
+     */
+    public static function sampleS(): S {
+        return S::sample(); /*53:s*/
+    }
+
     /**
      * @param stdClass $value
      * @throws Exception
@@ -33004,7 +33055,7 @@ class Obj4 {
      * @return Sbyte
      */
     public static function sampleSbyte(): Sbyte {
-        return Sbyte::sample(); /*53:sbyte*/
+        return Sbyte::sample(); /*54:sbyte*/
     }
 
     /**
@@ -33052,7 +33103,7 @@ class Obj4 {
      * @return Sealed
      */
     public static function sampleSealed(): Sealed {
-        return Sealed::sample(); /*54:sealed*/
+        return Sealed::sample(); /*55:sealed*/
     }
 
     /**
@@ -33100,7 +33151,7 @@ class Obj4 {
      * @return Sel
      */
     public static function sampleSel(): Sel {
-        return Sel::sample(); /*55:sel*/
+        return Sel::sample(); /*56:sel*/
     }
 
     /**
@@ -33148,7 +33199,7 @@ class Obj4 {
      * @return Select
      */
     public static function sampleSelect(): Select {
-        return Select::sample(); /*56:select*/
+        return Select::sample(); /*57:select*/
     }
 
     /**
@@ -33196,7 +33247,7 @@ class Obj4 {
      * @return SelfClass
      */
     public static function sampleSelf(): SelfClass {
-        return SelfClass::sample(); /*57:self*/
+        return SelfClass::sample(); /*58:self*/
     }
 
     /**
@@ -33244,7 +33295,7 @@ class Obj4 {
      * @return Serialize
      */
     public static function sampleSerialize(): Serialize {
-        return Serialize::sample(); /*58:serialize*/
+        return Serialize::sample(); /*59:serialize*/
     }
 
     /**
@@ -33292,7 +33343,7 @@ class Obj4 {
      * @return Set
      */
     public static function sampleSet(): Set {
-        return Set::sample(); /*59:set*/
+        return Set::sample(); /*60:set*/
     }
 
     /**
@@ -33340,7 +33391,7 @@ class Obj4 {
      * @return Short
      */
     public static function sampleShort(): Short {
-        return Short::sample(); /*60:short*/
+        return Short::sample(); /*61:short*/
     }
 
     /**
@@ -33388,7 +33439,7 @@ class Obj4 {
      * @return Signed
      */
     public static function sampleSigned(): Signed {
-        return Signed::sample(); /*61:signed*/
+        return Signed::sample(); /*62:signed*/
     }
 
     /**
@@ -33436,7 +33487,7 @@ class Obj4 {
      * @return Sizeof
      */
     public static function sampleSizeof(): Sizeof {
-        return Sizeof::sample(); /*62:sizeof*/
+        return Sizeof::sample(); /*63:sizeof*/
     }
 
     /**
@@ -33484,7 +33535,7 @@ class Obj4 {
      * @return Stackalloc
      */
     public static function sampleStackalloc(): Stackalloc {
-        return Stackalloc::sample(); /*63:stackalloc*/
+        return Stackalloc::sample(); /*64:stackalloc*/
     }
 
     /**
@@ -33532,7 +33583,7 @@ class Obj4 {
      * @return StaticClass
      */
     public static function sampleStatic(): StaticClass {
-        return StaticClass::sample(); /*64:static*/
+        return StaticClass::sample(); /*65:static*/
     }
 
     /**
@@ -33580,7 +33631,7 @@ class Obj4 {
      * @return StaticAssert
      */
     public static function sampleStaticAssert(): StaticAssert {
-        return StaticAssert::sample(); /*65:staticAssert*/
+        return StaticAssert::sample(); /*66:staticAssert*/
     }
 
     /**
@@ -33628,7 +33679,7 @@ class Obj4 {
      * @return StaticCast
      */
     public static function sampleStaticCast(): StaticCast {
-        return StaticCast::sample(); /*66:staticCast*/
+        return StaticCast::sample(); /*67:staticCast*/
     }
 
     /**
@@ -33676,7 +33727,7 @@ class Obj4 {
      * @return Strictfp
      */
     public static function sampleStrictfp(): Strictfp {
-        return Strictfp::sample(); /*67:strictfp*/
+        return Strictfp::sample(); /*68:strictfp*/
     }
 
     /**
@@ -33724,7 +33775,7 @@ class Obj4 {
      * @return StringClass
      */
     public static function sampleString(): StringClass {
-        return StringClass::sample(); /*68:string*/
+        return StringClass::sample(); /*69:string*/
     }
 
     /**
@@ -33772,7 +33823,7 @@ class Obj4 {
      * @return Struct
      */
     public static function sampleStruct(): Struct {
-        return Struct::sample(); /*69:struct*/
+        return Struct::sample(); /*70:struct*/
     }
 
     /**
@@ -33820,7 +33871,7 @@ class Obj4 {
      * @return Subscript
      */
     public static function sampleSubscript(): Subscript {
-        return Subscript::sample(); /*70:subscript*/
+        return Subscript::sample(); /*71:subscript*/
     }
 
     /**
@@ -33868,7 +33919,7 @@ class Obj4 {
      * @return Super
      */
     public static function sampleSuper(): Super {
-        return Super::sample(); /*71:super*/
+        return Super::sample(); /*72:super*/
     }
 
     /**
@@ -33916,7 +33967,7 @@ class Obj4 {
      * @return SwitchClass
      */
     public static function sampleSwitch(): SwitchClass {
-        return SwitchClass::sample(); /*72:switch*/
+        return SwitchClass::sample(); /*73:switch*/
     }
 
     /**
@@ -33964,7 +34015,7 @@ class Obj4 {
      * @return Symbol
      */
     public static function sampleSymbol(): Symbol {
-        return Symbol::sample(); /*73:symbol*/
+        return Symbol::sample(); /*74:symbol*/
     }
 
     /**
@@ -34012,7 +34063,7 @@ class Obj4 {
      * @return Synchronized
      */
     public static function sampleSynchronized(): Synchronized {
-        return Synchronized::sample(); /*74:synchronized*/
+        return Synchronized::sample(); /*75:synchronized*/
     }
 
     /**
@@ -34060,7 +34111,7 @@ class Obj4 {
      * @return System
      */
     public static function sampleSystem(): System {
-        return System::sample(); /*75:system*/
+        return System::sample(); /*76:system*/
     }
 
     /**
@@ -34108,7 +34159,7 @@ class Obj4 {
      * @return Template
      */
     public static function sampleTemplate(): Template {
-        return Template::sample(); /*76:template*/
+        return Template::sample(); /*77:template*/
     }
 
     /**
@@ -34156,7 +34207,7 @@ class Obj4 {
      * @return Then
      */
     public static function sampleThen(): Then {
-        return Then::sample(); /*77:then*/
+        return Then::sample(); /*78:then*/
     }
 
     /**
@@ -34204,7 +34255,7 @@ class Obj4 {
      * @return ThreadLocal
      */
     public static function sampleThreadLocal(): ThreadLocal {
-        return ThreadLocal::sample(); /*78:threadLocal*/
+        return ThreadLocal::sample(); /*79:threadLocal*/
     }
 
     /**
@@ -34252,7 +34303,7 @@ class Obj4 {
      * @return ThrowClass
      */
     public static function sampleThrow(): ThrowClass {
-        return ThrowClass::sample(); /*79:throw*/
+        return ThrowClass::sample(); /*80:throw*/
     }
 
     /**
@@ -34300,7 +34351,7 @@ class Obj4 {
      * @return Throws
      */
     public static function sampleThrows(): Throws {
-        return Throws::sample(); /*80:throws*/
+        return Throws::sample(); /*81:throws*/
     }
 
     /**
@@ -34348,7 +34399,7 @@ class Obj4 {
      * @return ToJSON
      */
     public static function sampleToJSON(): ToJSON {
-        return ToJSON::sample(); /*81:toJSON*/
+        return ToJSON::sample(); /*82:toJSON*/
     }
 
     /**
@@ -34396,7 +34447,7 @@ class Obj4 {
      * @return TopLevelClass
      */
     public static function sampleTopLevel(): TopLevelClass {
-        return TopLevelClass::sample(); /*82:topLevel*/
+        return TopLevelClass::sample(); /*83:topLevel*/
     }
 
     /**
@@ -34444,7 +34495,7 @@ class Obj4 {
      * @return Transient
      */
     public static function sampleTransient(): Transient {
-        return Transient::sample(); /*83:transient*/
+        return Transient::sample(); /*84:transient*/
     }
 
     /**
@@ -34492,7 +34543,7 @@ class Obj4 {
      * @return TrueClass
      */
     public static function sampleTrue(): TrueClass {
-        return TrueClass::sample(); /*84:true*/
+        return TrueClass::sample(); /*85:true*/
     }
 
     /**
@@ -34540,7 +34591,7 @@ class Obj4 {
      * @return TryClass
      */
     public static function sampleTry(): TryClass {
-        return TryClass::sample(); /*85:try*/
+        return TryClass::sample(); /*86:try*/
     }
 
     /**
@@ -34588,7 +34639,7 @@ class Obj4 {
      * @return Type
      */
     public static function sampleType(): Type {
-        return Type::sample(); /*86:type*/
+        return Type::sample(); /*87:type*/
     }
 
     /**
@@ -34636,7 +34687,7 @@ class Obj4 {
      * @return Typealias
      */
     public static function sampleTypealias(): Typealias {
-        return Typealias::sample(); /*87:typealias*/
+        return Typealias::sample(); /*88:typealias*/
     }
 
     /**
@@ -34684,7 +34735,7 @@ class Obj4 {
      * @return Typedef
      */
     public static function sampleTypedef(): Typedef {
-        return Typedef::sample(); /*88:typedef*/
+        return Typedef::sample(); /*89:typedef*/
     }
 
     /**
@@ -34732,7 +34783,7 @@ class Obj4 {
      * @return Typeid
      */
     public static function sampleTypeid(): Typeid {
-        return Typeid::sample(); /*89:typeid*/
+        return Typeid::sample(); /*90:typeid*/
     }
 
     /**
@@ -34780,7 +34831,7 @@ class Obj4 {
      * @return Typename
      */
     public static function sampleTypename(): Typename {
-        return Typename::sample(); /*90:typename*/
+        return Typename::sample(); /*91:typename*/
     }
 
     /**
@@ -34828,7 +34879,7 @@ class Obj4 {
      * @return Typeof
      */
     public static function sampleTypeof(): Typeof {
-        return Typeof::sample(); /*91:typeof*/
+        return Typeof::sample(); /*92:typeof*/
     }
 
     /**
@@ -34876,7 +34927,7 @@ class Obj4 {
      * @return Uint
      */
     public static function sampleUint(): Uint {
-        return Uint::sample(); /*92:uint*/
+        return Uint::sample(); /*93:uint*/
     }
 
     /**
@@ -34924,7 +34975,7 @@ class Obj4 {
      * @return Ulong
      */
     public static function sampleUlong(): Ulong {
-        return Ulong::sample(); /*93:ulong*/
+        return Ulong::sample(); /*94:ulong*/
     }
 
     /**
@@ -34972,7 +35023,7 @@ class Obj4 {
      * @return Unchecked
      */
     public static function sampleUnchecked(): Unchecked {
-        return Unchecked::sample(); /*94:unchecked*/
+        return Unchecked::sample(); /*95:unchecked*/
     }
 
     /**
@@ -35020,7 +35071,7 @@ class Obj4 {
      * @return Undefined
      */
     public static function sampleUndefined(): Undefined {
-        return Undefined::sample(); /*95:undefined*/
+        return Undefined::sample(); /*96:undefined*/
     }
 
     /**
@@ -35050,6 +35101,7 @@ class Obj4 {
         || Obj4::validateRethrows($this->rethrows)
         || Obj4::validateReturn($this->return)
         || Obj4::validateRight($this->right)
+        || Obj4::validateS($this->s)
         || Obj4::validateSbyte($this->sbyte)
         || Obj4::validateSealed($this->sealed)
         || Obj4::validateSel($this->sel)
@@ -35123,6 +35175,7 @@ class Obj4 {
         $out->{'rethrows'} = $this->toRethrows();
         $out->{'return'} = $this->toReturn();
         $out->{'right'} = $this->toRight();
+        $out->{'s'} = $this->toS();
         $out->{'sbyte'} = $this->toSbyte();
         $out->{'sealed'} = $this->toSealed();
         $out->{'SEL'} = $this->toSel();
@@ -35241,6 +35294,9 @@ class Obj4 {
         if (!property_exists($obj, 'right')) {
             throw new Exception("Missing required property");
         }
+        if (!property_exists($obj, 's')) {
+            throw new Exception("Missing required property");
+        }
         if (!property_exists($obj, 'sbyte')) {
             throw new Exception("Missing required property");
         }
@@ -35393,6 +35449,7 @@ class Obj4 {
         ,Obj4::fromRethrows($obj->{'rethrows'})
         ,Obj4::fromReturn($obj->{'return'})
         ,Obj4::fromRight($obj->{'right'})
+        ,Obj4::fromS($obj->{'s'})
         ,Obj4::fromSbyte($obj->{'sbyte'})
         ,Obj4::fromSealed($obj->{'sealed'})
         ,Obj4::fromSel($obj->{'SEL'})
@@ -35466,6 +35523,7 @@ class Obj4 {
         ,Obj4::sampleRethrows()
         ,Obj4::sampleReturn()
         ,Obj4::sampleRight()
+        ,Obj4::sampleS()
         ,Obj4::sampleSbyte()
         ,Obj4::sampleSealed()
         ,Obj4::sampleSel()
@@ -37634,6 +37692,107 @@ class Right {
     }
 }
 
+// This is an autogenerated file:S
+
+class S {
+    private int $s; // json:s Required
+
+    /**
+     * @param int $s
+     */
+    public function __construct(int $s) {
+        $this->s = $s;
+    }
+
+    /**
+     * @param int $value
+     * @throws Exception
+     * @return int
+     */
+    public static function fromS(int $value): int {
+        return $value; /*int*/
+    }
+
+    /**
+     * @throws Exception
+     * @return int
+     */
+    public function toS(): int {
+        if (S::validateS($this->s))  {
+            return $this->s; /*int*/
+        }
+        throw new Exception('never get to this S::s');
+    }
+
+    /**
+     * @param int
+     * @return bool
+     * @throws Exception
+     */
+    public static function validateS(int $value): bool {
+        return true;
+    }
+
+    /**
+     * @throws Exception
+     * @return int
+     */
+    public function getS(): int {
+        if (S::validateS($this->s))  {
+            return $this->s;
+        }
+        throw new Exception('never get to getS S::s');
+    }
+
+    /**
+     * @return int
+     */
+    public static function sampleS(): int {
+        return 31; /*31:s*/
+    }
+
+    /**
+     * @throws Exception
+     * @return bool
+     */
+    public function validate(): bool {
+        return S::validateS($this->s);
+    }
+
+    /**
+     * @return stdClass
+     * @throws Exception
+     */
+    public function to(): stdClass  {
+        $out = new stdClass();
+        $out->{'s'} = $this->toS();
+        return $out;
+    }
+
+    /**
+     * @param stdClass $obj
+     * @return S
+     * @throws Exception
+     */
+    public static function from(stdClass $obj): S {
+        if (!property_exists($obj, 's')) {
+            throw new Exception("Missing required property");
+        }
+        return new S(
+         S::fromS($obj->{'s'})
+        );
+    }
+
+    /**
+     * @return S
+     */
+    public static function sample(): S {
+        return new S(
+         S::sampleS()
+        );
+    }
+}
+
 // This is an autogenerated file:Sbyte
 
 class Sbyte {
diff --git a/head/php/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.php b/head/php/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.php
new file mode 100644
index 0000000..89d93e2
--- /dev/null
+++ b/head/php/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.php
@@ -0,0 +1,274 @@
+<?php
+declare(strict_types=1);
+
+// This is an autogenerated file:TopLevel
+
+class TopLevel {
+    private string $empty; // json:  Required
+    private string $purple; // json:😀 Required
+    private string $topLevel; // json: Required
+    private string $u001B; // json:\u001b Required
+
+    /**
+     * @param string $empty
+     * @param string $purple
+     * @param string $topLevel
+     * @param string $u001B
+     */
+    public function __construct(string $empty, string $purple, string $topLevel, string $u001B) {
+        $this->empty = $empty;
+        $this->purple = $purple;
+        $this->topLevel = $topLevel;
+        $this->u001B = $u001B;
+    }
+
+    /**
+     * @param string $value
+     * @throws Exception
+     * @return string
+     */
+    public static function fromEmpty(string $value): string {
+        return $value; /*string*/
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function toEmpty(): string {
+        if (TopLevel::validateEmpty($this->empty))  {
+            return $this->empty; /*string*/
+        }
+        throw new Exception('never get to this TopLevel::empty');
+    }
+
+    /**
+     * @param string
+     * @return bool
+     * @throws Exception
+     */
+    public static function validateEmpty(string $value): bool {
+        return true;
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function getEmpty(): string {
+        if (TopLevel::validateEmpty($this->empty))  {
+            return $this->empty;
+        }
+        throw new Exception('never get to getEmpty TopLevel::empty');
+    }
+
+    /**
+     * @return string
+     */
+    public static function sampleEmpty(): string {
+        return 'TopLevel::empty::31'; /*31:empty*/
+    }
+
+    /**
+     * @param string $value
+     * @throws Exception
+     * @return string
+     */
+    public static function fromPurple(string $value): string {
+        return $value; /*string*/
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function toPurple(): string {
+        if (TopLevel::validatePurple($this->purple))  {
+            return $this->purple; /*string*/
+        }
+        throw new Exception('never get to this TopLevel::purple');
+    }
+
+    /**
+     * @param string
+     * @return bool
+     * @throws Exception
+     */
+    public static function validatePurple(string $value): bool {
+        return true;
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function getPurple(): string {
+        if (TopLevel::validatePurple($this->purple))  {
+            return $this->purple;
+        }
+        throw new Exception('never get to getPurple TopLevel::purple');
+    }
+
+    /**
+     * @return string
+     */
+    public static function samplePurple(): string {
+        return 'TopLevel::purple::32'; /*32:purple*/
+    }
+
+    /**
+     * @param string $value
+     * @throws Exception
+     * @return string
+     */
+    public static function fromTopLevel(string $value): string {
+        return $value; /*string*/
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function toTopLevel(): string {
+        if (TopLevel::validateTopLevel($this->topLevel))  {
+            return $this->topLevel; /*string*/
+        }
+        throw new Exception('never get to this TopLevel::topLevel');
+    }
+
+    /**
+     * @param string
+     * @return bool
+     * @throws Exception
+     */
+    public static function validateTopLevel(string $value): bool {
+        return true;
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function getTopLevel(): string {
+        if (TopLevel::validateTopLevel($this->topLevel))  {
+            return $this->topLevel;
+        }
+        throw new Exception('never get to getTopLevel TopLevel::topLevel');
+    }
+
+    /**
+     * @return string
+     */
+    public static function sampleTopLevel(): string {
+        return 'TopLevel::topLevel::33'; /*33:topLevel*/
+    }
+
+    /**
+     * @param string $value
+     * @throws Exception
+     * @return string
+     */
+    public static function fromU001B(string $value): string {
+        return $value; /*string*/
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function toU001B(): string {
+        if (TopLevel::validateU001B($this->u001B))  {
+            return $this->u001B; /*string*/
+        }
+        throw new Exception('never get to this TopLevel::u001B');
+    }
+
+    /**
+     * @param string
+     * @return bool
+     * @throws Exception
+     */
+    public static function validateU001B(string $value): bool {
+        return true;
+    }
+
+    /**
+     * @throws Exception
+     * @return string
+     */
+    public function getU001B(): string {
+        if (TopLevel::validateU001B($this->u001B))  {
+            return $this->u001B;
+        }
+        throw new Exception('never get to getU001B TopLevel::u001B');
+    }
+
+    /**
+     * @return string
+     */
+    public static function sampleU001B(): string {
+        return 'TopLevel::u001B::34'; /*34:u001B*/
+    }
+
+    /**
+     * @throws Exception
+     * @return bool
+     */
+    public function validate(): bool {
+        return TopLevel::validateEmpty($this->empty)
+        || TopLevel::validatePurple($this->purple)
+        || TopLevel::validateTopLevel($this->topLevel)
+        || TopLevel::validateU001B($this->u001B);
+    }
+
+    /**
+     * @return stdClass
+     * @throws Exception
+     */
+    public function to(): stdClass  {
+        $out = new stdClass();
+        $out->{' '} = $this->toEmpty();
+        $out->{'😀'} = $this->toPurple();
+        $out->{''} = $this->toTopLevel();
+        $out->{'\\u001b'} = $this->toU001B();
+        return $out;
+    }
+
+    /**
+     * @param stdClass $obj
+     * @return TopLevel
+     * @throws Exception
+     */
+    public static function from(stdClass $obj): TopLevel {
+        if (!property_exists($obj, ' ')) {
+            throw new Exception("Missing required property");
+        }
+        if (!property_exists($obj, '😀')) {
+            throw new Exception("Missing required property");
+        }
+        if (!property_exists($obj, '')) {
+            throw new Exception("Missing required property");
+        }
+        if (!property_exists($obj, '\\u001b')) {
+            throw new Exception("Missing required property");
+        }
+        return new TopLevel(
+         TopLevel::fromEmpty($obj->{' '})
+        ,TopLevel::fromPurple($obj->{'😀'})
+        ,TopLevel::fromTopLevel($obj->{''})
+        ,TopLevel::fromU001B($obj->{'\\u001b'})
+        );
+    }
+
+    /**
+     * @return TopLevel
+     */
+    public static function sample(): TopLevel {
+        return new TopLevel(
+         TopLevel::sampleEmpty()
+        ,TopLevel::samplePurple()
+        ,TopLevel::sampleTopLevel()
+        ,TopLevel::sampleU001B()
+        );
+    }
+}
diff --git a/base/pike/test/inputs/json/priority/keywords.json/default/TopLevel.pmod b/head/pike/test/inputs/json/priority/keywords.json/default/TopLevel.pmod
index be66731..313acdb 100644
--- a/base/pike/test/inputs/json/priority/keywords.json/default/TopLevel.pmod
+++ b/head/pike/test/inputs/json/priority/keywords.json/default/TopLevel.pmod
@@ -4818,6 +4818,7 @@ class Obj4 {
     Retain          retain;           // json: "retain"
     Rethrows        rethrows;         // json: "rethrows"
     Right           right;            // json: "right"
+    S               s;                // json: "s"
     Sbyte           sbyte;            // json: "sbyte"
     Sealed          sealed;           // json: "sealed"
     Sel             sel;              // json: "SEL"
@@ -4886,6 +4887,7 @@ class Obj4 {
             "retain" : retain,
             "rethrows" : rethrows,
             "right" : right,
+            "s" : s,
             "sbyte" : sbyte,
             "sealed" : sealed,
             "SEL" : sel,
@@ -4961,6 +4963,7 @@ Obj4 Obj4_from_JSON(mixed json) {
     retval.retain = json["retain"];
     retval.rethrows = json["rethrows"];
     retval.right = json["right"];
+    retval.s = json["s"];
     retval.sbyte = json["sbyte"];
     retval.sealed = json["sealed"];
     retval.sel = json["SEL"];
@@ -5529,6 +5532,27 @@ Right Right_from_JSON(mixed json) {
     return retval;
 }
 
+class S {
+    int s; // json: "s"
+
+    string encode_json() {
+        mapping(string:mixed) json = ([
+            "s" : s,
+        ]);
+
+        return Standards.JSON.encode(json);
+    }
+}
+
+S S_from_JSON(mixed json) {
+    S retval = S();
+
+    if (!intp(json["s"])) error("Expected integer");
+    retval.s = json["s"];
+
+    return retval;
+}
+
 class Sbyte {
     int sbyte; // json: "sbyte"
 
diff --git a/head/pike/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.pmod b/head/pike/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.pmod
new file mode 100644
index 0000000..5b4032c
--- /dev/null
+++ b/head/pike/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.pmod
@@ -0,0 +1,42 @@
+// This source has been automatically generated by quicktype.
+// ( https://github.com/quicktype/quicktype )
+//
+// To use this code, simply import it into your project as a Pike module.
+// To JSON-encode your object, you can pass it to `Standards.JSON.encode`
+// or call `encode_json` on it.
+//
+// To decode a JSON string, first pass it to `Standards.JSON.decode`,
+// and then pass the result to `<YourClass>_from_JSON`.
+// It will return an instance of <YourClass>.
+// Bear in mind that these functions have unexpected behavior,
+// and will likely throw an error, if the JSON string does not
+// match the expected interface, even if the JSON itself is valid.
+
+class TopLevel {
+    string empty;     // json: "\u0000\u0001\u001b\u001f"
+    string purple;    // json: "\U0001f600"
+    string top_level; // json: "\u007f\u0080\u0085\u009f"
+    string u001_b;    // json: "\\u001b"
+
+    string encode_json() {
+        mapping(string:mixed) json = ([
+            "\u0000\u0001\u001b\u001f" : empty,
+            "\U0001f600" : purple,
+            "\u007f\u0080\u0085\u009f" : top_level,
+            "\\u001b" : u001_b,
+        ]);
+
+        return Standards.JSON.encode(json);
+    }
+}
+
+TopLevel TopLevel_from_JSON(mixed json) {
+    TopLevel retval = TopLevel();
+
+    retval.empty = json["\u0000\u0001\u001b\u001f"];
+    retval.purple = json["\U0001f600"];
+    retval.top_level = json["\u007f\u0080\u0085\u009f"];
+    retval.u001_b = json["\\u001b"];
+
+    return retval;
+}
diff --git a/base/python/test/inputs/json/priority/keywords.json/default/quicktype.py b/head/python/test/inputs/json/priority/keywords.json/default/quicktype.py
index b63d029..f68c212 100644
--- a/base/python/test/inputs/json/priority/keywords.json/default/quicktype.py
+++ b/head/python/test/inputs/json/priority/keywords.json/default/quicktype.py
@@ -4120,6 +4120,22 @@ class Right:
         return result
 
 
+@dataclass
+class S:
+    s: int
+
+    @staticmethod
+    def from_dict(obj: Any) -> 'S':
+        assert isinstance(obj, dict)
+        s = from_int(obj.get("s"))
+        return S(s)
+
+    def to_dict(self) -> dict:
+        result: dict = {}
+        result["s"] = from_int(self.s)
+        return result
+
+
 @dataclass
 class Sbyte:
     sbyte: int
@@ -4816,6 +4832,7 @@ class Obj4:
     rethrows: Rethrows
     obj4_return: Return
     right: Right
+    s: S
     sbyte: Sbyte
     sealed: Sealed
     select: Select
@@ -4885,6 +4902,7 @@ class Obj4:
         rethrows = Rethrows.from_dict(obj.get("rethrows"))
         obj4_return = Return.from_dict(obj.get("return"))
         right = Right.from_dict(obj.get("right"))
+        s = S.from_dict(obj.get("s"))
         sbyte = Sbyte.from_dict(obj.get("sbyte"))
         sealed = Sealed.from_dict(obj.get("sealed"))
         select = Select.from_dict(obj.get("select"))
@@ -4928,7 +4946,7 @@ class Obj4:
         ulong = Ulong.from_dict(obj.get("ulong"))
         unchecked = Unchecked.from_dict(obj.get("unchecked"))
         undefined = Undefined.from_dict(obj.get("undefined"))
-        return Obj4(sel, obj4_self, true, type, dummy, public, quicktype, obj4_raise, range, readonly, ref, register, reinterpret_cast, repeat, require, required, requires, restrict, retain, rethrows, obj4_return, right, sbyte, sealed, select, purple_self, serialize, set, short, signed, sizeof, stackalloc, static, static_assert, static_cast, strictfp, string, struct, subscript, super, switch, symbol, synchronized, system, template, then, this, thread_local, throw, throws, to_json, top_level, transient, obj4_true, obj4_try, obj4_type, typealias, typedef, typeid, typename, typeof, uint, ulong, unchecked, undefined)
+        return Obj4(sel, obj4_self, true, type, dummy, public, quicktype, obj4_raise, range, readonly, ref, register, reinterpret_cast, repeat, require, required, requires, restrict, retain, rethrows, obj4_return, right, s, sbyte, sealed, select, purple_self, serialize, set, short, signed, sizeof, stackalloc, static, static_assert, static_cast, strictfp, string, struct, subscript, super, switch, symbol, synchronized, system, template, then, this, thread_local, throw, throws, to_json, top_level, transient, obj4_true, obj4_try, obj4_type, typealias, typedef, typeid, typename, typeof, uint, ulong, unchecked, undefined)
 
     def to_dict(self) -> dict:
         result: dict = {}
@@ -4954,6 +4972,7 @@ class Obj4:
         result["rethrows"] = to_class(Rethrows, self.rethrows)
         result["return"] = to_class(Return, self.obj4_return)
         result["right"] = to_class(Right, self.right)
+        result["s"] = to_class(S, self.s)
         result["sbyte"] = to_class(Sbyte, self.sbyte)
         result["sealed"] = to_class(Sealed, self.sealed)
         result["select"] = to_class(Select, self.select)
diff --git a/head/python/test/inputs/json/samples/objc-control-characters.json/default/quicktype.py b/head/python/test/inputs/json/samples/objc-control-characters.json/default/quicktype.py
new file mode 100644
index 0000000..cff6313
--- /dev/null
+++ b/head/python/test/inputs/json/samples/objc-control-characters.json/default/quicktype.py
@@ -0,0 +1,48 @@
+from dataclasses import dataclass
+from typing import Any, TypeVar, Type, cast
+
+
+T = TypeVar("T")
+
+
+def from_str(x: Any) -> str:
+    assert isinstance(x, str)
+    return x
+
+
+def to_class(c: Type[T], x: Any) -> dict:
+    assert isinstance(x, c)
+    return cast(Any, x).to_dict()
+
+
+@dataclass
+class TopLevel:
+    empty: str
+    u001_b: str
+    top_level: str
+    purple: str
+
+    @staticmethod
+    def from_dict(obj: Any) -> 'TopLevel':
+        assert isinstance(obj, dict)
+        empty = from_str(obj.get("\u0000\u0001\u001b\u001f"))
+        u001_b = from_str(obj.get("\\u001b"))
+        top_level = from_str(obj.get("\u007f\u0080\u0085\u009f"))
+        purple = from_str(obj.get("\U0001f600"))
+        return TopLevel(empty, u001_b, top_level, purple)
+
+    def to_dict(self) -> dict:
+        result: dict = {}
+        result["\u0000\u0001\u001b\u001f"] = from_str(self.empty)
+        result["\\u001b"] = from_str(self.u001_b)
+        result["\u007f\u0080\u0085\u009f"] = from_str(self.top_level)
+        result["\U0001f600"] = from_str(self.purple)
+        return result
+
+
+def top_level_from_dict(s: Any) -> TopLevel:
+    return TopLevel.from_dict(s)
+
+
+def top_level_to_dict(x: TopLevel) -> Any:
+    return to_class(TopLevel, x)
diff --git a/base/ruby/test/inputs/json/priority/keywords.json/default/TopLevel.rb b/head/ruby/test/inputs/json/priority/keywords.json/default/TopLevel.rb
index 80af01e..d376988 100644
--- a/base/ruby/test/inputs/json/priority/keywords.json/default/TopLevel.rb
+++ b/head/ruby/test/inputs/json/priority/keywords.json/default/TopLevel.rb
@@ -6229,6 +6229,31 @@ class Right < Dry::Struct
   end
 end
 
+class S < Dry::Struct
+  attribute :s, Types::Integer
+
+  def self.from_dynamic!(d)
+    d = Types::Hash[d]
+    new(
+      s: d.fetch("s"),
+    )
+  end
+
+  def self.from_json!(json)
+    from_dynamic!(JSON.parse(json))
+  end
+
+  def to_dynamic
+    {
+      "s" => s,
+    }
+  end
+
+  def to_json(options = nil)
+    JSON.generate(to_dynamic, options)
+  end
+end
+
 class Sbyte < Dry::Struct
   attribute :sbyte, Types::Integer
 
@@ -7183,6 +7208,7 @@ class Obj4 < Dry::Struct
   attribute :retain,           Retain
   attribute :rethrows,         Rethrows
   attribute :right,            Right
+  attribute :s,                S
   attribute :sbyte,            Sbyte
   attribute :sealed,           Sealed
   attribute :sel,              Sel
@@ -7252,6 +7278,7 @@ class Obj4 < Dry::Struct
       retain:           Retain.from_dynamic!(d.fetch("retain")),
       rethrows:         Rethrows.from_dynamic!(d.fetch("rethrows")),
       right:            Right.from_dynamic!(d.fetch("right")),
+      s:                S.from_dynamic!(d.fetch("s")),
       sbyte:            Sbyte.from_dynamic!(d.fetch("sbyte")),
       sealed:           Sealed.from_dynamic!(d.fetch("sealed")),
       sel:              Sel.from_dynamic!(d.fetch("SEL")),
@@ -7326,6 +7353,7 @@ class Obj4 < Dry::Struct
       "retain"           => retain.to_dynamic,
       "rethrows"         => rethrows.to_dynamic,
       "right"            => right.to_dynamic,
+      "s"                => s.to_dynamic,
       "sbyte"            => sbyte.to_dynamic,
       "sealed"           => sealed.to_dynamic,
       "SEL"              => sel.to_dynamic,
diff --git a/head/ruby/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.rb b/head/ruby/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.rb
new file mode 100644
index 0000000..0befa6d
--- /dev/null
+++ b/head/ruby/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.rb
@@ -0,0 +1,54 @@
+# This code may look unusually verbose for Ruby (and it is), but
+# it performs some subtle and complex validation of JSON data.
+#
+# To parse this JSON, add 'dry-struct' and 'dry-types' gems, then do:
+#
+#   top_level = TopLevel.from_json! "{…}"
+#   puts top_level.empty
+#
+# If from_json! succeeds, the value returned matches the schema.
+
+require 'json'
+require 'dry-types'
+require 'dry-struct'
+
+module Types
+  include Dry.Types(default: :nominal)
+
+  Hash   = Strict::Hash
+  String = Strict::String
+end
+
+class TopLevel < Dry::Struct
+  attribute :empty,     Types::String
+  attribute :the_1,     Types::String
+  attribute :top_level, Types::String
+  attribute :u001_b,    Types::String
+
+  def self.from_dynamic!(d)
+    d = Types::Hash[d]
+    new(
+      empty:     d.fetch("\u{0}\u{1}\u{1b}\u{1f}"),
+      the_1:     d.fetch("\u{1f600}"),
+      top_level: d.fetch("\u{7f}\u{80}\u{85}\u{9f}"),
+      u001_b:    d.fetch("\\u001b"),
+    )
+  end
+
+  def self.from_json!(json)
+    from_dynamic!(JSON.parse(json))
+  end
+
+  def to_dynamic
+    {
+      "\u{0}\u{1}\u{1b}\u{1f}"   => empty,
+      "\u{1f600}"                => the_1,
+      "\u{7f}\u{80}\u{85}\u{9f}" => top_level,
+      "\\u001b"                  => u001_b,
+    }
+  end
+
+  def to_json(options = nil)
+    JSON.generate(to_dynamic, options)
+  end
+end
diff --git a/base/rust/test/inputs/json/priority/keywords.json/default/module_under_test.rs b/head/rust/test/inputs/json/priority/keywords.json/default/module_under_test.rs
index 14aa82f..ce136b7 100644
--- a/base/rust/test/inputs/json/priority/keywords.json/default/module_under_test.rs
+++ b/head/rust/test/inputs/json/priority/keywords.json/default/module_under_test.rs
@@ -1565,6 +1565,8 @@ pub struct Obj4 {
 
     pub right: Right,
 
+    pub s: S,
+
     pub sbyte: Sbyte,
 
     pub sealed: Sealed,
@@ -1795,6 +1797,11 @@ pub struct Right {
     pub right: i64,
 }
 
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct S {
+    pub s: i64,
+}
+
 #[derive(Debug, Clone, Serialize, Deserialize)]
 pub struct Sbyte {
     pub sbyte: i64,
diff --git a/head/rust/test/inputs/json/samples/objc-control-characters.json/default/module_under_test.rs b/head/rust/test/inputs/json/samples/objc-control-characters.json/default/module_under_test.rs
new file mode 100644
index 0000000..6d7211f
--- /dev/null
+++ b/head/rust/test/inputs/json/samples/objc-control-characters.json/default/module_under_test.rs
@@ -0,0 +1,29 @@
+// Example code that deserializes and serializes the model.
+// extern crate serde;
+// #[macro_use]
+// extern crate serde_derive;
+// extern crate serde_json;
+//
+// use generated_module::TopLevel;
+//
+// fn main() {
+//     let json = r#"{"answer": 42}"#;
+//     let model: TopLevel = serde_json::from_str(&json).unwrap();
+// }
+
+use serde::{Serialize, Deserialize};
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct TopLevel {
+    #[serde(rename = "\u{0000}\u{0001}\u{001b}\u{001f}")]
+    pub empty: String,
+
+    #[serde(rename = "\u{01f600}")]
+    pub purple: String,
+
+    #[serde(rename = "\u{007f}\u{0080}\u{0085}\u{009f}")]
+    pub top_level: String,
+
+    #[serde(rename = "\\u001b")]
+    pub u001_b: String,
+}
diff --git a/base/scala3/test/inputs/json/priority/keywords.json/default/TopLevel.scala b/head/scala3/test/inputs/json/priority/keywords.json/default/TopLevel.scala
index 5c7aab8..7af7235 100644
--- a/base/scala3/test/inputs/json/priority/keywords.json/default/TopLevel.scala
+++ b/head/scala3/test/inputs/json/priority/keywords.json/default/TopLevel.scala
@@ -1061,6 +1061,7 @@ case class Obj4 (
     val retain : Retain,
     val rethrows : Rethrows,
     val right : Right,
+    val s : S,
     val sbyte : Sbyte,
     val SEL : Sel,
     val select : Select,
@@ -1220,6 +1221,10 @@ case class Right (
     val right : Long
 ) derives Encoder.AsObject, Decoder
 
+case class S (
+    val s : Long
+) derives Encoder.AsObject, Decoder
+
 case class Sbyte (
     val sbyte : Long
 ) derives Encoder.AsObject, Decoder
diff --git a/head/scala3/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.scala b/head/scala3/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.scala
new file mode 100644
index 0000000..bc2c107
--- /dev/null
+++ b/head/scala3/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.scala
@@ -0,0 +1,27 @@
+package quicktype
+
+import io.circe.syntax._
+import io.circe._
+import cats.syntax.functor._
+
+// If a union has a null in, then we'll need this too... 
+type NullValue = None.type
+
+case class TopLevel (
+    val empty : String,
+    val purple : String,
+    val topLevel : String,
+    val u001B : String
+)
+
+object TopLevel:
+    given io.circe.derivation.Configuration =
+        io.circe.derivation.Configuration.default.withTransformMemberNames(
+            io.circe.derivation.renaming.replaceWith(
+                "empty" -> "\u0000\u0001\u001b\u001f",
+                "purple" -> "\ud83d\ude00",
+                "topLevel" -> "\u007f\u0080\u0085\u009f",
+                "u001B" -> "\\u001b"
+            )
+        )
+    given io.circe.Codec.AsObject[TopLevel] = io.circe.derivation.ConfiguredCodec.derived
diff --git a/base/scala3-upickle/test/inputs/json/priority/keywords.json/default/TopLevel.scala b/head/scala3-upickle/test/inputs/json/priority/keywords.json/default/TopLevel.scala
index e071ec1..044154f 100644
--- a/base/scala3-upickle/test/inputs/json/priority/keywords.json/default/TopLevel.scala
+++ b/head/scala3-upickle/test/inputs/json/priority/keywords.json/default/TopLevel.scala
@@ -1097,6 +1097,7 @@ case class Obj4 (
     val retain : Retain,
     val rethrows : Rethrows,
     val right : Right,
+    val s : S,
     val sbyte : Sbyte,
     val SEL : Sel,
     val select : Select,
@@ -1248,6 +1249,10 @@ case class Right (
     val right : Long
 ) derives OptionPickler.ReadWriter
 
+case class S (
+    val s : Long
+) derives OptionPickler.ReadWriter
+
 case class Sbyte (
     val sbyte : Long
 ) derives OptionPickler.ReadWriter
diff --git a/head/scala3-upickle/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.scala b/head/scala3-upickle/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.scala
new file mode 100644
index 0000000..7243761
--- /dev/null
+++ b/head/scala3-upickle/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.scala
@@ -0,0 +1,79 @@
+package quicktype
+
+// Custom pickler so that missing keys and JSON nulls both read as None,
+// and None is left out when writing (upickle's default for Option is a
+// JSON array).
+object OptionPickler extends upickle.AttributeTagged:
+    import upickle.default.Writer
+    import upickle.default.Reader
+    override implicit def OptionWriter[T: Writer]: Writer[Option[T]] =
+        implicitly[Writer[T]].comap[Option[T]] {
+            case None => null.asInstanceOf[T]
+            case Some(x) => x
+        }
+
+    override implicit def OptionReader[T: Reader]: Reader[Option[T]] = {
+        new Reader.Delegate[Any, Option[T]](implicitly[Reader[T]].map(Some(_))){
+        override def visitNull(index: Int) = None
+        }
+    }
+end OptionPickler
+
+// If a union has a null in, then we'll need this too...
+type NullValue = None.type
+given OptionPickler.ReadWriter[NullValue] = OptionPickler.readwriter[ujson.Value].bimap[NullValue](
+    _ => ujson.Null,
+    json => if json.isNull then None else throw new upickle.core.Abort("not null")
+)
+given OptionPickler.ReadWriter[java.time.Instant] = OptionPickler.readwriter[String].bimap(_.toString, java.time.Instant.parse)
+
+object JsonExt:
+    val valueReader = OptionPickler.readwriter[ujson.Value]
+
+    // upickle's built-in primitive readers are lenient -- the numeric and
+    // boolean readers accept strings, and the string reader accepts
+    // numbers and booleans -- so untagged unions need strict readers to
+    // pick the right member.
+    val strictString: OptionPickler.Reader[String] = valueReader.map {
+        case ujson.Str(s) => s
+        case json => throw new upickle.core.Abort("expected string, got " + json)
+    }
+    val strictLong: OptionPickler.Reader[Long] = valueReader.map {
+        case ujson.Num(n) if n.isWhole => n.toLong
+        case json => throw new upickle.core.Abort("expected integer, got " + json)
+    }
+    val strictDouble: OptionPickler.Reader[Double] = valueReader.map {
+        case ujson.Num(n) => n
+        case json => throw new upickle.core.Abort("expected number, got " + json)
+    }
+    val strictBoolean: OptionPickler.Reader[Boolean] = valueReader.map {
+        case ujson.Bool(b) => b
+        case json => throw new upickle.core.Abort("expected boolean, got " + json)
+    }
+
+    def badMerge[T](r1: => OptionPickler.Reader[?], rest: OptionPickler.Reader[?]*): OptionPickler.Reader[T] = valueReader.map { json =>
+        var t: T | Null = null
+        val stack       = Vector.newBuilder[Throwable]
+        (r1 +: rest).foreach { reader =>
+            if t == null then
+            try
+                t = OptionPickler.read[T](json, trace = true)(using reader.asInstanceOf[OptionPickler.Reader[T]])
+            catch
+                case exc => stack += exc
+        }
+        if t != null then t.nn else throw new Exception(json.toString(), stack.result().headOption.getOrElse(null))
+    }
+end JsonExt
+given OptionPickler.Reader[Long] = JsonExt.strictLong
+
+
+case class TopLevel (
+    @upickle.implicits.key("\u0000\u0001\u001b\u001f")
+    val empty : String,
+    @upickle.implicits.key("\ud83d\ude00")
+    val purple : String,
+    @upickle.implicits.key("\u007f\u0080\u0085\u009f")
+    val topLevel : String,
+    @upickle.implicits.key("\\u001b")
+    val u001B : String
+) derives OptionPickler.ReadWriter
diff --git a/base/schema-csharp/test/inputs/schema/integer-type.schema/default/QuickType.cs b/head/schema-csharp/test/inputs/schema/integer-type.schema/default/QuickType.cs
index 1a28d77..8fbcdc9 100644
--- a/base/schema-csharp/test/inputs/schema/integer-type.schema/default/QuickType.cs
+++ b/head/schema-csharp/test/inputs/schema/integer-type.schema/default/QuickType.cs
@@ -26,27 +26,35 @@ namespace QuickType
     public partial class TopLevel
     {
         [JsonProperty("above_i32_max", Required = Required.Always)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long AboveI32Max { get; set; }
 
         [JsonProperty("below_i32_min", Required = Required.Always)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long BelowI32Min { get; set; }
 
         [JsonProperty("i32_range", Required = Required.Always)]
+        [JsonConverter(typeof(TentacledMinMaxValueCheckConverter))]
         public long I32Range { get; set; }
 
         [JsonProperty("large_bounds", Required = Required.Always)]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long LargeBounds { get; set; }
 
         [JsonProperty("only_maximum", Required = Required.Always)]
+        [JsonConverter(typeof(IndigoMinMaxValueCheckConverter))]
         public long OnlyMaximum { get; set; }
 
         [JsonProperty("only_minimum", Required = Required.Always)]
+        [JsonConverter(typeof(IndecentMinMaxValueCheckConverter))]
         public long OnlyMinimum { get; set; }
 
         [JsonProperty("small_negative", Required = Required.Always)]
+        [JsonConverter(typeof(HilariousMinMaxValueCheckConverter))]
         public long SmallNegative { get; set; }
 
         [JsonProperty("small_positive", Required = Required.Always)]
+        [JsonConverter(typeof(AmbitiousMinMaxValueCheckConverter))]
         public long SmallPositive { get; set; }
 
         [JsonProperty("unbounded", Required = Required.Always)]
@@ -75,6 +83,278 @@ namespace QuickType
             },
         };
     }
+
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0 && value <= 2147483648)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0 && value <= 2147483648)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -2147483649 && value <= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -2147483649 && value <= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
+    }
+
+    internal class TentacledMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -2147483648 && value <= 2147483647)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -2147483648 && value <= 2147483647)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly TentacledMinMaxValueCheckConverter Singleton = new TentacledMinMaxValueCheckConverter();
+    }
+
+    internal class StickyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -9007199254740991 && value <= 9007199254740991)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -9007199254740991 && value <= 9007199254740991)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly StickyMinMaxValueCheckConverter Singleton = new StickyMinMaxValueCheckConverter();
+    }
+
+    internal class IndigoMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value <= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value <= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly IndigoMinMaxValueCheckConverter Singleton = new IndigoMinMaxValueCheckConverter();
+    }
+
+    internal class IndecentMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly IndecentMinMaxValueCheckConverter Singleton = new IndecentMinMaxValueCheckConverter();
+    }
+
+    internal class HilariousMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -100 && value <= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -100 && value <= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly HilariousMinMaxValueCheckConverter Singleton = new HilariousMinMaxValueCheckConverter();
+    }
+
+    internal class AmbitiousMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0 && value <= 100)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0 && value <= 100)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly AmbitiousMinMaxValueCheckConverter Singleton = new AmbitiousMinMaxValueCheckConverter();
+    }
 }
 #pragma warning restore CS8618
 #pragma warning restore CS8601
diff --git a/base/schema-csharp/test/inputs/schema/minmax-integer.schema/default/QuickType.cs b/head/schema-csharp/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
index 6d110ab..90dd7b7 100644
--- a/base/schema-csharp/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
+++ b/head/schema-csharp/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
@@ -29,24 +29,30 @@ namespace QuickType
         public long Free { get; set; }
 
         [JsonProperty("intersection", Required = Required.Always)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long Intersection { get; set; }
 
         [JsonProperty("max", Required = Required.Always)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long Max { get; set; }
 
         [JsonProperty("min", Required = Required.Always)]
+        [JsonConverter(typeof(TentacledMinMaxValueCheckConverter))]
         public long Min { get; set; }
 
         [JsonProperty("minmax", Required = Required.Always)]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long Minmax { get; set; }
 
         [JsonProperty("minMaxIntersection", Required = Required.Always)]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long MinMaxIntersection { get; set; }
 
         [JsonProperty("minMaxUnion", Required = Required.Always)]
         public long MinMaxUnion { get; set; }
 
         [JsonProperty("union", Required = Required.Always)]
+        [JsonConverter(typeof(IndigoMinMaxValueCheckConverter))]
         public long Union { get; set; }
     }
 
@@ -72,6 +78,176 @@ namespace QuickType
             },
         };
     }
+
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 4 && value <= 5)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 4 && value <= 5)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value <= 5)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value <= 5)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
+    }
+
+    internal class TentacledMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 3)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 3)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly TentacledMinMaxValueCheckConverter Singleton = new TentacledMinMaxValueCheckConverter();
+    }
+
+    internal class StickyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 3 && value <= 5)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 3 && value <= 5)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly StickyMinMaxValueCheckConverter Singleton = new StickyMinMaxValueCheckConverter();
+    }
+
+    internal class IndigoMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 3 && value <= 6)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 3 && value <= 6)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly IndigoMinMaxValueCheckConverter Singleton = new IndigoMinMaxValueCheckConverter();
+    }
 }
 #pragma warning restore CS8618
 #pragma warning restore CS8601
diff --git a/base/schema-csharp/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs b/head/schema-csharp/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
index 94dff2e..6157674 100644
--- a/base/schema-csharp/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
+++ b/head/schema-csharp/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
@@ -29,6 +29,7 @@ namespace QuickType
         public Coordinate[]? Coordinates { get; set; }
 
         [JsonProperty("count", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long? Count { get; set; }
 
         [JsonProperty("label", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
@@ -39,6 +40,7 @@ namespace QuickType
         public Coordinate[] RequiredCoordinates { get; set; }
 
         [JsonProperty("requiredCount", Required = Required.Always)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long RequiredCount { get; set; }
 
         [JsonProperty("requiredLabel", Required = Required.Always)]
@@ -46,7 +48,7 @@ namespace QuickType
         public string RequiredLabel { get; set; }
 
         [JsonProperty("weight", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
-        [JsonConverter(typeof(MinMaxValueCheckConverter))]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public double? Weight { get; set; }
     }
 
@@ -82,6 +84,40 @@ namespace QuickType
         };
     }
 
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 1 && value <= 100)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 1 && value <= 100)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
     internal class MinMaxLengthCheckConverter : JsonConverter
     {
         public override bool CanConvert(Type t) => t == typeof(string);
@@ -110,7 +146,7 @@ namespace QuickType
         public static readonly MinMaxLengthCheckConverter Singleton = new MinMaxLengthCheckConverter();
     }
 
-    internal class MinMaxValueCheckConverter : JsonConverter
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
     {
         public override bool CanConvert(Type t) => t == typeof(double) || t == typeof(double?);
 
@@ -141,7 +177,7 @@ namespace QuickType
             throw new Exception("Cannot marshal type double");
         }
 
-        public static readonly MinMaxValueCheckConverter Singleton = new MinMaxValueCheckConverter();
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
     }
 }
 #pragma warning restore CS8618
diff --git a/base/schema-csharp/test/inputs/schema/optional-constraints.schema/default/QuickType.cs b/head/schema-csharp/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
index e5a334f..5346287 100644
--- a/base/schema-csharp/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
+++ b/head/schema-csharp/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
@@ -26,10 +26,11 @@ namespace QuickType
     public partial class TopLevel
     {
         [JsonProperty("optDouble", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
-        [JsonConverter(typeof(MinMaxValueCheckConverter))]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public double? OptDouble { get; set; }
 
         [JsonProperty("optInt", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long? OptInt { get; set; }
 
         [JsonProperty("optPattern", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
@@ -40,6 +41,7 @@ namespace QuickType
         public string? OptString { get; set; }
 
         [JsonProperty("reqZeroMin", Required = Required.Always)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long ReqZeroMin { get; set; }
     }
 
@@ -66,7 +68,7 @@ namespace QuickType
         };
     }
 
-    internal class MinMaxValueCheckConverter : JsonConverter
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
     {
         public override bool CanConvert(Type t) => t == typeof(double) || t == typeof(double?);
 
@@ -97,7 +99,41 @@ namespace QuickType
             throw new Exception("Cannot marshal type double");
         }
 
-        public static readonly MinMaxValueCheckConverter Singleton = new MinMaxValueCheckConverter();
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0 && value <= 100)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0 && value <= 100)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
     }
 
     internal class MinMaxLengthCheckConverter : JsonConverter
diff --git a/base/schema-csharp-SystemTextJson/test/inputs/schema/integer-type.schema/default/QuickType.cs b/head/schema-csharp-SystemTextJson/test/inputs/schema/integer-type.schema/default/QuickType.cs
index a52c0dd..30e6c27 100644
--- a/base/schema-csharp-SystemTextJson/test/inputs/schema/integer-type.schema/default/QuickType.cs
+++ b/head/schema-csharp-SystemTextJson/test/inputs/schema/integer-type.schema/default/QuickType.cs
@@ -24,34 +24,42 @@ namespace QuickType
     {
         [JsonRequired]
         [JsonPropertyName("above_i32_max")]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long AboveI32Max { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("below_i32_min")]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long BelowI32Min { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("i32_range")]
+        [JsonConverter(typeof(TentacledMinMaxValueCheckConverter))]
         public long I32Range { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("large_bounds")]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long LargeBounds { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("only_maximum")]
+        [JsonConverter(typeof(IndigoMinMaxValueCheckConverter))]
         public long OnlyMaximum { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("only_minimum")]
+        [JsonConverter(typeof(IndecentMinMaxValueCheckConverter))]
         public long OnlyMinimum { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("small_negative")]
+        [JsonConverter(typeof(HilariousMinMaxValueCheckConverter))]
         public long SmallNegative { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("small_positive")]
+        [JsonConverter(typeof(AmbitiousMinMaxValueCheckConverter))]
         public long SmallPositive { get; set; }
 
         [JsonRequired]
@@ -81,6 +89,222 @@ namespace QuickType
             },
         };
     }
+
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 0 && value <= 2147483648)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 0 && value <= 2147483648)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= -2147483649 && value <= 0)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= -2147483649 && value <= 0)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
+    }
+
+    internal class TentacledMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= -2147483648 && value <= 2147483647)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= -2147483648 && value <= 2147483647)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly TentacledMinMaxValueCheckConverter Singleton = new TentacledMinMaxValueCheckConverter();
+    }
+
+    internal class StickyMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= -9007199254740991 && value <= 9007199254740991)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= -9007199254740991 && value <= 9007199254740991)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly StickyMinMaxValueCheckConverter Singleton = new StickyMinMaxValueCheckConverter();
+    }
+
+    internal class IndigoMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value <= 0)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value <= 0)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly IndigoMinMaxValueCheckConverter Singleton = new IndigoMinMaxValueCheckConverter();
+    }
+
+    internal class IndecentMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 0)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 0)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly IndecentMinMaxValueCheckConverter Singleton = new IndecentMinMaxValueCheckConverter();
+    }
+
+    internal class HilariousMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= -100 && value <= 0)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= -100 && value <= 0)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly HilariousMinMaxValueCheckConverter Singleton = new HilariousMinMaxValueCheckConverter();
+    }
+
+    internal class AmbitiousMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 0 && value <= 100)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 0 && value <= 100)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly AmbitiousMinMaxValueCheckConverter Singleton = new AmbitiousMinMaxValueCheckConverter();
+    }
     
     public class DateOnlyConverter : JsonConverter<DateOnly>
     {
diff --git a/base/schema-csharp-SystemTextJson/test/inputs/schema/minmax-integer.schema/default/QuickType.cs b/head/schema-csharp-SystemTextJson/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
index 271b440..4339f35 100644
--- a/base/schema-csharp-SystemTextJson/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
+++ b/head/schema-csharp-SystemTextJson/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
@@ -28,22 +28,27 @@ namespace QuickType
 
         [JsonRequired]
         [JsonPropertyName("intersection")]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long Intersection { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("max")]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long Max { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("min")]
+        [JsonConverter(typeof(TentacledMinMaxValueCheckConverter))]
         public long Min { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("minmax")]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long Minmax { get; set; }
 
         [JsonRequired]
         [JsonPropertyName("minMaxIntersection")]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long MinMaxIntersection { get; set; }
 
         [JsonRequired]
@@ -52,6 +57,7 @@ namespace QuickType
 
         [JsonRequired]
         [JsonPropertyName("union")]
+        [JsonConverter(typeof(IndigoMinMaxValueCheckConverter))]
         public long Union { get; set; }
     }
 
@@ -77,6 +83,141 @@ namespace QuickType
             },
         };
     }
+
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 4 && value <= 5)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 4 && value <= 5)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value <= 5)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value <= 5)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
+    }
+
+    internal class TentacledMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 3)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 3)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly TentacledMinMaxValueCheckConverter Singleton = new TentacledMinMaxValueCheckConverter();
+    }
+
+    internal class StickyMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 3 && value <= 5)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 3 && value <= 5)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly StickyMinMaxValueCheckConverter Singleton = new StickyMinMaxValueCheckConverter();
+    }
+
+    internal class IndigoMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 3 && value <= 6)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 3 && value <= 6)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly IndigoMinMaxValueCheckConverter Singleton = new IndigoMinMaxValueCheckConverter();
+    }
     
     public class DateOnlyConverter : JsonConverter<DateOnly>
     {
diff --git a/base/schema-csharp-SystemTextJson/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs b/head/schema-csharp-SystemTextJson/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
index f15eb9b..19c6094 100644
--- a/base/schema-csharp-SystemTextJson/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
+++ b/head/schema-csharp-SystemTextJson/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
@@ -28,6 +28,7 @@ namespace QuickType
 
         [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
         [JsonPropertyName("count")]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long? Count { get; set; }
 
         [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -41,6 +42,7 @@ namespace QuickType
 
         [JsonRequired]
         [JsonPropertyName("requiredCount")]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long RequiredCount { get; set; }
 
         [JsonRequired]
@@ -50,7 +52,7 @@ namespace QuickType
 
         [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
         [JsonPropertyName("weight")]
-        [JsonConverter(typeof(MinMaxValueCheckConverter))]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public double? Weight { get; set; }
     }
 
@@ -88,6 +90,33 @@ namespace QuickType
         };
     }
 
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 1 && value <= 100)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 1 && value <= 100)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
     internal class MinMaxLengthCheckConverter : JsonConverter<string>
     {
         public override bool CanConvert(Type t) => t == typeof(string);
@@ -115,7 +144,7 @@ namespace QuickType
         public static readonly MinMaxLengthCheckConverter Singleton = new MinMaxLengthCheckConverter();
     }
 
-    internal class MinMaxValueCheckConverter : JsonConverter<double>
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter<double>
     {
         public override bool CanConvert(Type t) => t == typeof(double);
 
@@ -139,7 +168,7 @@ namespace QuickType
             throw new NotSupportedException("Cannot marshal type double");
         }
 
-        public static readonly MinMaxValueCheckConverter Singleton = new MinMaxValueCheckConverter();
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
     }
     
     public class DateOnlyConverter : JsonConverter<DateOnly>
diff --git a/base/schema-csharp-SystemTextJson/test/inputs/schema/optional-constraints.schema/default/QuickType.cs b/head/schema-csharp-SystemTextJson/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
index f834abf..a701f79 100644
--- a/base/schema-csharp-SystemTextJson/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
+++ b/head/schema-csharp-SystemTextJson/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
@@ -24,11 +24,12 @@ namespace QuickType
     {
         [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
         [JsonPropertyName("optDouble")]
-        [JsonConverter(typeof(MinMaxValueCheckConverter))]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public double? OptDouble { get; set; }
 
         [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
         [JsonPropertyName("optInt")]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long? OptInt { get; set; }
 
         [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -42,6 +43,7 @@ namespace QuickType
 
         [JsonRequired]
         [JsonPropertyName("reqZeroMin")]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long ReqZeroMin { get; set; }
     }
 
@@ -68,7 +70,7 @@ namespace QuickType
         };
     }
 
-    internal class MinMaxValueCheckConverter : JsonConverter<double>
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter<double>
     {
         public override bool CanConvert(Type t) => t == typeof(double);
 
@@ -92,7 +94,34 @@ namespace QuickType
             throw new NotSupportedException("Cannot marshal type double");
         }
 
-        public static readonly MinMaxValueCheckConverter Singleton = new MinMaxValueCheckConverter();
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter<long>
+    {
+        public override bool CanConvert(Type t) => t == typeof(long);
+
+        public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            var value = reader.GetInt64();
+            if (value >= 0 && value <= 100)
+            {
+                return value;
+            }
+            throw new JsonException("Cannot unmarshal type long");
+        }
+
+        public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
+        {
+            if (value >= 0 && value <= 100)
+            {
+                JsonSerializer.Serialize(writer, value, options);
+                return;
+            }
+            throw new NotSupportedException("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
     }
 
     internal class MinMaxLengthCheckConverter : JsonConverter<string>
diff --git a/base/schema-csharp-records/test/inputs/schema/integer-type.schema/default/QuickType.cs b/head/schema-csharp-records/test/inputs/schema/integer-type.schema/default/QuickType.cs
index 368dd60..a955f14 100644
--- a/base/schema-csharp-records/test/inputs/schema/integer-type.schema/default/QuickType.cs
+++ b/head/schema-csharp-records/test/inputs/schema/integer-type.schema/default/QuickType.cs
@@ -26,27 +26,35 @@ namespace QuickType
     public partial record TopLevel
     {
         [JsonProperty("above_i32_max", Required = Required.Always)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long AboveI32Max { get; set; }
 
         [JsonProperty("below_i32_min", Required = Required.Always)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long BelowI32Min { get; set; }
 
         [JsonProperty("i32_range", Required = Required.Always)]
+        [JsonConverter(typeof(TentacledMinMaxValueCheckConverter))]
         public long I32Range { get; set; }
 
         [JsonProperty("large_bounds", Required = Required.Always)]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long LargeBounds { get; set; }
 
         [JsonProperty("only_maximum", Required = Required.Always)]
+        [JsonConverter(typeof(IndigoMinMaxValueCheckConverter))]
         public long OnlyMaximum { get; set; }
 
         [JsonProperty("only_minimum", Required = Required.Always)]
+        [JsonConverter(typeof(IndecentMinMaxValueCheckConverter))]
         public long OnlyMinimum { get; set; }
 
         [JsonProperty("small_negative", Required = Required.Always)]
+        [JsonConverter(typeof(HilariousMinMaxValueCheckConverter))]
         public long SmallNegative { get; set; }
 
         [JsonProperty("small_positive", Required = Required.Always)]
+        [JsonConverter(typeof(AmbitiousMinMaxValueCheckConverter))]
         public long SmallPositive { get; set; }
 
         [JsonProperty("unbounded", Required = Required.Always)]
@@ -75,6 +83,278 @@ namespace QuickType
             },
         };
     }
+
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0 && value <= 2147483648)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0 && value <= 2147483648)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -2147483649 && value <= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -2147483649 && value <= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
+    }
+
+    internal class TentacledMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -2147483648 && value <= 2147483647)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -2147483648 && value <= 2147483647)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly TentacledMinMaxValueCheckConverter Singleton = new TentacledMinMaxValueCheckConverter();
+    }
+
+    internal class StickyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -9007199254740991 && value <= 9007199254740991)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -9007199254740991 && value <= 9007199254740991)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly StickyMinMaxValueCheckConverter Singleton = new StickyMinMaxValueCheckConverter();
+    }
+
+    internal class IndigoMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value <= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value <= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly IndigoMinMaxValueCheckConverter Singleton = new IndigoMinMaxValueCheckConverter();
+    }
+
+    internal class IndecentMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly IndecentMinMaxValueCheckConverter Singleton = new IndecentMinMaxValueCheckConverter();
+    }
+
+    internal class HilariousMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= -100 && value <= 0)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= -100 && value <= 0)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly HilariousMinMaxValueCheckConverter Singleton = new HilariousMinMaxValueCheckConverter();
+    }
+
+    internal class AmbitiousMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0 && value <= 100)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0 && value <= 100)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly AmbitiousMinMaxValueCheckConverter Singleton = new AmbitiousMinMaxValueCheckConverter();
+    }
 }
 #pragma warning restore CS8618
 #pragma warning restore CS8601
diff --git a/base/schema-csharp-records/test/inputs/schema/minmax-integer.schema/default/QuickType.cs b/head/schema-csharp-records/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
index ca81abc..15d23d9 100644
--- a/base/schema-csharp-records/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
+++ b/head/schema-csharp-records/test/inputs/schema/minmax-integer.schema/default/QuickType.cs
@@ -29,24 +29,30 @@ namespace QuickType
         public long Free { get; set; }
 
         [JsonProperty("intersection", Required = Required.Always)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long Intersection { get; set; }
 
         [JsonProperty("max", Required = Required.Always)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long Max { get; set; }
 
         [JsonProperty("min", Required = Required.Always)]
+        [JsonConverter(typeof(TentacledMinMaxValueCheckConverter))]
         public long Min { get; set; }
 
         [JsonProperty("minmax", Required = Required.Always)]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long Minmax { get; set; }
 
         [JsonProperty("minMaxIntersection", Required = Required.Always)]
+        [JsonConverter(typeof(StickyMinMaxValueCheckConverter))]
         public long MinMaxIntersection { get; set; }
 
         [JsonProperty("minMaxUnion", Required = Required.Always)]
         public long MinMaxUnion { get; set; }
 
         [JsonProperty("union", Required = Required.Always)]
+        [JsonConverter(typeof(IndigoMinMaxValueCheckConverter))]
         public long Union { get; set; }
     }
 
@@ -72,6 +78,176 @@ namespace QuickType
             },
         };
     }
+
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 4 && value <= 5)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 4 && value <= 5)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value <= 5)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value <= 5)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
+    }
+
+    internal class TentacledMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 3)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 3)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly TentacledMinMaxValueCheckConverter Singleton = new TentacledMinMaxValueCheckConverter();
+    }
+
+    internal class StickyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 3 && value <= 5)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 3 && value <= 5)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly StickyMinMaxValueCheckConverter Singleton = new StickyMinMaxValueCheckConverter();
+    }
+
+    internal class IndigoMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 3 && value <= 6)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 3 && value <= 6)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly IndigoMinMaxValueCheckConverter Singleton = new IndigoMinMaxValueCheckConverter();
+    }
 }
 #pragma warning restore CS8618
 #pragma warning restore CS8601
diff --git a/base/schema-csharp-records/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs b/head/schema-csharp-records/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
index 4e6ea38..5313012 100644
--- a/base/schema-csharp-records/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
+++ b/head/schema-csharp-records/test/inputs/schema/optional-const-ref.schema/default/QuickType.cs
@@ -29,6 +29,7 @@ namespace QuickType
         public Coordinate[]? Coordinates { get; set; }
 
         [JsonProperty("count", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long? Count { get; set; }
 
         [JsonProperty("label", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
@@ -39,6 +40,7 @@ namespace QuickType
         public Coordinate[] RequiredCoordinates { get; set; }
 
         [JsonProperty("requiredCount", Required = Required.Always)]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public long RequiredCount { get; set; }
 
         [JsonProperty("requiredLabel", Required = Required.Always)]
@@ -46,7 +48,7 @@ namespace QuickType
         public string RequiredLabel { get; set; }
 
         [JsonProperty("weight", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
-        [JsonConverter(typeof(MinMaxValueCheckConverter))]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public double? Weight { get; set; }
     }
 
@@ -82,6 +84,40 @@ namespace QuickType
         };
     }
 
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 1 && value <= 100)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 1 && value <= 100)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
     internal class MinMaxLengthCheckConverter : JsonConverter
     {
         public override bool CanConvert(Type t) => t == typeof(string);
@@ -110,7 +146,7 @@ namespace QuickType
         public static readonly MinMaxLengthCheckConverter Singleton = new MinMaxLengthCheckConverter();
     }
 
-    internal class MinMaxValueCheckConverter : JsonConverter
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
     {
         public override bool CanConvert(Type t) => t == typeof(double) || t == typeof(double?);
 
@@ -141,7 +177,7 @@ namespace QuickType
             throw new Exception("Cannot marshal type double");
         }
 
-        public static readonly MinMaxValueCheckConverter Singleton = new MinMaxValueCheckConverter();
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
     }
 }
 #pragma warning restore CS8618
diff --git a/base/schema-csharp-records/test/inputs/schema/optional-constraints.schema/default/QuickType.cs b/head/schema-csharp-records/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
index 7a92f3f..48d1974 100644
--- a/base/schema-csharp-records/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
+++ b/head/schema-csharp-records/test/inputs/schema/optional-constraints.schema/default/QuickType.cs
@@ -26,10 +26,11 @@ namespace QuickType
     public partial record TopLevel
     {
         [JsonProperty("optDouble", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
-        [JsonConverter(typeof(MinMaxValueCheckConverter))]
+        [JsonConverter(typeof(PurpleMinMaxValueCheckConverter))]
         public double? OptDouble { get; set; }
 
         [JsonProperty("optInt", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long? OptInt { get; set; }
 
         [JsonProperty("optPattern", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
@@ -40,6 +41,7 @@ namespace QuickType
         public string? OptString { get; set; }
 
         [JsonProperty("reqZeroMin", Required = Required.Always)]
+        [JsonConverter(typeof(FluffyMinMaxValueCheckConverter))]
         public long ReqZeroMin { get; set; }
     }
 
@@ -66,7 +68,7 @@ namespace QuickType
         };
     }
 
-    internal class MinMaxValueCheckConverter : JsonConverter
+    internal class PurpleMinMaxValueCheckConverter : JsonConverter
     {
         public override bool CanConvert(Type t) => t == typeof(double) || t == typeof(double?);
 
@@ -97,7 +99,41 @@ namespace QuickType
             throw new Exception("Cannot marshal type double");
         }
 
-        public static readonly MinMaxValueCheckConverter Singleton = new MinMaxValueCheckConverter();
+        public static readonly PurpleMinMaxValueCheckConverter Singleton = new PurpleMinMaxValueCheckConverter();
+    }
+
+    internal class FluffyMinMaxValueCheckConverter : JsonConverter
+    {
+        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
+
+        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
+        {
+            if (reader.TokenType == JsonToken.Null) return null;
+            var value = serializer.Deserialize<long>(reader);
+            if (value >= 0 && value <= 100)
+            {
+                return value;
+            }
+            throw new Exception("Cannot unmarshal type long");
+        }
+
+        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
+        {
+            if (untypedValue == null)
+            {
+                serializer.Serialize(writer, null);
+                return;
+            }
+            var value = (long)untypedValue;
+            if (value >= 0 && value <= 100)
+            {
+                serializer.Serialize(writer, value);
+                return;
+            }
+            throw new Exception("Cannot marshal type long");
+        }
+
+        public static readonly FluffyMinMaxValueCheckConverter Singleton = new FluffyMinMaxValueCheckConverter();
     }
 
     internal class MinMaxLengthCheckConverter : JsonConverter
diff --git a/base/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex
index fd71797..fda14ff 100644
--- a/base/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex
@@ -12,9 +12,15 @@ defmodule UnionClass do
           quux: integer() | nil
         }
 
+  def decode_quux(value) when is_integer(value), do: value
+  def decode_quux(_), do: {:error, "Unexpected type when decoding UnionClass.quux"}
+
+  def encode_quux(value) when is_integer(value), do: value
+  def encode_quux(_), do: {:error, "Unexpected type when encoding UnionClass.quux"}
+
   def from_map(m) do
     %UnionClass{
-      quux: m["quux"],
+      quux: m["quux"] && decode_quux(m["quux"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
index 9f4fd44..7c0ed78 100644
--- a/base/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
@@ -119,6 +119,14 @@ defmodule TopLevel do
           union: float() | String.t()
         }
 
+  def decode_foo(value) when is_float(value), do: value
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_float(value), do: value
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def decode_object_or_string(%{"prop" => _,} = value), do: ObjectOrStringClass.from_map(value)
   def decode_object_or_string(value) when is_binary(value), do: value
   def decode_object_or_string(_), do: {:error, "Unexpected type when decoding TopLevel.object_or_string"}
@@ -131,7 +139,7 @@ defmodule TopLevel do
     %TopLevel{
       bar: m["bar"],
       enum: EnumEnum.decode(m["enum"]),
-      foo: m["foo"],
+      foo: m["foo"] && decode_foo(m["foo"]),
       object_or_string: decode_object_or_string(m["object-or-string"]),
       union: Map.fetch!(m, "union"),
     }
diff --git a/base/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex
index 257b3a8..51cd70c 100644
--- a/base/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex
@@ -21,49 +21,49 @@ defmodule TopLevel do
           unbounded: integer()
         }
 
-  def decode_above_i32_max(value) when is_integer(value), do: value
+  def decode_above_i32_max(value) when is_integer(value) and value >= 0 and value <= 2147483648, do: value
   def decode_above_i32_max(_), do: {:error, "Unexpected type when decoding TopLevel.above_i32_max"}
 
   def encode_above_i32_max(value) when is_integer(value), do: value
   def encode_above_i32_max(_), do: {:error, "Unexpected type when encoding TopLevel.above_i32_max"}
 
-  def decode_below_i32_min(value) when is_integer(value), do: value
+  def decode_below_i32_min(value) when is_integer(value) and value >= -2147483649 and value <= 0, do: value
   def decode_below_i32_min(_), do: {:error, "Unexpected type when decoding TopLevel.below_i32_min"}
 
   def encode_below_i32_min(value) when is_integer(value), do: value
   def encode_below_i32_min(_), do: {:error, "Unexpected type when encoding TopLevel.below_i32_min"}
 
-  def decode_i32_range(value) when is_integer(value), do: value
+  def decode_i32_range(value) when is_integer(value) and value >= -2147483648 and value <= 2147483647, do: value
   def decode_i32_range(_), do: {:error, "Unexpected type when decoding TopLevel.i32_range"}
 
   def encode_i32_range(value) when is_integer(value), do: value
   def encode_i32_range(_), do: {:error, "Unexpected type when encoding TopLevel.i32_range"}
 
-  def decode_large_bounds(value) when is_integer(value), do: value
+  def decode_large_bounds(value) when is_integer(value) and value >= -9007199254740991 and value <= 9007199254740991, do: value
   def decode_large_bounds(_), do: {:error, "Unexpected type when decoding TopLevel.large_bounds"}
 
   def encode_large_bounds(value) when is_integer(value), do: value
   def encode_large_bounds(_), do: {:error, "Unexpected type when encoding TopLevel.large_bounds"}
 
-  def decode_only_maximum(value) when is_integer(value), do: value
+  def decode_only_maximum(value) when is_integer(value) and value <= 0, do: value
   def decode_only_maximum(_), do: {:error, "Unexpected type when decoding TopLevel.only_maximum"}
 
   def encode_only_maximum(value) when is_integer(value), do: value
   def encode_only_maximum(_), do: {:error, "Unexpected type when encoding TopLevel.only_maximum"}
 
-  def decode_only_minimum(value) when is_integer(value), do: value
+  def decode_only_minimum(value) when is_integer(value) and value >= 0, do: value
   def decode_only_minimum(_), do: {:error, "Unexpected type when decoding TopLevel.only_minimum"}
 
   def encode_only_minimum(value) when is_integer(value), do: value
   def encode_only_minimum(_), do: {:error, "Unexpected type when encoding TopLevel.only_minimum"}
 
-  def decode_small_negative(value) when is_integer(value), do: value
+  def decode_small_negative(value) when is_integer(value) and value >= -100 and value <= 0, do: value
   def decode_small_negative(_), do: {:error, "Unexpected type when decoding TopLevel.small_negative"}
 
   def encode_small_negative(value) when is_integer(value), do: value
   def encode_small_negative(_), do: {:error, "Unexpected type when encoding TopLevel.small_negative"}
 
-  def decode_small_positive(value) when is_integer(value), do: value
+  def decode_small_positive(value) when is_integer(value) and value >= 0 and value <= 100, do: value
   def decode_small_positive(_), do: {:error, "Unexpected type when decoding TopLevel.small_positive"}
 
   def encode_small_positive(value) when is_integer(value), do: value
diff --git a/base/schema-elixir/test/inputs/schema/intersection-nested.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/intersection-nested.schema/default/QuickType.ex
index b63f615..94910eb 100644
--- a/base/schema-elixir/test/inputs/schema/intersection-nested.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/intersection-nested.schema/default/QuickType.ex
@@ -12,9 +12,17 @@ defmodule TopLevel do
           intersection: float() | nil
         }
 
+  def decode_intersection(value) when is_float(value), do: value
+  def decode_intersection(value) when is_integer(value), do: value
+  def decode_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.intersection"}
+
+  def encode_intersection(value) when is_float(value), do: value
+  def encode_intersection(value) when is_integer(value), do: value
+  def encode_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.intersection"}
+
   def from_map(m) do
     %TopLevel{
-      intersection: m["intersection"],
+      intersection: m["intersection"] && decode_intersection(m["intersection"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/keyword-unions.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/keyword-unions.schema/default/QuickType.ex
index 4d138dd..596140d 100644
--- a/base/schema-elixir/test/inputs/schema/keyword-unions.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/keyword-unions.schema/default/QuickType.ex
@@ -9204,6 +9204,14 @@ defmodule TopLevel do
   def encode_double(value) when is_nil(value), do: value
   def encode_double(_), do: {:error, "Unexpected type when encoding TopLevel.double"}
 
+  def decode_dummy(value) when is_float(value), do: value
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding TopLevel.dummy"}
+
+  def encode_dummy(value) when is_float(value), do: value
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding TopLevel.dummy"}
+
   def decode_dynamic(%{} = value), do: Dynamic.from_map(value)
   def decode_dynamic(value) when is_float(value), do: value
   def decode_dynamic(value) when is_integer(value), do: value
@@ -11682,7 +11690,7 @@ defmodule TopLevel do
       did_set: decode_did_set(m["didSet"]),
       top_level_do: decode_top_level_do(m["do"]),
       double: decode_double(m["double"]),
-      dummy: m["dummy"],
+      dummy: m["dummy"] && decode_dummy(m["dummy"]),
       dynamic: decode_dynamic(m["dynamic"]),
       dynamic_cast: decode_dynamic_cast(m["dynamic_cast"]),
       elif: decode_elif(m["elif"]),
diff --git a/base/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex
index 9129fbd..26774ba 100644
--- a/base/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex
@@ -26,31 +26,31 @@ defmodule TopLevel do
   def encode_free(value) when is_integer(value), do: value
   def encode_free(_), do: {:error, "Unexpected type when encoding TopLevel.free"}
 
-  def decode_intersection(value) when is_integer(value), do: value
+  def decode_intersection(value) when is_integer(value) and value >= 4 and value <= 5, do: value
   def decode_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.intersection"}
 
   def encode_intersection(value) when is_integer(value), do: value
   def encode_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.intersection"}
 
-  def decode_max(value) when is_integer(value), do: value
+  def decode_max(value) when is_integer(value) and value <= 5, do: value
   def decode_max(_), do: {:error, "Unexpected type when decoding TopLevel.max"}
 
   def encode_max(value) when is_integer(value), do: value
   def encode_max(_), do: {:error, "Unexpected type when encoding TopLevel.max"}
 
-  def decode_min(value) when is_integer(value), do: value
+  def decode_min(value) when is_integer(value) and value >= 3, do: value
   def decode_min(_), do: {:error, "Unexpected type when decoding TopLevel.min"}
 
   def encode_min(value) when is_integer(value), do: value
   def encode_min(_), do: {:error, "Unexpected type when encoding TopLevel.min"}
 
-  def decode_minmax(value) when is_integer(value), do: value
+  def decode_minmax(value) when is_integer(value) and value >= 3 and value <= 5, do: value
   def decode_minmax(_), do: {:error, "Unexpected type when decoding TopLevel.minmax"}
 
   def encode_minmax(value) when is_integer(value), do: value
   def encode_minmax(_), do: {:error, "Unexpected type when encoding TopLevel.minmax"}
 
-  def decode_min_max_intersection(value) when is_integer(value), do: value
+  def decode_min_max_intersection(value) when is_integer(value) and value >= 3 and value <= 5, do: value
   def decode_min_max_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_intersection"}
 
   def encode_min_max_intersection(value) when is_integer(value), do: value
@@ -62,7 +62,7 @@ defmodule TopLevel do
   def encode_min_max_union(value) when is_integer(value), do: value
   def encode_min_max_union(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_union"}
 
-  def decode_union(value) when is_integer(value), do: value
+  def decode_union(value) when is_integer(value) and value >= 3 and value <= 6, do: value
   def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
 
   def encode_union(value) when is_integer(value), do: value
diff --git a/base/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex
index 3ffe159..2efb8a7 100644
--- a/base/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex
@@ -28,40 +28,40 @@ defmodule TopLevel do
   def encode_free(value) when is_integer(value), do: value
   def encode_free(_), do: {:error, "Unexpected type when encoding TopLevel.free"}
 
-  def decode_intersection(value) when is_float(value), do: value
-  def decode_intersection(value) when is_integer(value), do: value
+  def decode_intersection(value) when is_float(value) and value >= 4 and value <= 5, do: value
+  def decode_intersection(value) when is_integer(value) and value >= 4 and value <= 5, do: value
   def decode_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.intersection"}
 
   def encode_intersection(value) when is_float(value), do: value
   def encode_intersection(value) when is_integer(value), do: value
   def encode_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.intersection"}
 
-  def decode_max(value) when is_float(value), do: value
-  def decode_max(value) when is_integer(value), do: value
+  def decode_max(value) when is_float(value) and value <= 5, do: value
+  def decode_max(value) when is_integer(value) and value <= 5, do: value
   def decode_max(_), do: {:error, "Unexpected type when decoding TopLevel.max"}
 
   def encode_max(value) when is_float(value), do: value
   def encode_max(value) when is_integer(value), do: value
   def encode_max(_), do: {:error, "Unexpected type when encoding TopLevel.max"}
 
-  def decode_min(value) when is_float(value), do: value
-  def decode_min(value) when is_integer(value), do: value
+  def decode_min(value) when is_float(value) and value >= 3, do: value
+  def decode_min(value) when is_integer(value) and value >= 3, do: value
   def decode_min(_), do: {:error, "Unexpected type when decoding TopLevel.min"}
 
   def encode_min(value) when is_float(value), do: value
   def encode_min(value) when is_integer(value), do: value
   def encode_min(_), do: {:error, "Unexpected type when encoding TopLevel.min"}
 
-  def decode_minmax(value) when is_float(value), do: value
-  def decode_minmax(value) when is_integer(value), do: value
+  def decode_minmax(value) when is_float(value) and value >= 3 and value <= 5, do: value
+  def decode_minmax(value) when is_integer(value) and value >= 3 and value <= 5, do: value
   def decode_minmax(_), do: {:error, "Unexpected type when decoding TopLevel.minmax"}
 
   def encode_minmax(value) when is_float(value), do: value
   def encode_minmax(value) when is_integer(value), do: value
   def encode_minmax(_), do: {:error, "Unexpected type when encoding TopLevel.minmax"}
 
-  def decode_min_max_intersection(value) when is_float(value), do: value
-  def decode_min_max_intersection(value) when is_integer(value), do: value
+  def decode_min_max_intersection(value) when is_float(value) and value >= 3 and value <= 5, do: value
+  def decode_min_max_intersection(value) when is_integer(value) and value >= 3 and value <= 5, do: value
   def decode_min_max_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_intersection"}
 
   def encode_min_max_intersection(value) when is_float(value), do: value
@@ -76,8 +76,8 @@ defmodule TopLevel do
   def encode_min_max_union(value) when is_integer(value), do: value
   def encode_min_max_union(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_union"}
 
-  def decode_union(value) when is_float(value), do: value
-  def decode_union(value) when is_integer(value), do: value
+  def decode_union(value) when is_float(value) and value >= 3 and value <= 6, do: value
+  def decode_union(value) when is_integer(value) and value >= 3 and value <= 6, do: value
   def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
 
   def encode_union(value) when is_float(value), do: value
diff --git a/base/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex
index 145fa38..a3fb21b 100644
--- a/base/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex
@@ -71,6 +71,12 @@ defmodule TopLevel do
           weight: float() | nil
         }
 
+  def decode_count(value) when is_integer(value) and value >= 1 and value <= 100, do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
   def decode_label(value) when is_binary(value) do
     if String.length(value) >= 2 and String.length(value) <= 16, do: value, else: raise(ArgumentError)
   end
@@ -85,7 +91,7 @@ defmodule TopLevel do
   def encode_required_coordinates(value) when is_list(value), do: value
   def encode_required_coordinates(_), do: {:error, "Unexpected type when encoding TopLevel.required_coordinates"}
 
-  def decode_required_count(value) when is_integer(value), do: value
+  def decode_required_count(value) when is_integer(value) and value >= 1 and value <= 100, do: value
   def decode_required_count(_), do: {:error, "Unexpected type when decoding TopLevel.required_count"}
 
   def encode_required_count(value) when is_integer(value), do: value
@@ -99,15 +105,23 @@ defmodule TopLevel do
   def encode_required_label(value) when is_binary(value), do: value
   def encode_required_label(_), do: {:error, "Unexpected type when encoding TopLevel.required_label"}
 
+  def decode_weight(value) when is_float(value) and value >= 0.5 and value <= 99.5, do: value
+  def decode_weight(value) when is_integer(value) and value >= 0.5 and value <= 99.5, do: value
+  def decode_weight(_), do: {:error, "Unexpected type when decoding TopLevel.weight"}
+
+  def encode_weight(value) when is_float(value), do: value
+  def encode_weight(value) when is_integer(value), do: value
+  def encode_weight(_), do: {:error, "Unexpected type when encoding TopLevel.weight"}
+
   def from_map(m) do
     %TopLevel{
       coordinates: m["coordinates"] && Enum.map(m["coordinates"], &Coordinate.from_map/1),
-      count: m["count"],
+      count: m["count"] && decode_count(m["count"]),
       label: m["label"] && decode_label(m["label"]),
       required_coordinates: Enum.map(m["requiredCoordinates"], &Coordinate.from_map/1),
       required_count: decode_required_count(m["requiredCount"]),
       required_label: decode_required_label(m["requiredLabel"]),
-      weight: m["weight"],
+      weight: m["weight"] && decode_weight(m["weight"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex
index 18cefc2..81f9584 100644
--- a/base/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex
@@ -17,6 +17,20 @@ defmodule TopLevel do
           req_zero_min: integer()
         }
 
+  def decode_opt_double(value) when is_float(value) and value >= 0.5 and value <= 99.5, do: value
+  def decode_opt_double(value) when is_integer(value) and value >= 0.5 and value <= 99.5, do: value
+  def decode_opt_double(_), do: {:error, "Unexpected type when decoding TopLevel.opt_double"}
+
+  def encode_opt_double(value) when is_float(value), do: value
+  def encode_opt_double(value) when is_integer(value), do: value
+  def encode_opt_double(_), do: {:error, "Unexpected type when encoding TopLevel.opt_double"}
+
+  def decode_opt_int(value) when is_integer(value) and value >= 0 and value <= 100, do: value
+  def decode_opt_int(_), do: {:error, "Unexpected type when decoding TopLevel.opt_int"}
+
+  def encode_opt_int(value) when is_integer(value), do: value
+  def encode_opt_int(_), do: {:error, "Unexpected type when encoding TopLevel.opt_int"}
+
   def decode_opt_pattern(value) when is_binary(value) do
     if Regex.match?(Regex.compile!("^[a-z]+$"), value), do: value, else: raise(ArgumentError)
   end
@@ -33,7 +47,7 @@ defmodule TopLevel do
   def encode_opt_string(value) when is_binary(value), do: value
   def encode_opt_string(_), do: {:error, "Unexpected type when encoding TopLevel.opt_string"}
 
-  def decode_req_zero_min(value) when is_integer(value), do: value
+  def decode_req_zero_min(value) when is_integer(value) and value >= 0 and value <= 100, do: value
   def decode_req_zero_min(_), do: {:error, "Unexpected type when decoding TopLevel.req_zero_min"}
 
   def encode_req_zero_min(value) when is_integer(value), do: value
@@ -41,8 +55,8 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      opt_double: m["optDouble"],
-      opt_int: m["optInt"],
+      opt_double: m["optDouble"] && decode_opt_double(m["optDouble"]),
+      opt_int: m["optInt"] && decode_opt_int(m["optInt"]),
       opt_pattern: m["optPattern"] && decode_opt_pattern(m["optPattern"]),
       opt_string: m["optString"] && decode_opt_string(m["optString"]),
       req_zero_min: decode_req_zero_min(m["reqZeroMin"]),
diff --git a/base/schema-elixir/test/inputs/schema/renaming-bug.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/renaming-bug.schema/default/QuickType.ex
index a1db657..8084788 100644
--- a/base/schema-elixir/test/inputs/schema/renaming-bug.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/renaming-bug.schema/default/QuickType.ex
@@ -12,9 +12,17 @@ defmodule Color do
           rgb: float() | nil
         }
 
+  def decode_rgb(value) when is_float(value), do: value
+  def decode_rgb(value) when is_integer(value), do: value
+  def decode_rgb(_), do: {:error, "Unexpected type when decoding Color.rgb"}
+
+  def encode_rgb(value) when is_float(value), do: value
+  def encode_rgb(value) when is_integer(value), do: value
+  def encode_rgb(_), do: {:error, "Unexpected type when encoding Color.rgb"}
+
   def from_map(m) do
     %Color{
-      rgb: m["rgb"],
+      rgb: m["rgb"] && decode_rgb(m["rgb"]),
     }
   end
 
@@ -363,10 +371,26 @@ defmodule Limit do
           minimum: float() | nil
         }
 
+  def decode_maximum(value) when is_float(value), do: value
+  def decode_maximum(value) when is_integer(value), do: value
+  def decode_maximum(_), do: {:error, "Unexpected type when decoding Limit.maximum"}
+
+  def encode_maximum(value) when is_float(value), do: value
+  def encode_maximum(value) when is_integer(value), do: value
+  def encode_maximum(_), do: {:error, "Unexpected type when encoding Limit.maximum"}
+
+  def decode_minimum(value) when is_float(value), do: value
+  def decode_minimum(value) when is_integer(value), do: value
+  def decode_minimum(_), do: {:error, "Unexpected type when decoding Limit.minimum"}
+
+  def encode_minimum(value) when is_float(value), do: value
+  def encode_minimum(value) when is_integer(value), do: value
+  def encode_minimum(_), do: {:error, "Unexpected type when encoding Limit.minimum"}
+
   def from_map(m) do
     %Limit{
-      maximum: m["maximum"],
-      minimum: m["minimum"],
+      maximum: m["maximum"] && decode_maximum(m["maximum"]),
+      minimum: m["minimum"] && decode_minimum(m["minimum"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex
index 154049c..e8b9e64 100644
--- a/base/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex
@@ -22,8 +22,8 @@ defmodule TopLevel do
   def encode_min_max_length(value) when is_binary(value), do: value
   def encode_min_max_length(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_length"}
 
-  def decode_percent(value) when is_float(value), do: value
-  def decode_percent(value) when is_integer(value), do: value
+  def decode_percent(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_percent(value) when is_integer(value) and value >= 0 and value <= 1, do: value
   def decode_percent(_), do: {:error, "Unexpected type when decoding TopLevel.percent"}
 
   def encode_percent(value) when is_float(value), do: value
diff --git a/base/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex
index 3ab5043..0eb30c4 100644
--- a/base/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex
@@ -15,17 +15,31 @@ defmodule TopLevelElement do
           three: float() | nil
         }
 
+  def decode_one(value) when is_integer(value), do: value
+  def decode_one(_), do: {:error, "Unexpected type when decoding TopLevelElement.one"}
+
+  def encode_one(value) when is_integer(value), do: value
+  def encode_one(_), do: {:error, "Unexpected type when encoding TopLevelElement.one"}
+
   def decode_two(value) when is_boolean(value), do: value
   def decode_two(_), do: {:error, "Unexpected type when decoding TopLevelElement.two"}
 
   def encode_two(value) when is_boolean(value), do: value
   def encode_two(_), do: {:error, "Unexpected type when encoding TopLevelElement.two"}
 
+  def decode_three(value) when is_float(value), do: value
+  def decode_three(value) when is_integer(value), do: value
+  def decode_three(_), do: {:error, "Unexpected type when decoding TopLevelElement.three"}
+
+  def encode_three(value) when is_float(value), do: value
+  def encode_three(value) when is_integer(value), do: value
+  def encode_three(_), do: {:error, "Unexpected type when encoding TopLevelElement.three"}
+
   def from_map(m) do
     %TopLevelElement{
-      one: m["one"],
+      one: m["one"] && decode_one(m["one"]),
       two: decode_two(m["two"]),
-      three: m["three"],
+      three: m["three"] && decode_three(m["three"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
index 3785892..b2b0c35 100644
--- a/base/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
@@ -661,27 +661,67 @@ defmodule MarkConfig do
           theta: float() | nil
         }
 
+  def decode_angle(value) when is_float(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(value) when is_integer(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding MarkConfig.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding MarkConfig.angle"}
+
   def decode_color(value) when is_binary(value), do: value
   def decode_color(_), do: {:error, "Unexpected type when decoding MarkConfig.color"}
 
   def encode_color(value) when is_binary(value), do: value
   def encode_color(_), do: {:error, "Unexpected type when encoding MarkConfig.color"}
 
+  def decode_dx(value) when is_float(value), do: value
+  def decode_dx(value) when is_integer(value), do: value
+  def decode_dx(_), do: {:error, "Unexpected type when decoding MarkConfig.dx"}
+
+  def encode_dx(value) when is_float(value), do: value
+  def encode_dx(value) when is_integer(value), do: value
+  def encode_dx(_), do: {:error, "Unexpected type when encoding MarkConfig.dx"}
+
+  def decode_dy(value) when is_float(value), do: value
+  def decode_dy(value) when is_integer(value), do: value
+  def decode_dy(_), do: {:error, "Unexpected type when decoding MarkConfig.dy"}
+
+  def encode_dy(value) when is_float(value), do: value
+  def encode_dy(value) when is_integer(value), do: value
+  def encode_dy(_), do: {:error, "Unexpected type when encoding MarkConfig.dy"}
+
   def decode_fill(value) when is_binary(value), do: value
   def decode_fill(_), do: {:error, "Unexpected type when decoding MarkConfig.fill"}
 
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding MarkConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding MarkConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding MarkConfig.fill_opacity"}
+
   def decode_font(value) when is_binary(value), do: value
   def decode_font(_), do: {:error, "Unexpected type when decoding MarkConfig.font"}
 
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding MarkConfig.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding MarkConfig.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding MarkConfig.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding MarkConfig.font_weight"}
 
@@ -697,56 +737,128 @@ defmodule MarkConfig do
   def encode_href(value) when is_binary(value), do: value
   def encode_href(_), do: {:error, "Unexpected type when encoding MarkConfig.href"}
 
+  def decode_limit(value) when is_float(value), do: value
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding MarkConfig.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding MarkConfig.limit"}
+
+  def decode_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(_), do: {:error, "Unexpected type when decoding MarkConfig.opacity"}
+
+  def encode_opacity(value) when is_float(value), do: value
+  def encode_opacity(value) when is_integer(value), do: value
+  def encode_opacity(_), do: {:error, "Unexpected type when encoding MarkConfig.opacity"}
+
+  def decode_radius(value) when is_float(value) and value >= 0, do: value
+  def decode_radius(value) when is_integer(value) and value >= 0, do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding MarkConfig.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding MarkConfig.radius"}
+
   def decode_shape(value) when is_binary(value), do: value
   def decode_shape(_), do: {:error, "Unexpected type when decoding MarkConfig.shape"}
 
   def encode_shape(value) when is_binary(value), do: value
   def encode_shape(_), do: {:error, "Unexpected type when encoding MarkConfig.shape"}
 
+  def decode_size(value) when is_float(value) and value >= 0, do: value
+  def decode_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding MarkConfig.size"}
+
+  def encode_size(value) when is_float(value), do: value
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding MarkConfig.size"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding MarkConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding MarkConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding MarkConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding MarkConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding MarkConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding MarkConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding MarkConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding MarkConfig.stroke_width"}
+
+  def decode_tension(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(_), do: {:error, "Unexpected type when decoding MarkConfig.tension"}
+
+  def encode_tension(value) when is_float(value), do: value
+  def encode_tension(value) when is_integer(value), do: value
+  def encode_tension(_), do: {:error, "Unexpected type when encoding MarkConfig.tension"}
+
   def decode_text(value) when is_binary(value), do: value
   def decode_text(_), do: {:error, "Unexpected type when decoding MarkConfig.text"}
 
   def encode_text(value) when is_binary(value), do: value
   def encode_text(_), do: {:error, "Unexpected type when encoding MarkConfig.text"}
 
+  def decode_theta(value) when is_float(value), do: value
+  def decode_theta(value) when is_integer(value), do: value
+  def decode_theta(_), do: {:error, "Unexpected type when decoding MarkConfig.theta"}
+
+  def encode_theta(value) when is_float(value), do: value
+  def encode_theta(value) when is_integer(value), do: value
+  def encode_theta(_), do: {:error, "Unexpected type when encoding MarkConfig.theta"}
+
   def from_map(m) do
     %MarkConfig{
       align: m["align"] && HorizontalAlign.decode(m["align"]),
-      angle: m["angle"],
+      angle: m["angle"] && decode_angle(m["angle"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
       color: m["color"] && decode_color(m["color"]),
       cursor: m["cursor"] && Cursor.decode(m["cursor"]),
-      dx: m["dx"],
-      dy: m["dy"],
+      dx: m["dx"] && decode_dx(m["dx"]),
+      dy: m["dy"] && decode_dy(m["dy"]),
       fill: m["fill"] && decode_fill(m["fill"]),
       filled: m["filled"],
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_style: m["fontStyle"] && FontStyle.decode(m["fontStyle"]),
       font_weight: decode_font_weight(m["fontWeight"]),
       href: m["href"] && decode_href(m["href"]),
       interpolate: m["interpolate"] && Interpolate.decode(m["interpolate"]),
-      limit: m["limit"],
-      opacity: m["opacity"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      opacity: m["opacity"] && decode_opacity(m["opacity"]),
       orient: m["orient"] && Orient.decode(m["orient"]),
-      radius: m["radius"],
+      radius: m["radius"] && decode_radius(m["radius"]),
       shape: m["shape"] && decode_shape(m["shape"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
-      tension: m["tension"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
+      tension: m["tension"] && decode_tension(m["tension"]),
       text: m["text"] && decode_text(m["text"]),
-      theta: m["theta"],
+      theta: m["theta"] && decode_theta(m["theta"]),
     }
   end
 
@@ -934,18 +1046,58 @@ defmodule AxisConfig do
           title_y: float() | nil
         }
 
+  def decode_band_position(value) when is_float(value), do: value
+  def decode_band_position(value) when is_integer(value), do: value
+  def decode_band_position(_), do: {:error, "Unexpected type when decoding AxisConfig.band_position"}
+
+  def encode_band_position(value) when is_float(value), do: value
+  def encode_band_position(value) when is_integer(value), do: value
+  def encode_band_position(_), do: {:error, "Unexpected type when encoding AxisConfig.band_position"}
+
   def decode_domain_color(value) when is_binary(value), do: value
   def decode_domain_color(_), do: {:error, "Unexpected type when decoding AxisConfig.domain_color"}
 
   def encode_domain_color(value) when is_binary(value), do: value
   def encode_domain_color(_), do: {:error, "Unexpected type when encoding AxisConfig.domain_color"}
 
+  def decode_domain_width(value) when is_float(value), do: value
+  def decode_domain_width(value) when is_integer(value), do: value
+  def decode_domain_width(_), do: {:error, "Unexpected type when decoding AxisConfig.domain_width"}
+
+  def encode_domain_width(value) when is_float(value), do: value
+  def encode_domain_width(value) when is_integer(value), do: value
+  def encode_domain_width(_), do: {:error, "Unexpected type when encoding AxisConfig.domain_width"}
+
   def decode_grid_color(value) when is_binary(value), do: value
   def decode_grid_color(_), do: {:error, "Unexpected type when decoding AxisConfig.grid_color"}
 
   def encode_grid_color(value) when is_binary(value), do: value
   def encode_grid_color(_), do: {:error, "Unexpected type when encoding AxisConfig.grid_color"}
 
+  def decode_grid_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_grid_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_grid_opacity(_), do: {:error, "Unexpected type when decoding AxisConfig.grid_opacity"}
+
+  def encode_grid_opacity(value) when is_float(value), do: value
+  def encode_grid_opacity(value) when is_integer(value), do: value
+  def encode_grid_opacity(_), do: {:error, "Unexpected type when encoding AxisConfig.grid_opacity"}
+
+  def decode_grid_width(value) when is_float(value) and value >= 0, do: value
+  def decode_grid_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_grid_width(_), do: {:error, "Unexpected type when decoding AxisConfig.grid_width"}
+
+  def encode_grid_width(value) when is_float(value), do: value
+  def encode_grid_width(value) when is_integer(value), do: value
+  def encode_grid_width(_), do: {:error, "Unexpected type when encoding AxisConfig.grid_width"}
+
+  def decode_label_angle(value) when is_float(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(value) when is_integer(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(_), do: {:error, "Unexpected type when decoding AxisConfig.label_angle"}
+
+  def encode_label_angle(value) when is_float(value), do: value
+  def encode_label_angle(value) when is_integer(value), do: value
+  def encode_label_angle(_), do: {:error, "Unexpected type when encoding AxisConfig.label_angle"}
+
   def decode_label_color(value) when is_binary(value), do: value
   def decode_label_color(_), do: {:error, "Unexpected type when decoding AxisConfig.label_color"}
 
@@ -958,6 +1110,22 @@ defmodule AxisConfig do
   def encode_label_font(value) when is_binary(value), do: value
   def encode_label_font(_), do: {:error, "Unexpected type when encoding AxisConfig.label_font"}
 
+  def decode_label_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_label_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_label_font_size(_), do: {:error, "Unexpected type when decoding AxisConfig.label_font_size"}
+
+  def encode_label_font_size(value) when is_float(value), do: value
+  def encode_label_font_size(value) when is_integer(value), do: value
+  def encode_label_font_size(_), do: {:error, "Unexpected type when encoding AxisConfig.label_font_size"}
+
+  def decode_label_limit(value) when is_float(value), do: value
+  def decode_label_limit(value) when is_integer(value), do: value
+  def decode_label_limit(_), do: {:error, "Unexpected type when decoding AxisConfig.label_limit"}
+
+  def encode_label_limit(value) when is_float(value), do: value
+  def encode_label_limit(value) when is_integer(value), do: value
+  def encode_label_limit(_), do: {:error, "Unexpected type when encoding AxisConfig.label_limit"}
+
   def decode_label_overlap(value) when is_boolean(value), do: value
   def decode_label_overlap(value) when is_binary(value), do: LabelOverlapEnum.decode(value)
   def decode_label_overlap(value) when is_nil(value), do: value
@@ -968,18 +1136,66 @@ defmodule AxisConfig do
   def encode_label_overlap(value) when is_nil(value), do: value
   def encode_label_overlap(_), do: {:error, "Unexpected type when encoding AxisConfig.label_overlap"}
 
+  def decode_label_padding(value) when is_float(value), do: value
+  def decode_label_padding(value) when is_integer(value), do: value
+  def decode_label_padding(_), do: {:error, "Unexpected type when decoding AxisConfig.label_padding"}
+
+  def encode_label_padding(value) when is_float(value), do: value
+  def encode_label_padding(value) when is_integer(value), do: value
+  def encode_label_padding(_), do: {:error, "Unexpected type when encoding AxisConfig.label_padding"}
+
+  def decode_max_extent(value) when is_float(value), do: value
+  def decode_max_extent(value) when is_integer(value), do: value
+  def decode_max_extent(_), do: {:error, "Unexpected type when decoding AxisConfig.max_extent"}
+
+  def encode_max_extent(value) when is_float(value), do: value
+  def encode_max_extent(value) when is_integer(value), do: value
+  def encode_max_extent(_), do: {:error, "Unexpected type when encoding AxisConfig.max_extent"}
+
+  def decode_min_extent(value) when is_float(value), do: value
+  def decode_min_extent(value) when is_integer(value), do: value
+  def decode_min_extent(_), do: {:error, "Unexpected type when decoding AxisConfig.min_extent"}
+
+  def encode_min_extent(value) when is_float(value), do: value
+  def encode_min_extent(value) when is_integer(value), do: value
+  def encode_min_extent(_), do: {:error, "Unexpected type when encoding AxisConfig.min_extent"}
+
   def decode_tick_color(value) when is_binary(value), do: value
   def decode_tick_color(_), do: {:error, "Unexpected type when decoding AxisConfig.tick_color"}
 
   def encode_tick_color(value) when is_binary(value), do: value
   def encode_tick_color(_), do: {:error, "Unexpected type when encoding AxisConfig.tick_color"}
 
+  def decode_tick_size(value) when is_float(value) and value >= 0, do: value
+  def decode_tick_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_tick_size(_), do: {:error, "Unexpected type when decoding AxisConfig.tick_size"}
+
+  def encode_tick_size(value) when is_float(value), do: value
+  def encode_tick_size(value) when is_integer(value), do: value
+  def encode_tick_size(_), do: {:error, "Unexpected type when encoding AxisConfig.tick_size"}
+
+  def decode_tick_width(value) when is_float(value) and value >= 0, do: value
+  def decode_tick_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_tick_width(_), do: {:error, "Unexpected type when decoding AxisConfig.tick_width"}
+
+  def encode_tick_width(value) when is_float(value), do: value
+  def encode_tick_width(value) when is_integer(value), do: value
+  def encode_tick_width(_), do: {:error, "Unexpected type when encoding AxisConfig.tick_width"}
+
   def decode_title_align(value) when is_binary(value), do: value
   def decode_title_align(_), do: {:error, "Unexpected type when decoding AxisConfig.title_align"}
 
   def encode_title_align(value) when is_binary(value), do: value
   def encode_title_align(_), do: {:error, "Unexpected type when encoding AxisConfig.title_align"}
 
+  def decode_title_angle(value) when is_float(value), do: value
+  def decode_title_angle(value) when is_integer(value), do: value
+  def decode_title_angle(_), do: {:error, "Unexpected type when decoding AxisConfig.title_angle"}
+
+  def encode_title_angle(value) when is_float(value), do: value
+  def encode_title_angle(value) when is_integer(value), do: value
+  def encode_title_angle(_), do: {:error, "Unexpected type when encoding AxisConfig.title_angle"}
+
   def decode_title_baseline(value) when is_binary(value), do: value
   def decode_title_baseline(_), do: {:error, "Unexpected type when decoding AxisConfig.title_baseline"}
 
@@ -998,47 +1214,95 @@ defmodule AxisConfig do
   def encode_title_font(value) when is_binary(value), do: value
   def encode_title_font(_), do: {:error, "Unexpected type when encoding AxisConfig.title_font"}
 
+  def decode_title_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_title_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_title_font_size(_), do: {:error, "Unexpected type when decoding AxisConfig.title_font_size"}
+
+  def encode_title_font_size(value) when is_float(value), do: value
+  def encode_title_font_size(value) when is_integer(value), do: value
+  def encode_title_font_size(_), do: {:error, "Unexpected type when encoding AxisConfig.title_font_size"}
+
+  def decode_title_limit(value) when is_float(value), do: value
+  def decode_title_limit(value) when is_integer(value), do: value
+  def decode_title_limit(_), do: {:error, "Unexpected type when decoding AxisConfig.title_limit"}
+
+  def encode_title_limit(value) when is_float(value), do: value
+  def encode_title_limit(value) when is_integer(value), do: value
+  def encode_title_limit(_), do: {:error, "Unexpected type when encoding AxisConfig.title_limit"}
+
+  def decode_title_max_length(value) when is_float(value), do: value
+  def decode_title_max_length(value) when is_integer(value), do: value
+  def decode_title_max_length(_), do: {:error, "Unexpected type when decoding AxisConfig.title_max_length"}
+
+  def encode_title_max_length(value) when is_float(value), do: value
+  def encode_title_max_length(value) when is_integer(value), do: value
+  def encode_title_max_length(_), do: {:error, "Unexpected type when encoding AxisConfig.title_max_length"}
+
+  def decode_title_padding(value) when is_float(value), do: value
+  def decode_title_padding(value) when is_integer(value), do: value
+  def decode_title_padding(_), do: {:error, "Unexpected type when decoding AxisConfig.title_padding"}
+
+  def encode_title_padding(value) when is_float(value), do: value
+  def encode_title_padding(value) when is_integer(value), do: value
+  def encode_title_padding(_), do: {:error, "Unexpected type when encoding AxisConfig.title_padding"}
+
+  def decode_title_x(value) when is_float(value), do: value
+  def decode_title_x(value) when is_integer(value), do: value
+  def decode_title_x(_), do: {:error, "Unexpected type when decoding AxisConfig.title_x"}
+
+  def encode_title_x(value) when is_float(value), do: value
+  def encode_title_x(value) when is_integer(value), do: value
+  def encode_title_x(_), do: {:error, "Unexpected type when encoding AxisConfig.title_x"}
+
+  def decode_title_y(value) when is_float(value), do: value
+  def decode_title_y(value) when is_integer(value), do: value
+  def decode_title_y(_), do: {:error, "Unexpected type when decoding AxisConfig.title_y"}
+
+  def encode_title_y(value) when is_float(value), do: value
+  def encode_title_y(value) when is_integer(value), do: value
+  def encode_title_y(_), do: {:error, "Unexpected type when encoding AxisConfig.title_y"}
+
   def from_map(m) do
     %AxisConfig{
-      band_position: m["bandPosition"],
+      band_position: m["bandPosition"] && decode_band_position(m["bandPosition"]),
       domain: m["domain"],
       domain_color: m["domainColor"] && decode_domain_color(m["domainColor"]),
-      domain_width: m["domainWidth"],
+      domain_width: m["domainWidth"] && decode_domain_width(m["domainWidth"]),
       grid: m["grid"],
       grid_color: m["gridColor"] && decode_grid_color(m["gridColor"]),
       grid_dash: m["gridDash"],
-      grid_opacity: m["gridOpacity"],
-      grid_width: m["gridWidth"],
-      label_angle: m["labelAngle"],
+      grid_opacity: m["gridOpacity"] && decode_grid_opacity(m["gridOpacity"]),
+      grid_width: m["gridWidth"] && decode_grid_width(m["gridWidth"]),
+      label_angle: m["labelAngle"] && decode_label_angle(m["labelAngle"]),
       label_bound: m["labelBound"],
       label_color: m["labelColor"] && decode_label_color(m["labelColor"]),
       label_flush: m["labelFlush"],
       label_font: m["labelFont"] && decode_label_font(m["labelFont"]),
-      label_font_size: m["labelFontSize"],
-      label_limit: m["labelLimit"],
+      label_font_size: m["labelFontSize"] && decode_label_font_size(m["labelFontSize"]),
+      label_limit: m["labelLimit"] && decode_label_limit(m["labelLimit"]),
       label_overlap: decode_label_overlap(m["labelOverlap"]),
-      label_padding: m["labelPadding"],
+      label_padding: m["labelPadding"] && decode_label_padding(m["labelPadding"]),
       labels: m["labels"],
-      max_extent: m["maxExtent"],
-      min_extent: m["minExtent"],
+      max_extent: m["maxExtent"] && decode_max_extent(m["maxExtent"]),
+      min_extent: m["minExtent"] && decode_min_extent(m["minExtent"]),
       short_time_labels: m["shortTimeLabels"],
       tick_color: m["tickColor"] && decode_tick_color(m["tickColor"]),
       tick_round: m["tickRound"],
       ticks: m["ticks"],
-      tick_size: m["tickSize"],
-      tick_width: m["tickWidth"],
+      tick_size: m["tickSize"] && decode_tick_size(m["tickSize"]),
+      tick_width: m["tickWidth"] && decode_tick_width(m["tickWidth"]),
       title_align: m["titleAlign"] && decode_title_align(m["titleAlign"]),
-      title_angle: m["titleAngle"],
+      title_angle: m["titleAngle"] && decode_title_angle(m["titleAngle"]),
       title_baseline: m["titleBaseline"] && decode_title_baseline(m["titleBaseline"]),
       title_color: m["titleColor"] && decode_title_color(m["titleColor"]),
       title_font: m["titleFont"] && decode_title_font(m["titleFont"]),
-      title_font_size: m["titleFontSize"],
+      title_font_size: m["titleFontSize"] && decode_title_font_size(m["titleFontSize"]),
       title_font_weight: m["titleFontWeight"],
-      title_limit: m["titleLimit"],
-      title_max_length: m["titleMaxLength"],
-      title_padding: m["titlePadding"],
-      title_x: m["titleX"],
-      title_y: m["titleY"],
+      title_limit: m["titleLimit"] && decode_title_limit(m["titleLimit"]),
+      title_max_length: m["titleMaxLength"] && decode_title_max_length(m["titleMaxLength"]),
+      title_padding: m["titlePadding"] && decode_title_padding(m["titlePadding"]),
+      title_x: m["titleX"] && decode_title_x(m["titleX"]),
+      title_y: m["titleY"] && decode_title_y(m["titleY"]),
     }
   end
 
@@ -1197,18 +1461,58 @@ defmodule VGAxisConfig do
           title_y: float() | nil
         }
 
+  def decode_band_position(value) when is_float(value), do: value
+  def decode_band_position(value) when is_integer(value), do: value
+  def decode_band_position(_), do: {:error, "Unexpected type when decoding VGAxisConfig.band_position"}
+
+  def encode_band_position(value) when is_float(value), do: value
+  def encode_band_position(value) when is_integer(value), do: value
+  def encode_band_position(_), do: {:error, "Unexpected type when encoding VGAxisConfig.band_position"}
+
   def decode_domain_color(value) when is_binary(value), do: value
   def decode_domain_color(_), do: {:error, "Unexpected type when decoding VGAxisConfig.domain_color"}
 
   def encode_domain_color(value) when is_binary(value), do: value
   def encode_domain_color(_), do: {:error, "Unexpected type when encoding VGAxisConfig.domain_color"}
 
+  def decode_domain_width(value) when is_float(value), do: value
+  def decode_domain_width(value) when is_integer(value), do: value
+  def decode_domain_width(_), do: {:error, "Unexpected type when decoding VGAxisConfig.domain_width"}
+
+  def encode_domain_width(value) when is_float(value), do: value
+  def encode_domain_width(value) when is_integer(value), do: value
+  def encode_domain_width(_), do: {:error, "Unexpected type when encoding VGAxisConfig.domain_width"}
+
   def decode_grid_color(value) when is_binary(value), do: value
   def decode_grid_color(_), do: {:error, "Unexpected type when decoding VGAxisConfig.grid_color"}
 
   def encode_grid_color(value) when is_binary(value), do: value
   def encode_grid_color(_), do: {:error, "Unexpected type when encoding VGAxisConfig.grid_color"}
 
+  def decode_grid_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_grid_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_grid_opacity(_), do: {:error, "Unexpected type when decoding VGAxisConfig.grid_opacity"}
+
+  def encode_grid_opacity(value) when is_float(value), do: value
+  def encode_grid_opacity(value) when is_integer(value), do: value
+  def encode_grid_opacity(_), do: {:error, "Unexpected type when encoding VGAxisConfig.grid_opacity"}
+
+  def decode_grid_width(value) when is_float(value) and value >= 0, do: value
+  def decode_grid_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_grid_width(_), do: {:error, "Unexpected type when decoding VGAxisConfig.grid_width"}
+
+  def encode_grid_width(value) when is_float(value), do: value
+  def encode_grid_width(value) when is_integer(value), do: value
+  def encode_grid_width(_), do: {:error, "Unexpected type when encoding VGAxisConfig.grid_width"}
+
+  def decode_label_angle(value) when is_float(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(value) when is_integer(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(_), do: {:error, "Unexpected type when decoding VGAxisConfig.label_angle"}
+
+  def encode_label_angle(value) when is_float(value), do: value
+  def encode_label_angle(value) when is_integer(value), do: value
+  def encode_label_angle(_), do: {:error, "Unexpected type when encoding VGAxisConfig.label_angle"}
+
   def decode_label_color(value) when is_binary(value), do: value
   def decode_label_color(_), do: {:error, "Unexpected type when decoding VGAxisConfig.label_color"}
 
@@ -1221,6 +1525,22 @@ defmodule VGAxisConfig do
   def encode_label_font(value) when is_binary(value), do: value
   def encode_label_font(_), do: {:error, "Unexpected type when encoding VGAxisConfig.label_font"}
 
+  def decode_label_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_label_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_label_font_size(_), do: {:error, "Unexpected type when decoding VGAxisConfig.label_font_size"}
+
+  def encode_label_font_size(value) when is_float(value), do: value
+  def encode_label_font_size(value) when is_integer(value), do: value
+  def encode_label_font_size(_), do: {:error, "Unexpected type when encoding VGAxisConfig.label_font_size"}
+
+  def decode_label_limit(value) when is_float(value), do: value
+  def decode_label_limit(value) when is_integer(value), do: value
+  def decode_label_limit(_), do: {:error, "Unexpected type when decoding VGAxisConfig.label_limit"}
+
+  def encode_label_limit(value) when is_float(value), do: value
+  def encode_label_limit(value) when is_integer(value), do: value
+  def encode_label_limit(_), do: {:error, "Unexpected type when encoding VGAxisConfig.label_limit"}
+
   def decode_label_overlap(value) when is_boolean(value), do: value
   def decode_label_overlap(value) when is_binary(value), do: LabelOverlapEnum.decode(value)
   def decode_label_overlap(value) when is_nil(value), do: value
@@ -1231,18 +1551,66 @@ defmodule VGAxisConfig do
   def encode_label_overlap(value) when is_nil(value), do: value
   def encode_label_overlap(_), do: {:error, "Unexpected type when encoding VGAxisConfig.label_overlap"}
 
+  def decode_label_padding(value) when is_float(value), do: value
+  def decode_label_padding(value) when is_integer(value), do: value
+  def decode_label_padding(_), do: {:error, "Unexpected type when decoding VGAxisConfig.label_padding"}
+
+  def encode_label_padding(value) when is_float(value), do: value
+  def encode_label_padding(value) when is_integer(value), do: value
+  def encode_label_padding(_), do: {:error, "Unexpected type when encoding VGAxisConfig.label_padding"}
+
+  def decode_max_extent(value) when is_float(value), do: value
+  def decode_max_extent(value) when is_integer(value), do: value
+  def decode_max_extent(_), do: {:error, "Unexpected type when decoding VGAxisConfig.max_extent"}
+
+  def encode_max_extent(value) when is_float(value), do: value
+  def encode_max_extent(value) when is_integer(value), do: value
+  def encode_max_extent(_), do: {:error, "Unexpected type when encoding VGAxisConfig.max_extent"}
+
+  def decode_min_extent(value) when is_float(value), do: value
+  def decode_min_extent(value) when is_integer(value), do: value
+  def decode_min_extent(_), do: {:error, "Unexpected type when decoding VGAxisConfig.min_extent"}
+
+  def encode_min_extent(value) when is_float(value), do: value
+  def encode_min_extent(value) when is_integer(value), do: value
+  def encode_min_extent(_), do: {:error, "Unexpected type when encoding VGAxisConfig.min_extent"}
+
   def decode_tick_color(value) when is_binary(value), do: value
   def decode_tick_color(_), do: {:error, "Unexpected type when decoding VGAxisConfig.tick_color"}
 
   def encode_tick_color(value) when is_binary(value), do: value
   def encode_tick_color(_), do: {:error, "Unexpected type when encoding VGAxisConfig.tick_color"}
 
+  def decode_tick_size(value) when is_float(value) and value >= 0, do: value
+  def decode_tick_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_tick_size(_), do: {:error, "Unexpected type when decoding VGAxisConfig.tick_size"}
+
+  def encode_tick_size(value) when is_float(value), do: value
+  def encode_tick_size(value) when is_integer(value), do: value
+  def encode_tick_size(_), do: {:error, "Unexpected type when encoding VGAxisConfig.tick_size"}
+
+  def decode_tick_width(value) when is_float(value) and value >= 0, do: value
+  def decode_tick_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_tick_width(_), do: {:error, "Unexpected type when decoding VGAxisConfig.tick_width"}
+
+  def encode_tick_width(value) when is_float(value), do: value
+  def encode_tick_width(value) when is_integer(value), do: value
+  def encode_tick_width(_), do: {:error, "Unexpected type when encoding VGAxisConfig.tick_width"}
+
   def decode_title_align(value) when is_binary(value), do: value
   def decode_title_align(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_align"}
 
   def encode_title_align(value) when is_binary(value), do: value
   def encode_title_align(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_align"}
 
+  def decode_title_angle(value) when is_float(value), do: value
+  def decode_title_angle(value) when is_integer(value), do: value
+  def decode_title_angle(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_angle"}
+
+  def encode_title_angle(value) when is_float(value), do: value
+  def encode_title_angle(value) when is_integer(value), do: value
+  def encode_title_angle(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_angle"}
+
   def decode_title_baseline(value) when is_binary(value), do: value
   def decode_title_baseline(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_baseline"}
 
@@ -1261,46 +1629,94 @@ defmodule VGAxisConfig do
   def encode_title_font(value) when is_binary(value), do: value
   def encode_title_font(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_font"}
 
+  def decode_title_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_title_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_title_font_size(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_font_size"}
+
+  def encode_title_font_size(value) when is_float(value), do: value
+  def encode_title_font_size(value) when is_integer(value), do: value
+  def encode_title_font_size(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_font_size"}
+
+  def decode_title_limit(value) when is_float(value), do: value
+  def decode_title_limit(value) when is_integer(value), do: value
+  def decode_title_limit(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_limit"}
+
+  def encode_title_limit(value) when is_float(value), do: value
+  def encode_title_limit(value) when is_integer(value), do: value
+  def encode_title_limit(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_limit"}
+
+  def decode_title_max_length(value) when is_float(value), do: value
+  def decode_title_max_length(value) when is_integer(value), do: value
+  def decode_title_max_length(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_max_length"}
+
+  def encode_title_max_length(value) when is_float(value), do: value
+  def encode_title_max_length(value) when is_integer(value), do: value
+  def encode_title_max_length(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_max_length"}
+
+  def decode_title_padding(value) when is_float(value), do: value
+  def decode_title_padding(value) when is_integer(value), do: value
+  def decode_title_padding(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_padding"}
+
+  def encode_title_padding(value) when is_float(value), do: value
+  def encode_title_padding(value) when is_integer(value), do: value
+  def encode_title_padding(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_padding"}
+
+  def decode_title_x(value) when is_float(value), do: value
+  def decode_title_x(value) when is_integer(value), do: value
+  def decode_title_x(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_x"}
+
+  def encode_title_x(value) when is_float(value), do: value
+  def encode_title_x(value) when is_integer(value), do: value
+  def encode_title_x(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_x"}
+
+  def decode_title_y(value) when is_float(value), do: value
+  def decode_title_y(value) when is_integer(value), do: value
+  def decode_title_y(_), do: {:error, "Unexpected type when decoding VGAxisConfig.title_y"}
+
+  def encode_title_y(value) when is_float(value), do: value
+  def encode_title_y(value) when is_integer(value), do: value
+  def encode_title_y(_), do: {:error, "Unexpected type when encoding VGAxisConfig.title_y"}
+
   def from_map(m) do
     %VGAxisConfig{
-      band_position: m["bandPosition"],
+      band_position: m["bandPosition"] && decode_band_position(m["bandPosition"]),
       domain: m["domain"],
       domain_color: m["domainColor"] && decode_domain_color(m["domainColor"]),
-      domain_width: m["domainWidth"],
+      domain_width: m["domainWidth"] && decode_domain_width(m["domainWidth"]),
       grid: m["grid"],
       grid_color: m["gridColor"] && decode_grid_color(m["gridColor"]),
       grid_dash: m["gridDash"],
-      grid_opacity: m["gridOpacity"],
-      grid_width: m["gridWidth"],
-      label_angle: m["labelAngle"],
+      grid_opacity: m["gridOpacity"] && decode_grid_opacity(m["gridOpacity"]),
+      grid_width: m["gridWidth"] && decode_grid_width(m["gridWidth"]),
+      label_angle: m["labelAngle"] && decode_label_angle(m["labelAngle"]),
       label_bound: m["labelBound"],
       label_color: m["labelColor"] && decode_label_color(m["labelColor"]),
       label_flush: m["labelFlush"],
       label_font: m["labelFont"] && decode_label_font(m["labelFont"]),
-      label_font_size: m["labelFontSize"],
-      label_limit: m["labelLimit"],
+      label_font_size: m["labelFontSize"] && decode_label_font_size(m["labelFontSize"]),
+      label_limit: m["labelLimit"] && decode_label_limit(m["labelLimit"]),
       label_overlap: decode_label_overlap(m["labelOverlap"]),
-      label_padding: m["labelPadding"],
+      label_padding: m["labelPadding"] && decode_label_padding(m["labelPadding"]),
       labels: m["labels"],
-      max_extent: m["maxExtent"],
-      min_extent: m["minExtent"],
+      max_extent: m["maxExtent"] && decode_max_extent(m["maxExtent"]),
+      min_extent: m["minExtent"] && decode_min_extent(m["minExtent"]),
       tick_color: m["tickColor"] && decode_tick_color(m["tickColor"]),
       tick_round: m["tickRound"],
       ticks: m["ticks"],
-      tick_size: m["tickSize"],
-      tick_width: m["tickWidth"],
+      tick_size: m["tickSize"] && decode_tick_size(m["tickSize"]),
+      tick_width: m["tickWidth"] && decode_tick_width(m["tickWidth"]),
       title_align: m["titleAlign"] && decode_title_align(m["titleAlign"]),
-      title_angle: m["titleAngle"],
+      title_angle: m["titleAngle"] && decode_title_angle(m["titleAngle"]),
       title_baseline: m["titleBaseline"] && decode_title_baseline(m["titleBaseline"]),
       title_color: m["titleColor"] && decode_title_color(m["titleColor"]),
       title_font: m["titleFont"] && decode_title_font(m["titleFont"]),
-      title_font_size: m["titleFontSize"],
+      title_font_size: m["titleFontSize"] && decode_title_font_size(m["titleFontSize"]),
       title_font_weight: m["titleFontWeight"],
-      title_limit: m["titleLimit"],
-      title_max_length: m["titleMaxLength"],
-      title_padding: m["titlePadding"],
-      title_x: m["titleX"],
-      title_y: m["titleY"],
+      title_limit: m["titleLimit"] && decode_title_limit(m["titleLimit"]),
+      title_max_length: m["titleMaxLength"] && decode_title_max_length(m["titleMaxLength"]),
+      title_padding: m["titlePadding"] && decode_title_padding(m["titlePadding"]),
+      title_x: m["titleX"] && decode_title_x(m["titleX"]),
+      title_y: m["titleY"] && decode_title_y(m["titleY"]),
     }
   end
 
@@ -1436,27 +1852,91 @@ defmodule BarConfig do
           theta: float() | nil
         }
 
+  def decode_angle(value) when is_float(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(value) when is_integer(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding BarConfig.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding BarConfig.angle"}
+
+  def decode_bin_spacing(value) when is_float(value) and value >= 0, do: value
+  def decode_bin_spacing(value) when is_integer(value) and value >= 0, do: value
+  def decode_bin_spacing(_), do: {:error, "Unexpected type when decoding BarConfig.bin_spacing"}
+
+  def encode_bin_spacing(value) when is_float(value), do: value
+  def encode_bin_spacing(value) when is_integer(value), do: value
+  def encode_bin_spacing(_), do: {:error, "Unexpected type when encoding BarConfig.bin_spacing"}
+
   def decode_color(value) when is_binary(value), do: value
   def decode_color(_), do: {:error, "Unexpected type when decoding BarConfig.color"}
 
   def encode_color(value) when is_binary(value), do: value
   def encode_color(_), do: {:error, "Unexpected type when encoding BarConfig.color"}
 
+  def decode_continuous_band_size(value) when is_float(value) and value >= 0, do: value
+  def decode_continuous_band_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_continuous_band_size(_), do: {:error, "Unexpected type when decoding BarConfig.continuous_band_size"}
+
+  def encode_continuous_band_size(value) when is_float(value), do: value
+  def encode_continuous_band_size(value) when is_integer(value), do: value
+  def encode_continuous_band_size(_), do: {:error, "Unexpected type when encoding BarConfig.continuous_band_size"}
+
+  def decode_discrete_band_size(value) when is_float(value) and value >= 0, do: value
+  def decode_discrete_band_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_discrete_band_size(_), do: {:error, "Unexpected type when decoding BarConfig.discrete_band_size"}
+
+  def encode_discrete_band_size(value) when is_float(value), do: value
+  def encode_discrete_band_size(value) when is_integer(value), do: value
+  def encode_discrete_band_size(_), do: {:error, "Unexpected type when encoding BarConfig.discrete_band_size"}
+
+  def decode_dx(value) when is_float(value), do: value
+  def decode_dx(value) when is_integer(value), do: value
+  def decode_dx(_), do: {:error, "Unexpected type when decoding BarConfig.dx"}
+
+  def encode_dx(value) when is_float(value), do: value
+  def encode_dx(value) when is_integer(value), do: value
+  def encode_dx(_), do: {:error, "Unexpected type when encoding BarConfig.dx"}
+
+  def decode_dy(value) when is_float(value), do: value
+  def decode_dy(value) when is_integer(value), do: value
+  def decode_dy(_), do: {:error, "Unexpected type when decoding BarConfig.dy"}
+
+  def encode_dy(value) when is_float(value), do: value
+  def encode_dy(value) when is_integer(value), do: value
+  def encode_dy(_), do: {:error, "Unexpected type when encoding BarConfig.dy"}
+
   def decode_fill(value) when is_binary(value), do: value
   def decode_fill(_), do: {:error, "Unexpected type when decoding BarConfig.fill"}
 
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding BarConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding BarConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding BarConfig.fill_opacity"}
+
   def decode_font(value) when is_binary(value), do: value
   def decode_font(_), do: {:error, "Unexpected type when decoding BarConfig.font"}
 
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding BarConfig.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding BarConfig.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding BarConfig.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding BarConfig.font_weight"}
 
@@ -1472,59 +1952,131 @@ defmodule BarConfig do
   def encode_href(value) when is_binary(value), do: value
   def encode_href(_), do: {:error, "Unexpected type when encoding BarConfig.href"}
 
+  def decode_limit(value) when is_float(value), do: value
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding BarConfig.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding BarConfig.limit"}
+
+  def decode_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(_), do: {:error, "Unexpected type when decoding BarConfig.opacity"}
+
+  def encode_opacity(value) when is_float(value), do: value
+  def encode_opacity(value) when is_integer(value), do: value
+  def encode_opacity(_), do: {:error, "Unexpected type when encoding BarConfig.opacity"}
+
+  def decode_radius(value) when is_float(value) and value >= 0, do: value
+  def decode_radius(value) when is_integer(value) and value >= 0, do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding BarConfig.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding BarConfig.radius"}
+
   def decode_shape(value) when is_binary(value), do: value
   def decode_shape(_), do: {:error, "Unexpected type when decoding BarConfig.shape"}
 
   def encode_shape(value) when is_binary(value), do: value
   def encode_shape(_), do: {:error, "Unexpected type when encoding BarConfig.shape"}
 
+  def decode_size(value) when is_float(value) and value >= 0, do: value
+  def decode_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding BarConfig.size"}
+
+  def encode_size(value) when is_float(value), do: value
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding BarConfig.size"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding BarConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding BarConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding BarConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding BarConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding BarConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding BarConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding BarConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding BarConfig.stroke_width"}
+
+  def decode_tension(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(_), do: {:error, "Unexpected type when decoding BarConfig.tension"}
+
+  def encode_tension(value) when is_float(value), do: value
+  def encode_tension(value) when is_integer(value), do: value
+  def encode_tension(_), do: {:error, "Unexpected type when encoding BarConfig.tension"}
+
   def decode_text(value) when is_binary(value), do: value
   def decode_text(_), do: {:error, "Unexpected type when decoding BarConfig.text"}
 
   def encode_text(value) when is_binary(value), do: value
   def encode_text(_), do: {:error, "Unexpected type when encoding BarConfig.text"}
 
+  def decode_theta(value) when is_float(value), do: value
+  def decode_theta(value) when is_integer(value), do: value
+  def decode_theta(_), do: {:error, "Unexpected type when decoding BarConfig.theta"}
+
+  def encode_theta(value) when is_float(value), do: value
+  def encode_theta(value) when is_integer(value), do: value
+  def encode_theta(_), do: {:error, "Unexpected type when encoding BarConfig.theta"}
+
   def from_map(m) do
     %BarConfig{
       align: m["align"] && HorizontalAlign.decode(m["align"]),
-      angle: m["angle"],
+      angle: m["angle"] && decode_angle(m["angle"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
-      bin_spacing: m["binSpacing"],
+      bin_spacing: m["binSpacing"] && decode_bin_spacing(m["binSpacing"]),
       color: m["color"] && decode_color(m["color"]),
-      continuous_band_size: m["continuousBandSize"],
+      continuous_band_size: m["continuousBandSize"] && decode_continuous_band_size(m["continuousBandSize"]),
       cursor: m["cursor"] && Cursor.decode(m["cursor"]),
-      discrete_band_size: m["discreteBandSize"],
-      dx: m["dx"],
-      dy: m["dy"],
+      discrete_band_size: m["discreteBandSize"] && decode_discrete_band_size(m["discreteBandSize"]),
+      dx: m["dx"] && decode_dx(m["dx"]),
+      dy: m["dy"] && decode_dy(m["dy"]),
       fill: m["fill"] && decode_fill(m["fill"]),
       filled: m["filled"],
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_style: m["fontStyle"] && FontStyle.decode(m["fontStyle"]),
       font_weight: decode_font_weight(m["fontWeight"]),
       href: m["href"] && decode_href(m["href"]),
       interpolate: m["interpolate"] && Interpolate.decode(m["interpolate"]),
-      limit: m["limit"],
-      opacity: m["opacity"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      opacity: m["opacity"] && decode_opacity(m["opacity"]),
       orient: m["orient"] && Orient.decode(m["orient"]),
-      radius: m["radius"],
+      radius: m["radius"] && decode_radius(m["radius"]),
       shape: m["shape"] && decode_shape(m["shape"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
-      tension: m["tension"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
+      tension: m["tension"] && decode_tension(m["tension"]),
       text: m["text"] && decode_text(m["text"]),
-      theta: m["theta"],
+      theta: m["theta"] && decode_theta(m["theta"]),
     }
   end
 
@@ -1829,24 +2381,80 @@ defmodule LegendConfig do
           title_padding: float() | nil
         }
 
+  def decode_corner_radius(value) when is_float(value), do: value
+  def decode_corner_radius(value) when is_integer(value), do: value
+  def decode_corner_radius(_), do: {:error, "Unexpected type when decoding LegendConfig.corner_radius"}
+
+  def encode_corner_radius(value) when is_float(value), do: value
+  def encode_corner_radius(value) when is_integer(value), do: value
+  def encode_corner_radius(_), do: {:error, "Unexpected type when encoding LegendConfig.corner_radius"}
+
+  def decode_entry_padding(value) when is_float(value), do: value
+  def decode_entry_padding(value) when is_integer(value), do: value
+  def decode_entry_padding(_), do: {:error, "Unexpected type when decoding LegendConfig.entry_padding"}
+
+  def encode_entry_padding(value) when is_float(value), do: value
+  def encode_entry_padding(value) when is_integer(value), do: value
+  def encode_entry_padding(_), do: {:error, "Unexpected type when encoding LegendConfig.entry_padding"}
+
   def decode_fill_color(value) when is_binary(value), do: value
   def decode_fill_color(_), do: {:error, "Unexpected type when decoding LegendConfig.fill_color"}
 
   def encode_fill_color(value) when is_binary(value), do: value
   def encode_fill_color(_), do: {:error, "Unexpected type when encoding LegendConfig.fill_color"}
 
+  def decode_gradient_height(value) when is_float(value) and value >= 0, do: value
+  def decode_gradient_height(value) when is_integer(value) and value >= 0, do: value
+  def decode_gradient_height(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_height"}
+
+  def encode_gradient_height(value) when is_float(value), do: value
+  def encode_gradient_height(value) when is_integer(value), do: value
+  def encode_gradient_height(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_height"}
+
   def decode_gradient_label_baseline(value) when is_binary(value), do: value
   def decode_gradient_label_baseline(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_label_baseline"}
 
   def encode_gradient_label_baseline(value) when is_binary(value), do: value
   def encode_gradient_label_baseline(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_label_baseline"}
 
+  def decode_gradient_label_limit(value) when is_float(value), do: value
+  def decode_gradient_label_limit(value) when is_integer(value), do: value
+  def decode_gradient_label_limit(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_label_limit"}
+
+  def encode_gradient_label_limit(value) when is_float(value), do: value
+  def encode_gradient_label_limit(value) when is_integer(value), do: value
+  def encode_gradient_label_limit(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_label_limit"}
+
+  def decode_gradient_label_offset(value) when is_float(value), do: value
+  def decode_gradient_label_offset(value) when is_integer(value), do: value
+  def decode_gradient_label_offset(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_label_offset"}
+
+  def encode_gradient_label_offset(value) when is_float(value), do: value
+  def encode_gradient_label_offset(value) when is_integer(value), do: value
+  def encode_gradient_label_offset(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_label_offset"}
+
   def decode_gradient_stroke_color(value) when is_binary(value), do: value
   def decode_gradient_stroke_color(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_stroke_color"}
 
   def encode_gradient_stroke_color(value) when is_binary(value), do: value
   def encode_gradient_stroke_color(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_stroke_color"}
 
+  def decode_gradient_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_gradient_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_gradient_stroke_width(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_stroke_width"}
+
+  def encode_gradient_stroke_width(value) when is_float(value), do: value
+  def encode_gradient_stroke_width(value) when is_integer(value), do: value
+  def encode_gradient_stroke_width(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_stroke_width"}
+
+  def decode_gradient_width(value) when is_float(value) and value >= 0, do: value
+  def decode_gradient_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_gradient_width(_), do: {:error, "Unexpected type when decoding LegendConfig.gradient_width"}
+
+  def encode_gradient_width(value) when is_float(value), do: value
+  def encode_gradient_width(value) when is_integer(value), do: value
+  def encode_gradient_width(_), do: {:error, "Unexpected type when encoding LegendConfig.gradient_width"}
+
   def decode_label_align(value) when is_binary(value), do: value
   def decode_label_align(_), do: {:error, "Unexpected type when decoding LegendConfig.label_align"}
 
@@ -1871,18 +2479,82 @@ defmodule LegendConfig do
   def encode_label_font(value) when is_binary(value), do: value
   def encode_label_font(_), do: {:error, "Unexpected type when encoding LegendConfig.label_font"}
 
+  def decode_label_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_label_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_label_font_size(_), do: {:error, "Unexpected type when decoding LegendConfig.label_font_size"}
+
+  def encode_label_font_size(value) when is_float(value), do: value
+  def encode_label_font_size(value) when is_integer(value), do: value
+  def encode_label_font_size(_), do: {:error, "Unexpected type when encoding LegendConfig.label_font_size"}
+
+  def decode_label_limit(value) when is_float(value), do: value
+  def decode_label_limit(value) when is_integer(value), do: value
+  def decode_label_limit(_), do: {:error, "Unexpected type when decoding LegendConfig.label_limit"}
+
+  def encode_label_limit(value) when is_float(value), do: value
+  def encode_label_limit(value) when is_integer(value), do: value
+  def encode_label_limit(_), do: {:error, "Unexpected type when encoding LegendConfig.label_limit"}
+
+  def decode_label_offset(value) when is_float(value) and value >= 0, do: value
+  def decode_label_offset(value) when is_integer(value) and value >= 0, do: value
+  def decode_label_offset(_), do: {:error, "Unexpected type when decoding LegendConfig.label_offset"}
+
+  def encode_label_offset(value) when is_float(value), do: value
+  def encode_label_offset(value) when is_integer(value), do: value
+  def encode_label_offset(_), do: {:error, "Unexpected type when encoding LegendConfig.label_offset"}
+
+  def decode_offset(value) when is_float(value), do: value
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding LegendConfig.offset"}
+
+  def encode_offset(value) when is_float(value), do: value
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding LegendConfig.offset"}
+
+  def decode_padding(value) when is_float(value), do: value
+  def decode_padding(value) when is_integer(value), do: value
+  def decode_padding(_), do: {:error, "Unexpected type when decoding LegendConfig.padding"}
+
+  def encode_padding(value) when is_float(value), do: value
+  def encode_padding(value) when is_integer(value), do: value
+  def encode_padding(_), do: {:error, "Unexpected type when encoding LegendConfig.padding"}
+
   def decode_stroke_color(value) when is_binary(value), do: value
   def decode_stroke_color(_), do: {:error, "Unexpected type when decoding LegendConfig.stroke_color"}
 
   def encode_stroke_color(value) when is_binary(value), do: value
   def encode_stroke_color(_), do: {:error, "Unexpected type when encoding LegendConfig.stroke_color"}
 
+  def decode_stroke_width(value) when is_float(value), do: value
+  def decode_stroke_width(value) when is_integer(value), do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding LegendConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding LegendConfig.stroke_width"}
+
   def decode_symbol_color(value) when is_binary(value), do: value
   def decode_symbol_color(_), do: {:error, "Unexpected type when decoding LegendConfig.symbol_color"}
 
   def encode_symbol_color(value) when is_binary(value), do: value
   def encode_symbol_color(_), do: {:error, "Unexpected type when encoding LegendConfig.symbol_color"}
 
+  def decode_symbol_size(value) when is_float(value) and value >= 0, do: value
+  def decode_symbol_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_symbol_size(_), do: {:error, "Unexpected type when decoding LegendConfig.symbol_size"}
+
+  def encode_symbol_size(value) when is_float(value), do: value
+  def encode_symbol_size(value) when is_integer(value), do: value
+  def encode_symbol_size(_), do: {:error, "Unexpected type when encoding LegendConfig.symbol_size"}
+
+  def decode_symbol_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_symbol_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_symbol_stroke_width(_), do: {:error, "Unexpected type when decoding LegendConfig.symbol_stroke_width"}
+
+  def encode_symbol_stroke_width(value) when is_float(value), do: value
+  def encode_symbol_stroke_width(value) when is_integer(value), do: value
+  def encode_symbol_stroke_width(_), do: {:error, "Unexpected type when encoding LegendConfig.symbol_stroke_width"}
+
   def decode_symbol_type(value) when is_binary(value), do: value
   def decode_symbol_type(_), do: {:error, "Unexpected type when decoding LegendConfig.symbol_type"}
 
@@ -1913,44 +2585,68 @@ defmodule LegendConfig do
   def encode_title_font(value) when is_binary(value), do: value
   def encode_title_font(_), do: {:error, "Unexpected type when encoding LegendConfig.title_font"}
 
+  def decode_title_font_size(value) when is_float(value), do: value
+  def decode_title_font_size(value) when is_integer(value), do: value
+  def decode_title_font_size(_), do: {:error, "Unexpected type when decoding LegendConfig.title_font_size"}
+
+  def encode_title_font_size(value) when is_float(value), do: value
+  def encode_title_font_size(value) when is_integer(value), do: value
+  def encode_title_font_size(_), do: {:error, "Unexpected type when encoding LegendConfig.title_font_size"}
+
+  def decode_title_limit(value) when is_float(value), do: value
+  def decode_title_limit(value) when is_integer(value), do: value
+  def decode_title_limit(_), do: {:error, "Unexpected type when decoding LegendConfig.title_limit"}
+
+  def encode_title_limit(value) when is_float(value), do: value
+  def encode_title_limit(value) when is_integer(value), do: value
+  def encode_title_limit(_), do: {:error, "Unexpected type when encoding LegendConfig.title_limit"}
+
+  def decode_title_padding(value) when is_float(value), do: value
+  def decode_title_padding(value) when is_integer(value), do: value
+  def decode_title_padding(_), do: {:error, "Unexpected type when decoding LegendConfig.title_padding"}
+
+  def encode_title_padding(value) when is_float(value), do: value
+  def encode_title_padding(value) when is_integer(value), do: value
+  def encode_title_padding(_), do: {:error, "Unexpected type when encoding LegendConfig.title_padding"}
+
   def from_map(m) do
     %LegendConfig{
-      corner_radius: m["cornerRadius"],
-      entry_padding: m["entryPadding"],
+      corner_radius: m["cornerRadius"] && decode_corner_radius(m["cornerRadius"]),
+      entry_padding: m["entryPadding"] && decode_entry_padding(m["entryPadding"]),
       fill_color: m["fillColor"] && decode_fill_color(m["fillColor"]),
-      gradient_height: m["gradientHeight"],
+      gradient_height: m["gradientHeight"] && decode_gradient_height(m["gradientHeight"]),
       gradient_label_baseline: m["gradientLabelBaseline"] && decode_gradient_label_baseline(m["gradientLabelBaseline"]),
-      gradient_label_limit: m["gradientLabelLimit"],
-      gradient_label_offset: m["gradientLabelOffset"],
+      gradient_label_limit: m["gradientLabelLimit"] && decode_gradient_label_limit(m["gradientLabelLimit"]),
+      gradient_label_offset: m["gradientLabelOffset"] && decode_gradient_label_offset(m["gradientLabelOffset"]),
       gradient_stroke_color: m["gradientStrokeColor"] && decode_gradient_stroke_color(m["gradientStrokeColor"]),
-      gradient_stroke_width: m["gradientStrokeWidth"],
-      gradient_width: m["gradientWidth"],
+      gradient_stroke_width: m["gradientStrokeWidth"] && decode_gradient_stroke_width(m["gradientStrokeWidth"]),
+      gradient_width: m["gradientWidth"] && decode_gradient_width(m["gradientWidth"]),
       label_align: m["labelAlign"] && decode_label_align(m["labelAlign"]),
       label_baseline: m["labelBaseline"] && decode_label_baseline(m["labelBaseline"]),
       label_color: m["labelColor"] && decode_label_color(m["labelColor"]),
       label_font: m["labelFont"] && decode_label_font(m["labelFont"]),
-      label_font_size: m["labelFontSize"],
-      label_limit: m["labelLimit"],
-      label_offset: m["labelOffset"],
-      offset: m["offset"],
+      label_font_size: m["labelFontSize"] && decode_label_font_size(m["labelFontSize"]),
+      label_limit: m["labelLimit"] && decode_label_limit(m["labelLimit"]),
+      label_offset: m["labelOffset"] && decode_label_offset(m["labelOffset"]),
+      offset: m["offset"] && decode_offset(m["offset"]),
       orient: m["orient"] && LegendOrient.decode(m["orient"]),
-      padding: m["padding"],
+      padding: m["padding"] && decode_padding(m["padding"]),
       short_time_labels: m["shortTimeLabels"],
       stroke_color: m["strokeColor"] && decode_stroke_color(m["strokeColor"]),
       stroke_dash: m["strokeDash"],
-      stroke_width: m["strokeWidth"],
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
       symbol_color: m["symbolColor"] && decode_symbol_color(m["symbolColor"]),
-      symbol_size: m["symbolSize"],
-      symbol_stroke_width: m["symbolStrokeWidth"],
+      symbol_size: m["symbolSize"] && decode_symbol_size(m["symbolSize"]),
+      symbol_stroke_width: m["symbolStrokeWidth"] && decode_symbol_stroke_width(m["symbolStrokeWidth"]),
       symbol_type: m["symbolType"] && decode_symbol_type(m["symbolType"]),
       title_align: m["titleAlign"] && decode_title_align(m["titleAlign"]),
       title_baseline: m["titleBaseline"] && decode_title_baseline(m["titleBaseline"]),
       title_color: m["titleColor"] && decode_title_color(m["titleColor"]),
       title_font: m["titleFont"] && decode_title_font(m["titleFont"]),
-      title_font_size: m["titleFontSize"],
+      title_font_size: m["titleFontSize"] && decode_title_font_size(m["titleFontSize"]),
       title_font_weight: m["titleFontWeight"],
-      title_limit: m["titleLimit"],
-      title_padding: m["titlePadding"],
+      title_limit: m["titleLimit"] && decode_title_limit(m["titleLimit"]),
+      title_padding: m["titlePadding"] && decode_title_padding(m["titlePadding"]),
     }
   end
 
@@ -2018,12 +2714,44 @@ defmodule PaddingClass do
           top: float() | nil
         }
 
+  def decode_bottom(value) when is_float(value), do: value
+  def decode_bottom(value) when is_integer(value), do: value
+  def decode_bottom(_), do: {:error, "Unexpected type when decoding PaddingClass.bottom"}
+
+  def encode_bottom(value) when is_float(value), do: value
+  def encode_bottom(value) when is_integer(value), do: value
+  def encode_bottom(_), do: {:error, "Unexpected type when encoding PaddingClass.bottom"}
+
+  def decode_left(value) when is_float(value), do: value
+  def decode_left(value) when is_integer(value), do: value
+  def decode_left(_), do: {:error, "Unexpected type when decoding PaddingClass.left"}
+
+  def encode_left(value) when is_float(value), do: value
+  def encode_left(value) when is_integer(value), do: value
+  def encode_left(_), do: {:error, "Unexpected type when encoding PaddingClass.left"}
+
+  def decode_right(value) when is_float(value), do: value
+  def decode_right(value) when is_integer(value), do: value
+  def decode_right(_), do: {:error, "Unexpected type when decoding PaddingClass.right"}
+
+  def encode_right(value) when is_float(value), do: value
+  def encode_right(value) when is_integer(value), do: value
+  def encode_right(_), do: {:error, "Unexpected type when encoding PaddingClass.right"}
+
+  def decode_top(value) when is_float(value), do: value
+  def decode_top(value) when is_integer(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding PaddingClass.top"}
+
+  def encode_top(value) when is_float(value), do: value
+  def encode_top(value) when is_integer(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding PaddingClass.top"}
+
   def from_map(m) do
     %PaddingClass{
-      bottom: m["bottom"],
-      left: m["left"],
-      right: m["right"],
-      top: m["top"],
+      bottom: m["bottom"] && decode_bottom(m["bottom"]),
+      left: m["left"] && decode_left(m["left"]),
+      right: m["right"] && decode_right(m["right"]),
+      top: m["top"] && decode_top(m["top"]),
     }
   end
 
@@ -2150,6 +2878,54 @@ defmodule ProjectionConfig do
           type: VGProjectionType.t() | nil
         }
 
+  def decode_clip_angle(value) when is_float(value), do: value
+  def decode_clip_angle(value) when is_integer(value), do: value
+  def decode_clip_angle(_), do: {:error, "Unexpected type when decoding ProjectionConfig.clip_angle"}
+
+  def encode_clip_angle(value) when is_float(value), do: value
+  def encode_clip_angle(value) when is_integer(value), do: value
+  def encode_clip_angle(_), do: {:error, "Unexpected type when encoding ProjectionConfig.clip_angle"}
+
+  def decode_coefficient(value) when is_float(value), do: value
+  def decode_coefficient(value) when is_integer(value), do: value
+  def decode_coefficient(_), do: {:error, "Unexpected type when decoding ProjectionConfig.coefficient"}
+
+  def encode_coefficient(value) when is_float(value), do: value
+  def encode_coefficient(value) when is_integer(value), do: value
+  def encode_coefficient(_), do: {:error, "Unexpected type when encoding ProjectionConfig.coefficient"}
+
+  def decode_distance(value) when is_float(value), do: value
+  def decode_distance(value) when is_integer(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding ProjectionConfig.distance"}
+
+  def encode_distance(value) when is_float(value), do: value
+  def encode_distance(value) when is_integer(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding ProjectionConfig.distance"}
+
+  def decode_fraction(value) when is_float(value), do: value
+  def decode_fraction(value) when is_integer(value), do: value
+  def decode_fraction(_), do: {:error, "Unexpected type when decoding ProjectionConfig.fraction"}
+
+  def encode_fraction(value) when is_float(value), do: value
+  def encode_fraction(value) when is_integer(value), do: value
+  def encode_fraction(_), do: {:error, "Unexpected type when encoding ProjectionConfig.fraction"}
+
+  def decode_lobes(value) when is_float(value), do: value
+  def decode_lobes(value) when is_integer(value), do: value
+  def decode_lobes(_), do: {:error, "Unexpected type when decoding ProjectionConfig.lobes"}
+
+  def encode_lobes(value) when is_float(value), do: value
+  def encode_lobes(value) when is_integer(value), do: value
+  def encode_lobes(_), do: {:error, "Unexpected type when encoding ProjectionConfig.lobes"}
+
+  def decode_parallel(value) when is_float(value), do: value
+  def decode_parallel(value) when is_integer(value), do: value
+  def decode_parallel(_), do: {:error, "Unexpected type when decoding ProjectionConfig.parallel"}
+
+  def encode_parallel(value) when is_float(value), do: value
+  def encode_parallel(value) when is_integer(value), do: value
+  def encode_parallel(_), do: {:error, "Unexpected type when encoding ProjectionConfig.parallel"}
+
   def decode_precision_value(value) when is_float(value), do: value
   def decode_precision_value(value) when is_integer(value), do: value
   def decode_precision_value(value) when is_binary(value), do: value
@@ -2160,23 +2936,55 @@ defmodule ProjectionConfig do
   def encode_precision_value(value) when is_binary(value), do: value
   def encode_precision_value(_), do: {:error, "Unexpected type when encoding ProjectionConfig.precision"}
 
+  def decode_radius(value) when is_float(value), do: value
+  def decode_radius(value) when is_integer(value), do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding ProjectionConfig.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding ProjectionConfig.radius"}
+
+  def decode_ratio(value) when is_float(value), do: value
+  def decode_ratio(value) when is_integer(value), do: value
+  def decode_ratio(_), do: {:error, "Unexpected type when decoding ProjectionConfig.ratio"}
+
+  def encode_ratio(value) when is_float(value), do: value
+  def encode_ratio(value) when is_integer(value), do: value
+  def encode_ratio(_), do: {:error, "Unexpected type when encoding ProjectionConfig.ratio"}
+
+  def decode_spacing(value) when is_float(value), do: value
+  def decode_spacing(value) when is_integer(value), do: value
+  def decode_spacing(_), do: {:error, "Unexpected type when decoding ProjectionConfig.spacing"}
+
+  def encode_spacing(value) when is_float(value), do: value
+  def encode_spacing(value) when is_integer(value), do: value
+  def encode_spacing(_), do: {:error, "Unexpected type when encoding ProjectionConfig.spacing"}
+
+  def decode_tilt(value) when is_float(value), do: value
+  def decode_tilt(value) when is_integer(value), do: value
+  def decode_tilt(_), do: {:error, "Unexpected type when decoding ProjectionConfig.tilt"}
+
+  def encode_tilt(value) when is_float(value), do: value
+  def encode_tilt(value) when is_integer(value), do: value
+  def encode_tilt(_), do: {:error, "Unexpected type when encoding ProjectionConfig.tilt"}
+
   def from_map(m) do
     %ProjectionConfig{
       center: m["center"],
-      clip_angle: m["clipAngle"],
+      clip_angle: m["clipAngle"] && decode_clip_angle(m["clipAngle"]),
       clip_extent: m["clipExtent"],
-      coefficient: m["coefficient"],
-      distance: m["distance"],
-      fraction: m["fraction"],
-      lobes: m["lobes"],
-      parallel: m["parallel"],
+      coefficient: m["coefficient"] && decode_coefficient(m["coefficient"]),
+      distance: m["distance"] && decode_distance(m["distance"]),
+      fraction: m["fraction"] && decode_fraction(m["fraction"]),
+      lobes: m["lobes"] && decode_lobes(m["lobes"]),
+      parallel: m["parallel"] && decode_parallel(m["parallel"]),
       precision: m["precision"]
       |> Map.new(fn {key, value} -> {key, decode_precision_value(value)} end),
-      radius: m["radius"],
-      ratio: m["ratio"],
+      radius: m["radius"] && decode_radius(m["radius"]),
+      ratio: m["ratio"] && decode_ratio(m["ratio"]),
       rotate: m["rotate"],
-      spacing: m["spacing"],
-      tilt: m["tilt"],
+      spacing: m["spacing"] && decode_spacing(m["spacing"]),
+      tilt: m["tilt"] && decode_tilt(m["tilt"]),
       type: m["type"] && VGProjectionType.decode(m["type"]),
     }
   end
@@ -2225,18 +3033,34 @@ defmodule VGScheme do
           step: float() | nil
         }
 
+  def decode_count(value) when is_float(value), do: value
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding VGScheme.count"}
+
+  def encode_count(value) when is_float(value), do: value
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding VGScheme.count"}
+
   def decode_scheme(value) when is_binary(value), do: value
   def decode_scheme(_), do: {:error, "Unexpected type when decoding VGScheme.scheme"}
 
   def encode_scheme(value) when is_binary(value), do: value
   def encode_scheme(_), do: {:error, "Unexpected type when encoding VGScheme.scheme"}
 
+  def decode_step(value) when is_float(value), do: value
+  def decode_step(value) when is_integer(value), do: value
+  def decode_step(_), do: {:error, "Unexpected type when decoding VGScheme.step"}
+
+  def encode_step(value) when is_float(value), do: value
+  def encode_step(value) when is_integer(value), do: value
+  def encode_step(_), do: {:error, "Unexpected type when encoding VGScheme.step"}
+
   def from_map(m) do
     %VGScheme{
-      count: m["count"],
+      count: m["count"] && decode_count(m["count"]),
       extent: m["extent"],
       scheme: m["scheme"] && decode_scheme(m["scheme"]),
-      step: m["step"],
+      step: m["step"] && decode_step(m["step"]),
     }
   end
 
@@ -2312,26 +3136,146 @@ defmodule ScaleConfig do
           use_unaggregated_domain: boolean() | nil
         }
 
+  def decode_band_padding_inner(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_band_padding_inner(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_band_padding_inner(_), do: {:error, "Unexpected type when decoding ScaleConfig.band_padding_inner"}
+
+  def encode_band_padding_inner(value) when is_float(value), do: value
+  def encode_band_padding_inner(value) when is_integer(value), do: value
+  def encode_band_padding_inner(_), do: {:error, "Unexpected type when encoding ScaleConfig.band_padding_inner"}
+
+  def decode_band_padding_outer(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_band_padding_outer(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_band_padding_outer(_), do: {:error, "Unexpected type when decoding ScaleConfig.band_padding_outer"}
+
+  def encode_band_padding_outer(value) when is_float(value), do: value
+  def encode_band_padding_outer(value) when is_integer(value), do: value
+  def encode_band_padding_outer(_), do: {:error, "Unexpected type when encoding ScaleConfig.band_padding_outer"}
+
+  def decode_continuous_padding(value) when is_float(value) and value >= 0, do: value
+  def decode_continuous_padding(value) when is_integer(value) and value >= 0, do: value
+  def decode_continuous_padding(_), do: {:error, "Unexpected type when decoding ScaleConfig.continuous_padding"}
+
+  def encode_continuous_padding(value) when is_float(value), do: value
+  def encode_continuous_padding(value) when is_integer(value), do: value
+  def encode_continuous_padding(_), do: {:error, "Unexpected type when encoding ScaleConfig.continuous_padding"}
+
+  def decode_max_band_size(value) when is_float(value) and value >= 0, do: value
+  def decode_max_band_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_max_band_size(_), do: {:error, "Unexpected type when decoding ScaleConfig.max_band_size"}
+
+  def encode_max_band_size(value) when is_float(value), do: value
+  def encode_max_band_size(value) when is_integer(value), do: value
+  def encode_max_band_size(_), do: {:error, "Unexpected type when encoding ScaleConfig.max_band_size"}
+
+  def decode_max_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_max_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_max_font_size(_), do: {:error, "Unexpected type when decoding ScaleConfig.max_font_size"}
+
+  def encode_max_font_size(value) when is_float(value), do: value
+  def encode_max_font_size(value) when is_integer(value), do: value
+  def encode_max_font_size(_), do: {:error, "Unexpected type when encoding ScaleConfig.max_font_size"}
+
+  def decode_max_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_max_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_max_opacity(_), do: {:error, "Unexpected type when decoding ScaleConfig.max_opacity"}
+
+  def encode_max_opacity(value) when is_float(value), do: value
+  def encode_max_opacity(value) when is_integer(value), do: value
+  def encode_max_opacity(_), do: {:error, "Unexpected type when encoding ScaleConfig.max_opacity"}
+
+  def decode_max_size(value) when is_float(value) and value >= 0, do: value
+  def decode_max_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_max_size(_), do: {:error, "Unexpected type when decoding ScaleConfig.max_size"}
+
+  def encode_max_size(value) when is_float(value), do: value
+  def encode_max_size(value) when is_integer(value), do: value
+  def encode_max_size(_), do: {:error, "Unexpected type when encoding ScaleConfig.max_size"}
+
+  def decode_max_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_max_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_max_stroke_width(_), do: {:error, "Unexpected type when decoding ScaleConfig.max_stroke_width"}
+
+  def encode_max_stroke_width(value) when is_float(value), do: value
+  def encode_max_stroke_width(value) when is_integer(value), do: value
+  def encode_max_stroke_width(_), do: {:error, "Unexpected type when encoding ScaleConfig.max_stroke_width"}
+
+  def decode_min_band_size(value) when is_float(value) and value >= 0, do: value
+  def decode_min_band_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_min_band_size(_), do: {:error, "Unexpected type when decoding ScaleConfig.min_band_size"}
+
+  def encode_min_band_size(value) when is_float(value), do: value
+  def encode_min_band_size(value) when is_integer(value), do: value
+  def encode_min_band_size(_), do: {:error, "Unexpected type when encoding ScaleConfig.min_band_size"}
+
+  def decode_min_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_min_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_min_font_size(_), do: {:error, "Unexpected type when decoding ScaleConfig.min_font_size"}
+
+  def encode_min_font_size(value) when is_float(value), do: value
+  def encode_min_font_size(value) when is_integer(value), do: value
+  def encode_min_font_size(_), do: {:error, "Unexpected type when encoding ScaleConfig.min_font_size"}
+
+  def decode_min_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_min_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_min_opacity(_), do: {:error, "Unexpected type when decoding ScaleConfig.min_opacity"}
+
+  def encode_min_opacity(value) when is_float(value), do: value
+  def encode_min_opacity(value) when is_integer(value), do: value
+  def encode_min_opacity(_), do: {:error, "Unexpected type when encoding ScaleConfig.min_opacity"}
+
+  def decode_min_size(value) when is_float(value) and value >= 0, do: value
+  def decode_min_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_min_size(_), do: {:error, "Unexpected type when decoding ScaleConfig.min_size"}
+
+  def encode_min_size(value) when is_float(value), do: value
+  def encode_min_size(value) when is_integer(value), do: value
+  def encode_min_size(_), do: {:error, "Unexpected type when encoding ScaleConfig.min_size"}
+
+  def decode_min_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_min_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_min_stroke_width(_), do: {:error, "Unexpected type when decoding ScaleConfig.min_stroke_width"}
+
+  def encode_min_stroke_width(value) when is_float(value), do: value
+  def encode_min_stroke_width(value) when is_integer(value), do: value
+  def encode_min_stroke_width(_), do: {:error, "Unexpected type when encoding ScaleConfig.min_stroke_width"}
+
+  def decode_point_padding(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_point_padding(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_point_padding(_), do: {:error, "Unexpected type when decoding ScaleConfig.point_padding"}
+
+  def encode_point_padding(value) when is_float(value), do: value
+  def encode_point_padding(value) when is_integer(value), do: value
+  def encode_point_padding(_), do: {:error, "Unexpected type when encoding ScaleConfig.point_padding"}
+
+  def decode_text_x_range_step(value) when is_float(value) and value >= 0, do: value
+  def decode_text_x_range_step(value) when is_integer(value) and value >= 0, do: value
+  def decode_text_x_range_step(_), do: {:error, "Unexpected type when decoding ScaleConfig.text_x_range_step"}
+
+  def encode_text_x_range_step(value) when is_float(value), do: value
+  def encode_text_x_range_step(value) when is_integer(value), do: value
+  def encode_text_x_range_step(_), do: {:error, "Unexpected type when encoding ScaleConfig.text_x_range_step"}
+
   def from_map(m) do
     %ScaleConfig{
-      band_padding_inner: m["bandPaddingInner"],
-      band_padding_outer: m["bandPaddingOuter"],
+      band_padding_inner: m["bandPaddingInner"] && decode_band_padding_inner(m["bandPaddingInner"]),
+      band_padding_outer: m["bandPaddingOuter"] && decode_band_padding_outer(m["bandPaddingOuter"]),
       clamp: m["clamp"],
-      continuous_padding: m["continuousPadding"],
-      max_band_size: m["maxBandSize"],
-      max_font_size: m["maxFontSize"],
-      max_opacity: m["maxOpacity"],
-      max_size: m["maxSize"],
-      max_stroke_width: m["maxStrokeWidth"],
-      min_band_size: m["minBandSize"],
-      min_font_size: m["minFontSize"],
-      min_opacity: m["minOpacity"],
-      min_size: m["minSize"],
-      min_stroke_width: m["minStrokeWidth"],
-      point_padding: m["pointPadding"],
+      continuous_padding: m["continuousPadding"] && decode_continuous_padding(m["continuousPadding"]),
+      max_band_size: m["maxBandSize"] && decode_max_band_size(m["maxBandSize"]),
+      max_font_size: m["maxFontSize"] && decode_max_font_size(m["maxFontSize"]),
+      max_opacity: m["maxOpacity"] && decode_max_opacity(m["maxOpacity"]),
+      max_size: m["maxSize"] && decode_max_size(m["maxSize"]),
+      max_stroke_width: m["maxStrokeWidth"] && decode_max_stroke_width(m["maxStrokeWidth"]),
+      min_band_size: m["minBandSize"] && decode_min_band_size(m["minBandSize"]),
+      min_font_size: m["minFontSize"] && decode_min_font_size(m["minFontSize"]),
+      min_opacity: m["minOpacity"] && decode_min_opacity(m["minOpacity"]),
+      min_size: m["minSize"] && decode_min_size(m["minSize"]),
+      min_stroke_width: m["minStrokeWidth"] && decode_min_stroke_width(m["minStrokeWidth"]),
+      point_padding: m["pointPadding"] && decode_point_padding(m["pointPadding"]),
       range_step: m["rangeStep"],
       round: m["round"],
-      text_x_range_step: m["textXRangeStep"],
+      text_x_range_step: m["textXRangeStep"] && decode_text_x_range_step(m["textXRangeStep"]),
       use_unaggregated_domain: m["useUnaggregatedDomain"],
     }
   end
@@ -2562,21 +3506,53 @@ defmodule BrushConfig do
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding BrushConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value), do: value
+  def decode_fill_opacity(value) when is_integer(value), do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding BrushConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding BrushConfig.fill_opacity"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding BrushConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding BrushConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding BrushConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding BrushConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value), do: value
+  def decode_stroke_opacity(value) when is_integer(value), do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding BrushConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding BrushConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value), do: value
+  def decode_stroke_width(value) when is_integer(value), do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding BrushConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding BrushConfig.stroke_width"}
+
   def from_map(m) do
     %BrushConfig{
       fill: m["fill"] && decode_fill(m["fill"]),
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
     }
   end
 
@@ -2822,14 +3798,38 @@ defmodule VGBinding do
   def encode_input(value) when is_binary(value), do: value
   def encode_input(_), do: {:error, "Unexpected type when encoding VGBinding.input"}
 
+  def decode_max(value) when is_float(value), do: value
+  def decode_max(value) when is_integer(value), do: value
+  def decode_max(_), do: {:error, "Unexpected type when decoding VGBinding.max"}
+
+  def encode_max(value) when is_float(value), do: value
+  def encode_max(value) when is_integer(value), do: value
+  def encode_max(_), do: {:error, "Unexpected type when encoding VGBinding.max"}
+
+  def decode_min(value) when is_float(value), do: value
+  def decode_min(value) when is_integer(value), do: value
+  def decode_min(_), do: {:error, "Unexpected type when decoding VGBinding.min"}
+
+  def encode_min(value) when is_float(value), do: value
+  def encode_min(value) when is_integer(value), do: value
+  def encode_min(_), do: {:error, "Unexpected type when encoding VGBinding.min"}
+
+  def decode_step(value) when is_float(value), do: value
+  def decode_step(value) when is_integer(value), do: value
+  def decode_step(_), do: {:error, "Unexpected type when decoding VGBinding.step"}
+
+  def encode_step(value) when is_float(value), do: value
+  def encode_step(value) when is_integer(value), do: value
+  def encode_step(_), do: {:error, "Unexpected type when encoding VGBinding.step"}
+
   def from_map(m) do
     %VGBinding{
       element: m["element"] && decode_element(m["element"]),
       input: decode_input(m["input"]),
       options: m["options"],
-      max: m["max"],
-      min: m["min"],
-      step: m["step"],
+      max: m["max"] && decode_max(m["max"]),
+      min: m["min"] && decode_min(m["min"]),
+      step: m["step"] && decode_step(m["step"]),
     }
   end
 
@@ -3085,21 +4085,61 @@ defmodule VGMarkConfig do
           theta: float() | nil
         }
 
+  def decode_angle(value) when is_float(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(value) when is_integer(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding VGMarkConfig.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding VGMarkConfig.angle"}
+
+  def decode_dx(value) when is_float(value), do: value
+  def decode_dx(value) when is_integer(value), do: value
+  def decode_dx(_), do: {:error, "Unexpected type when decoding VGMarkConfig.dx"}
+
+  def encode_dx(value) when is_float(value), do: value
+  def encode_dx(value) when is_integer(value), do: value
+  def encode_dx(_), do: {:error, "Unexpected type when encoding VGMarkConfig.dx"}
+
+  def decode_dy(value) when is_float(value), do: value
+  def decode_dy(value) when is_integer(value), do: value
+  def decode_dy(_), do: {:error, "Unexpected type when decoding VGMarkConfig.dy"}
+
+  def encode_dy(value) when is_float(value), do: value
+  def encode_dy(value) when is_integer(value), do: value
+  def encode_dy(_), do: {:error, "Unexpected type when encoding VGMarkConfig.dy"}
+
   def decode_fill(value) when is_binary(value), do: value
   def decode_fill(_), do: {:error, "Unexpected type when decoding VGMarkConfig.fill"}
 
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding VGMarkConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding VGMarkConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding VGMarkConfig.fill_opacity"}
+
   def decode_font(value) when is_binary(value), do: value
   def decode_font(_), do: {:error, "Unexpected type when decoding VGMarkConfig.font"}
 
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding VGMarkConfig.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding VGMarkConfig.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding VGMarkConfig.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding VGMarkConfig.font_weight"}
 
@@ -3115,54 +4155,126 @@ defmodule VGMarkConfig do
   def encode_href(value) when is_binary(value), do: value
   def encode_href(_), do: {:error, "Unexpected type when encoding VGMarkConfig.href"}
 
+  def decode_limit(value) when is_float(value), do: value
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding VGMarkConfig.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding VGMarkConfig.limit"}
+
+  def decode_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(_), do: {:error, "Unexpected type when decoding VGMarkConfig.opacity"}
+
+  def encode_opacity(value) when is_float(value), do: value
+  def encode_opacity(value) when is_integer(value), do: value
+  def encode_opacity(_), do: {:error, "Unexpected type when encoding VGMarkConfig.opacity"}
+
+  def decode_radius(value) when is_float(value) and value >= 0, do: value
+  def decode_radius(value) when is_integer(value) and value >= 0, do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding VGMarkConfig.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding VGMarkConfig.radius"}
+
   def decode_shape(value) when is_binary(value), do: value
   def decode_shape(_), do: {:error, "Unexpected type when decoding VGMarkConfig.shape"}
 
   def encode_shape(value) when is_binary(value), do: value
   def encode_shape(_), do: {:error, "Unexpected type when encoding VGMarkConfig.shape"}
 
+  def decode_size(value) when is_float(value) and value >= 0, do: value
+  def decode_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding VGMarkConfig.size"}
+
+  def encode_size(value) when is_float(value), do: value
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding VGMarkConfig.size"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding VGMarkConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding VGMarkConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding VGMarkConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding VGMarkConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding VGMarkConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding VGMarkConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding VGMarkConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding VGMarkConfig.stroke_width"}
+
+  def decode_tension(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(_), do: {:error, "Unexpected type when decoding VGMarkConfig.tension"}
+
+  def encode_tension(value) when is_float(value), do: value
+  def encode_tension(value) when is_integer(value), do: value
+  def encode_tension(_), do: {:error, "Unexpected type when encoding VGMarkConfig.tension"}
+
   def decode_text(value) when is_binary(value), do: value
   def decode_text(_), do: {:error, "Unexpected type when decoding VGMarkConfig.text"}
 
   def encode_text(value) when is_binary(value), do: value
   def encode_text(_), do: {:error, "Unexpected type when encoding VGMarkConfig.text"}
 
+  def decode_theta(value) when is_float(value), do: value
+  def decode_theta(value) when is_integer(value), do: value
+  def decode_theta(_), do: {:error, "Unexpected type when decoding VGMarkConfig.theta"}
+
+  def encode_theta(value) when is_float(value), do: value
+  def encode_theta(value) when is_integer(value), do: value
+  def encode_theta(_), do: {:error, "Unexpected type when encoding VGMarkConfig.theta"}
+
   def from_map(m) do
     %VGMarkConfig{
       align: m["align"] && HorizontalAlign.decode(m["align"]),
-      angle: m["angle"],
+      angle: m["angle"] && decode_angle(m["angle"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
       cursor: m["cursor"] && Cursor.decode(m["cursor"]),
-      dx: m["dx"],
-      dy: m["dy"],
+      dx: m["dx"] && decode_dx(m["dx"]),
+      dy: m["dy"] && decode_dy(m["dy"]),
       fill: m["fill"] && decode_fill(m["fill"]),
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_style: m["fontStyle"] && FontStyle.decode(m["fontStyle"]),
       font_weight: decode_font_weight(m["fontWeight"]),
       href: m["href"] && decode_href(m["href"]),
       interpolate: m["interpolate"] && Interpolate.decode(m["interpolate"]),
-      limit: m["limit"],
-      opacity: m["opacity"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      opacity: m["opacity"] && decode_opacity(m["opacity"]),
       orient: m["orient"] && Orient.decode(m["orient"]),
-      radius: m["radius"],
+      radius: m["radius"] && decode_radius(m["radius"]),
       shape: m["shape"] && decode_shape(m["shape"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
-      tension: m["tension"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
+      tension: m["tension"] && decode_tension(m["tension"]),
       text: m["text"] && decode_text(m["text"]),
-      theta: m["theta"],
+      theta: m["theta"] && decode_theta(m["theta"]),
     }
   end
 
@@ -3284,27 +4396,67 @@ defmodule TextConfig do
           theta: float() | nil
         }
 
+  def decode_angle(value) when is_float(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(value) when is_integer(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding TextConfig.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding TextConfig.angle"}
+
   def decode_color(value) when is_binary(value), do: value
   def decode_color(_), do: {:error, "Unexpected type when decoding TextConfig.color"}
 
   def encode_color(value) when is_binary(value), do: value
   def encode_color(_), do: {:error, "Unexpected type when encoding TextConfig.color"}
 
+  def decode_dx(value) when is_float(value), do: value
+  def decode_dx(value) when is_integer(value), do: value
+  def decode_dx(_), do: {:error, "Unexpected type when decoding TextConfig.dx"}
+
+  def encode_dx(value) when is_float(value), do: value
+  def encode_dx(value) when is_integer(value), do: value
+  def encode_dx(_), do: {:error, "Unexpected type when encoding TextConfig.dx"}
+
+  def decode_dy(value) when is_float(value), do: value
+  def decode_dy(value) when is_integer(value), do: value
+  def decode_dy(_), do: {:error, "Unexpected type when decoding TextConfig.dy"}
+
+  def encode_dy(value) when is_float(value), do: value
+  def encode_dy(value) when is_integer(value), do: value
+  def encode_dy(_), do: {:error, "Unexpected type when encoding TextConfig.dy"}
+
   def decode_fill(value) when is_binary(value), do: value
   def decode_fill(_), do: {:error, "Unexpected type when decoding TextConfig.fill"}
 
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding TextConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding TextConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding TextConfig.fill_opacity"}
+
   def decode_font(value) when is_binary(value), do: value
   def decode_font(_), do: {:error, "Unexpected type when decoding TextConfig.font"}
 
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding TextConfig.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding TextConfig.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding TextConfig.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding TextConfig.font_weight"}
 
@@ -3320,57 +4472,129 @@ defmodule TextConfig do
   def encode_href(value) when is_binary(value), do: value
   def encode_href(_), do: {:error, "Unexpected type when encoding TextConfig.href"}
 
+  def decode_limit(value) when is_float(value), do: value
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TextConfig.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TextConfig.limit"}
+
+  def decode_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(_), do: {:error, "Unexpected type when decoding TextConfig.opacity"}
+
+  def encode_opacity(value) when is_float(value), do: value
+  def encode_opacity(value) when is_integer(value), do: value
+  def encode_opacity(_), do: {:error, "Unexpected type when encoding TextConfig.opacity"}
+
+  def decode_radius(value) when is_float(value) and value >= 0, do: value
+  def decode_radius(value) when is_integer(value) and value >= 0, do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding TextConfig.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding TextConfig.radius"}
+
   def decode_shape(value) when is_binary(value), do: value
   def decode_shape(_), do: {:error, "Unexpected type when decoding TextConfig.shape"}
 
   def encode_shape(value) when is_binary(value), do: value
   def encode_shape(_), do: {:error, "Unexpected type when encoding TextConfig.shape"}
 
+  def decode_size(value) when is_float(value) and value >= 0, do: value
+  def decode_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding TextConfig.size"}
+
+  def encode_size(value) when is_float(value), do: value
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding TextConfig.size"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding TextConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding TextConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding TextConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding TextConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding TextConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding TextConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding TextConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding TextConfig.stroke_width"}
+
+  def decode_tension(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(_), do: {:error, "Unexpected type when decoding TextConfig.tension"}
+
+  def encode_tension(value) when is_float(value), do: value
+  def encode_tension(value) when is_integer(value), do: value
+  def encode_tension(_), do: {:error, "Unexpected type when encoding TextConfig.tension"}
+
   def decode_text(value) when is_binary(value), do: value
   def decode_text(_), do: {:error, "Unexpected type when decoding TextConfig.text"}
 
   def encode_text(value) when is_binary(value), do: value
   def encode_text(_), do: {:error, "Unexpected type when encoding TextConfig.text"}
 
+  def decode_theta(value) when is_float(value), do: value
+  def decode_theta(value) when is_integer(value), do: value
+  def decode_theta(_), do: {:error, "Unexpected type when decoding TextConfig.theta"}
+
+  def encode_theta(value) when is_float(value), do: value
+  def encode_theta(value) when is_integer(value), do: value
+  def encode_theta(_), do: {:error, "Unexpected type when encoding TextConfig.theta"}
+
   def from_map(m) do
     %TextConfig{
       align: m["align"] && HorizontalAlign.decode(m["align"]),
-      angle: m["angle"],
+      angle: m["angle"] && decode_angle(m["angle"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
       color: m["color"] && decode_color(m["color"]),
       cursor: m["cursor"] && Cursor.decode(m["cursor"]),
-      dx: m["dx"],
-      dy: m["dy"],
+      dx: m["dx"] && decode_dx(m["dx"]),
+      dy: m["dy"] && decode_dy(m["dy"]),
       fill: m["fill"] && decode_fill(m["fill"]),
       filled: m["filled"],
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_style: m["fontStyle"] && FontStyle.decode(m["fontStyle"]),
       font_weight: decode_font_weight(m["fontWeight"]),
       href: m["href"] && decode_href(m["href"]),
       interpolate: m["interpolate"] && Interpolate.decode(m["interpolate"]),
-      limit: m["limit"],
-      opacity: m["opacity"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      opacity: m["opacity"] && decode_opacity(m["opacity"]),
       orient: m["orient"] && Orient.decode(m["orient"]),
-      radius: m["radius"],
+      radius: m["radius"] && decode_radius(m["radius"]),
       shape: m["shape"] && decode_shape(m["shape"]),
       short_time_labels: m["shortTimeLabels"],
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
-      tension: m["tension"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
+      tension: m["tension"] && decode_tension(m["tension"]),
       text: m["text"] && decode_text(m["text"]),
-      theta: m["theta"],
+      theta: m["theta"] && decode_theta(m["theta"]),
     }
   end
 
@@ -3497,27 +4721,75 @@ defmodule TickConfig do
           thickness: float() | nil
         }
 
+  def decode_angle(value) when is_float(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(value) when is_integer(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding TickConfig.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding TickConfig.angle"}
+
+  def decode_band_size(value) when is_float(value) and value >= 0, do: value
+  def decode_band_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_band_size(_), do: {:error, "Unexpected type when decoding TickConfig.band_size"}
+
+  def encode_band_size(value) when is_float(value), do: value
+  def encode_band_size(value) when is_integer(value), do: value
+  def encode_band_size(_), do: {:error, "Unexpected type when encoding TickConfig.band_size"}
+
   def decode_color(value) when is_binary(value), do: value
   def decode_color(_), do: {:error, "Unexpected type when decoding TickConfig.color"}
 
   def encode_color(value) when is_binary(value), do: value
   def encode_color(_), do: {:error, "Unexpected type when encoding TickConfig.color"}
 
+  def decode_dx(value) when is_float(value), do: value
+  def decode_dx(value) when is_integer(value), do: value
+  def decode_dx(_), do: {:error, "Unexpected type when decoding TickConfig.dx"}
+
+  def encode_dx(value) when is_float(value), do: value
+  def encode_dx(value) when is_integer(value), do: value
+  def encode_dx(_), do: {:error, "Unexpected type when encoding TickConfig.dx"}
+
+  def decode_dy(value) when is_float(value), do: value
+  def decode_dy(value) when is_integer(value), do: value
+  def decode_dy(_), do: {:error, "Unexpected type when decoding TickConfig.dy"}
+
+  def encode_dy(value) when is_float(value), do: value
+  def encode_dy(value) when is_integer(value), do: value
+  def encode_dy(_), do: {:error, "Unexpected type when encoding TickConfig.dy"}
+
   def decode_fill(value) when is_binary(value), do: value
   def decode_fill(_), do: {:error, "Unexpected type when decoding TickConfig.fill"}
 
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding TickConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding TickConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding TickConfig.fill_opacity"}
+
   def decode_font(value) when is_binary(value), do: value
   def decode_font(_), do: {:error, "Unexpected type when decoding TickConfig.font"}
 
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding TickConfig.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding TickConfig.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding TickConfig.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding TickConfig.font_weight"}
 
@@ -3533,58 +4805,138 @@ defmodule TickConfig do
   def encode_href(value) when is_binary(value), do: value
   def encode_href(_), do: {:error, "Unexpected type when encoding TickConfig.href"}
 
+  def decode_limit(value) when is_float(value), do: value
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TickConfig.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TickConfig.limit"}
+
+  def decode_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(_), do: {:error, "Unexpected type when decoding TickConfig.opacity"}
+
+  def encode_opacity(value) when is_float(value), do: value
+  def encode_opacity(value) when is_integer(value), do: value
+  def encode_opacity(_), do: {:error, "Unexpected type when encoding TickConfig.opacity"}
+
+  def decode_radius(value) when is_float(value) and value >= 0, do: value
+  def decode_radius(value) when is_integer(value) and value >= 0, do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding TickConfig.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding TickConfig.radius"}
+
   def decode_shape(value) when is_binary(value), do: value
   def decode_shape(_), do: {:error, "Unexpected type when decoding TickConfig.shape"}
 
   def encode_shape(value) when is_binary(value), do: value
   def encode_shape(_), do: {:error, "Unexpected type when encoding TickConfig.shape"}
 
+  def decode_size(value) when is_float(value) and value >= 0, do: value
+  def decode_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding TickConfig.size"}
+
+  def encode_size(value) when is_float(value), do: value
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding TickConfig.size"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding TickConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding TickConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding TickConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding TickConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding TickConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding TickConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding TickConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding TickConfig.stroke_width"}
+
+  def decode_tension(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(_), do: {:error, "Unexpected type when decoding TickConfig.tension"}
+
+  def encode_tension(value) when is_float(value), do: value
+  def encode_tension(value) when is_integer(value), do: value
+  def encode_tension(_), do: {:error, "Unexpected type when encoding TickConfig.tension"}
+
   def decode_text(value) when is_binary(value), do: value
   def decode_text(_), do: {:error, "Unexpected type when decoding TickConfig.text"}
 
   def encode_text(value) when is_binary(value), do: value
   def encode_text(_), do: {:error, "Unexpected type when encoding TickConfig.text"}
 
+  def decode_theta(value) when is_float(value), do: value
+  def decode_theta(value) when is_integer(value), do: value
+  def decode_theta(_), do: {:error, "Unexpected type when decoding TickConfig.theta"}
+
+  def encode_theta(value) when is_float(value), do: value
+  def encode_theta(value) when is_integer(value), do: value
+  def encode_theta(_), do: {:error, "Unexpected type when encoding TickConfig.theta"}
+
+  def decode_thickness(value) when is_float(value) and value >= 0, do: value
+  def decode_thickness(value) when is_integer(value) and value >= 0, do: value
+  def decode_thickness(_), do: {:error, "Unexpected type when decoding TickConfig.thickness"}
+
+  def encode_thickness(value) when is_float(value), do: value
+  def encode_thickness(value) when is_integer(value), do: value
+  def encode_thickness(_), do: {:error, "Unexpected type when encoding TickConfig.thickness"}
+
   def from_map(m) do
     %TickConfig{
       align: m["align"] && HorizontalAlign.decode(m["align"]),
-      angle: m["angle"],
-      band_size: m["bandSize"],
+      angle: m["angle"] && decode_angle(m["angle"]),
+      band_size: m["bandSize"] && decode_band_size(m["bandSize"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
       color: m["color"] && decode_color(m["color"]),
       cursor: m["cursor"] && Cursor.decode(m["cursor"]),
-      dx: m["dx"],
-      dy: m["dy"],
+      dx: m["dx"] && decode_dx(m["dx"]),
+      dy: m["dy"] && decode_dy(m["dy"]),
       fill: m["fill"] && decode_fill(m["fill"]),
       filled: m["filled"],
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_style: m["fontStyle"] && FontStyle.decode(m["fontStyle"]),
       font_weight: decode_font_weight(m["fontWeight"]),
       href: m["href"] && decode_href(m["href"]),
       interpolate: m["interpolate"] && Interpolate.decode(m["interpolate"]),
-      limit: m["limit"],
-      opacity: m["opacity"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      opacity: m["opacity"] && decode_opacity(m["opacity"]),
       orient: m["orient"] && Orient.decode(m["orient"]),
-      radius: m["radius"],
+      radius: m["radius"] && decode_radius(m["radius"]),
       shape: m["shape"] && decode_shape(m["shape"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
-      tension: m["tension"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
+      tension: m["tension"] && decode_tension(m["tension"]),
       text: m["text"] && decode_text(m["text"]),
-      theta: m["theta"],
-      thickness: m["thickness"],
+      theta: m["theta"] && decode_theta(m["theta"]),
+      thickness: m["thickness"] && decode_thickness(m["thickness"]),
     }
   end
 
@@ -3789,6 +5141,14 @@ defmodule VGTitleConfig do
           orient: TitleOrient.t() | nil
         }
 
+  def decode_angle(value) when is_float(value), do: value
+  def decode_angle(value) when is_integer(value), do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding VGTitleConfig.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding VGTitleConfig.angle"}
+
   def decode_color(value) when is_binary(value), do: value
   def decode_color(_), do: {:error, "Unexpected type when decoding VGTitleConfig.color"}
 
@@ -3801,9 +5161,17 @@ defmodule VGTitleConfig do
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding VGTitleConfig.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding VGTitleConfig.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding VGTitleConfig.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding VGTitleConfig.font_weight"}
 
@@ -3813,17 +5181,33 @@ defmodule VGTitleConfig do
   def encode_font_weight(value) when is_nil(value), do: value
   def encode_font_weight(_), do: {:error, "Unexpected type when encoding VGTitleConfig.font_weight"}
 
+  def decode_limit(value) when is_float(value) and value >= 0, do: value
+  def decode_limit(value) when is_integer(value) and value >= 0, do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding VGTitleConfig.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding VGTitleConfig.limit"}
+
+  def decode_offset(value) when is_float(value), do: value
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding VGTitleConfig.offset"}
+
+  def encode_offset(value) when is_float(value), do: value
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding VGTitleConfig.offset"}
+
   def from_map(m) do
     %VGTitleConfig{
       anchor: m["anchor"] && Anchor.decode(m["anchor"]),
-      angle: m["angle"],
+      angle: m["angle"] && decode_angle(m["angle"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
       color: m["color"] && decode_color(m["color"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_weight: decode_font_weight(m["fontWeight"]),
-      limit: m["limit"],
-      offset: m["offset"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      offset: m["offset"] && decode_offset(m["offset"]),
       orient: m["orient"] && TitleOrient.decode(m["orient"]),
     }
   end
@@ -3892,24 +5276,72 @@ defmodule ViewConfig do
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding ViewConfig.fill"}
 
+  def decode_fill_opacity(value) when is_float(value), do: value
+  def decode_fill_opacity(value) when is_integer(value), do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding ViewConfig.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding ViewConfig.fill_opacity"}
+
+  def decode_height(value) when is_float(value), do: value
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding ViewConfig.height"}
+
+  def encode_height(value) when is_float(value), do: value
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding ViewConfig.height"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding ViewConfig.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding ViewConfig.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding ViewConfig.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding ViewConfig.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value), do: value
+  def decode_stroke_opacity(value) when is_integer(value), do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding ViewConfig.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding ViewConfig.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value), do: value
+  def decode_stroke_width(value) when is_integer(value), do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding ViewConfig.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding ViewConfig.stroke_width"}
+
+  def decode_width(value) when is_float(value), do: value
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding ViewConfig.width"}
+
+  def encode_width(value) when is_float(value), do: value
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding ViewConfig.width"}
+
   def from_map(m) do
     %ViewConfig{
       clip: m["clip"],
       fill: m["fill"] && decode_fill(m["fill"]),
-      fill_opacity: m["fillOpacity"],
-      height: m["height"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
+      height: m["height"] && decode_height(m["height"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
-      width: m["width"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
+      width: m["width"] && decode_width(m["width"]),
     }
   end
 
@@ -4550,15 +5982,47 @@ defmodule BinParams do
           steps: [float()] | nil
         }
 
+  def decode_base(value) when is_float(value), do: value
+  def decode_base(value) when is_integer(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding BinParams.base"}
+
+  def encode_base(value) when is_float(value), do: value
+  def encode_base(value) when is_integer(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding BinParams.base"}
+
+  def decode_maxbins(value) when is_float(value) and value >= 2, do: value
+  def decode_maxbins(value) when is_integer(value) and value >= 2, do: value
+  def decode_maxbins(_), do: {:error, "Unexpected type when decoding BinParams.maxbins"}
+
+  def encode_maxbins(value) when is_float(value), do: value
+  def encode_maxbins(value) when is_integer(value), do: value
+  def encode_maxbins(_), do: {:error, "Unexpected type when encoding BinParams.maxbins"}
+
+  def decode_minstep(value) when is_float(value), do: value
+  def decode_minstep(value) when is_integer(value), do: value
+  def decode_minstep(_), do: {:error, "Unexpected type when decoding BinParams.minstep"}
+
+  def encode_minstep(value) when is_float(value), do: value
+  def encode_minstep(value) when is_integer(value), do: value
+  def encode_minstep(_), do: {:error, "Unexpected type when encoding BinParams.minstep"}
+
+  def decode_step(value) when is_float(value), do: value
+  def decode_step(value) when is_integer(value), do: value
+  def decode_step(_), do: {:error, "Unexpected type when decoding BinParams.step"}
+
+  def encode_step(value) when is_float(value), do: value
+  def encode_step(value) when is_integer(value), do: value
+  def encode_step(_), do: {:error, "Unexpected type when encoding BinParams.step"}
+
   def from_map(m) do
     %BinParams{
-      base: m["base"],
+      base: m["base"] && decode_base(m["base"]),
       divide: m["divide"],
       extent: m["extent"],
-      maxbins: m["maxbins"],
-      minstep: m["minstep"],
+      maxbins: m["maxbins"] && decode_maxbins(m["maxbins"]),
+      minstep: m["minstep"] && decode_minstep(m["minstep"]),
       nice: m["nice"],
-      step: m["step"],
+      step: m["step"] && decode_step(m["step"]),
       steps: m["steps"],
     }
   end
@@ -4686,18 +6150,74 @@ defmodule DateTimeClass do
           year: float() | nil
         }
 
+  def decode_date(value) when is_float(value) and value >= 1 and value <= 31, do: value
+  def decode_date(value) when is_integer(value) and value >= 1 and value <= 31, do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding DateTimeClass.date"}
+
+  def encode_date(value) when is_float(value), do: value
+  def encode_date(value) when is_integer(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding DateTimeClass.date"}
+
+  def decode_hours(value) when is_float(value) and value >= 0 and value <= 23, do: value
+  def decode_hours(value) when is_integer(value) and value >= 0 and value <= 23, do: value
+  def decode_hours(_), do: {:error, "Unexpected type when decoding DateTimeClass.hours"}
+
+  def encode_hours(value) when is_float(value), do: value
+  def encode_hours(value) when is_integer(value), do: value
+  def encode_hours(_), do: {:error, "Unexpected type when encoding DateTimeClass.hours"}
+
+  def decode_milliseconds(value) when is_float(value) and value >= 0 and value <= 999, do: value
+  def decode_milliseconds(value) when is_integer(value) and value >= 0 and value <= 999, do: value
+  def decode_milliseconds(_), do: {:error, "Unexpected type when decoding DateTimeClass.milliseconds"}
+
+  def encode_milliseconds(value) when is_float(value), do: value
+  def encode_milliseconds(value) when is_integer(value), do: value
+  def encode_milliseconds(_), do: {:error, "Unexpected type when encoding DateTimeClass.milliseconds"}
+
+  def decode_minutes(value) when is_float(value) and value >= 0 and value <= 59, do: value
+  def decode_minutes(value) when is_integer(value) and value >= 0 and value <= 59, do: value
+  def decode_minutes(_), do: {:error, "Unexpected type when decoding DateTimeClass.minutes"}
+
+  def encode_minutes(value) when is_float(value), do: value
+  def encode_minutes(value) when is_integer(value), do: value
+  def encode_minutes(_), do: {:error, "Unexpected type when encoding DateTimeClass.minutes"}
+
+  def decode_quarter(value) when is_float(value) and value >= 1 and value <= 4, do: value
+  def decode_quarter(value) when is_integer(value) and value >= 1 and value <= 4, do: value
+  def decode_quarter(_), do: {:error, "Unexpected type when decoding DateTimeClass.quarter"}
+
+  def encode_quarter(value) when is_float(value), do: value
+  def encode_quarter(value) when is_integer(value), do: value
+  def encode_quarter(_), do: {:error, "Unexpected type when encoding DateTimeClass.quarter"}
+
+  def decode_seconds(value) when is_float(value) and value >= 0 and value <= 59, do: value
+  def decode_seconds(value) when is_integer(value) and value >= 0 and value <= 59, do: value
+  def decode_seconds(_), do: {:error, "Unexpected type when decoding DateTimeClass.seconds"}
+
+  def encode_seconds(value) when is_float(value), do: value
+  def encode_seconds(value) when is_integer(value), do: value
+  def encode_seconds(_), do: {:error, "Unexpected type when encoding DateTimeClass.seconds"}
+
+  def decode_year(value) when is_float(value), do: value
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding DateTimeClass.year"}
+
+  def encode_year(value) when is_float(value), do: value
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding DateTimeClass.year"}
+
   def from_map(m) do
     %DateTimeClass{
-      date: m["date"],
+      date: m["date"] && decode_date(m["date"]),
       day: m["day"],
-      hours: m["hours"],
-      milliseconds: m["milliseconds"],
-      minutes: m["minutes"],
+      hours: m["hours"] && decode_hours(m["hours"]),
+      milliseconds: m["milliseconds"] && decode_milliseconds(m["milliseconds"]),
+      minutes: m["minutes"] && decode_minutes(m["minutes"]),
       month: m["month"],
-      quarter: m["quarter"],
-      seconds: m["seconds"],
+      quarter: m["quarter"] && decode_quarter(m["quarter"]),
+      seconds: m["seconds"] && decode_seconds(m["seconds"]),
       utc: m["utc"],
-      year: m["year"],
+      year: m["year"] && decode_year(m["year"]),
     }
   end
 
@@ -5208,12 +6728,44 @@ defmodule Legend do
           zindex: float() | nil
         }
 
+  def decode_entry_padding(value) when is_float(value), do: value
+  def decode_entry_padding(value) when is_integer(value), do: value
+  def decode_entry_padding(_), do: {:error, "Unexpected type when decoding Legend.entry_padding"}
+
+  def encode_entry_padding(value) when is_float(value), do: value
+  def encode_entry_padding(value) when is_integer(value), do: value
+  def encode_entry_padding(_), do: {:error, "Unexpected type when encoding Legend.entry_padding"}
+
   def decode_format(value) when is_binary(value), do: value
   def decode_format(_), do: {:error, "Unexpected type when decoding Legend.format"}
 
   def encode_format(value) when is_binary(value), do: value
   def encode_format(_), do: {:error, "Unexpected type when encoding Legend.format"}
 
+  def decode_offset(value) when is_float(value), do: value
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Legend.offset"}
+
+  def encode_offset(value) when is_float(value), do: value
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Legend.offset"}
+
+  def decode_padding(value) when is_float(value), do: value
+  def decode_padding(value) when is_integer(value), do: value
+  def decode_padding(_), do: {:error, "Unexpected type when decoding Legend.padding"}
+
+  def encode_padding(value) when is_float(value), do: value
+  def encode_padding(value) when is_integer(value), do: value
+  def encode_padding(_), do: {:error, "Unexpected type when encoding Legend.padding"}
+
+  def decode_tick_count(value) when is_float(value), do: value
+  def decode_tick_count(value) when is_integer(value), do: value
+  def decode_tick_count(_), do: {:error, "Unexpected type when decoding Legend.tick_count"}
+
+  def encode_tick_count(value) when is_float(value), do: value
+  def encode_tick_count(value) when is_integer(value), do: value
+  def encode_tick_count(_), do: {:error, "Unexpected type when encoding Legend.tick_count"}
+
   def decode_values_element(%{} = value), do: DateTimeClass.from_map(value)
   def decode_values_element(value) when is_float(value), do: value
   def decode_values_element(value) when is_integer(value), do: value
@@ -5226,18 +6778,26 @@ defmodule Legend do
   def encode_values_element(value) when is_binary(value), do: value
   def encode_values_element(_), do: {:error, "Unexpected type when encoding Legend.values"}
 
+  def decode_zindex(value) when is_float(value) and value >= 0, do: value
+  def decode_zindex(value) when is_integer(value) and value >= 0, do: value
+  def decode_zindex(_), do: {:error, "Unexpected type when decoding Legend.zindex"}
+
+  def encode_zindex(value) when is_float(value), do: value
+  def encode_zindex(value) when is_integer(value), do: value
+  def encode_zindex(_), do: {:error, "Unexpected type when encoding Legend.zindex"}
+
   def from_map(m) do
     %Legend{
-      entry_padding: m["entryPadding"],
+      entry_padding: m["entryPadding"] && decode_entry_padding(m["entryPadding"]),
       format: m["format"] && decode_format(m["format"]),
-      offset: m["offset"],
+      offset: m["offset"] && decode_offset(m["offset"]),
       orient: m["orient"] && LegendOrient.decode(m["orient"]),
-      padding: m["padding"],
-      tick_count: m["tickCount"],
+      padding: m["padding"] && decode_padding(m["padding"]),
+      tick_count: m["tickCount"] && decode_tick_count(m["tickCount"]),
       title: m["title"],
       type: m["type"] && LegendType.decode(m["type"]),
       values: m["values"] && Enum.map(m["values"], &decode_values_element/1),
-      zindex: m["zindex"],
+      zindex: m["zindex"] && decode_zindex(m["zindex"]),
     }
   end
 
@@ -5433,9 +6993,17 @@ defmodule InterpolateParams do
           type: InterpolateParamsType.t()
         }
 
+  def decode_gamma(value) when is_float(value), do: value
+  def decode_gamma(value) when is_integer(value), do: value
+  def decode_gamma(_), do: {:error, "Unexpected type when decoding InterpolateParams.gamma"}
+
+  def encode_gamma(value) when is_float(value), do: value
+  def encode_gamma(value) when is_integer(value), do: value
+  def encode_gamma(_), do: {:error, "Unexpected type when encoding InterpolateParams.gamma"}
+
   def from_map(m) do
     %InterpolateParams{
-      gamma: m["gamma"],
+      gamma: m["gamma"] && decode_gamma(m["gamma"]),
       type: InterpolateParamsType.decode(m["type"]),
     }
   end
@@ -5726,6 +7294,14 @@ defmodule Scale do
           zero: boolean() | nil
         }
 
+  def decode_base(value) when is_float(value), do: value
+  def decode_base(value) when is_integer(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding Scale.base"}
+
+  def encode_base(value) when is_float(value), do: value
+  def encode_base(value) when is_integer(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding Scale.base"}
+
   def decode_domain(%{"selection" => _,} = value), do: DomainClass.from_map(value)
   def decode_domain(value) when is_binary(value), do: Domain.decode(value)
   def decode_domain(value) when is_list(value), do: value
@@ -5738,6 +7314,14 @@ defmodule Scale do
   def encode_domain(value) when is_nil(value), do: value
   def encode_domain(_), do: {:error, "Unexpected type when encoding Scale.domain"}
 
+  def decode_exponent(value) when is_float(value), do: value
+  def decode_exponent(value) when is_integer(value), do: value
+  def decode_exponent(_), do: {:error, "Unexpected type when decoding Scale.exponent"}
+
+  def encode_exponent(value) when is_float(value), do: value
+  def encode_exponent(value) when is_integer(value), do: value
+  def encode_exponent(_), do: {:error, "Unexpected type when encoding Scale.exponent"}
+
   def decode_interpolate(%{"type" => _,} = value), do: InterpolateParams.from_map(value)
   def decode_interpolate(value) when is_binary(value), do: Interpolate.decode(value)
   def decode_interpolate(value) when is_nil(value), do: value
@@ -5764,6 +7348,30 @@ defmodule Scale do
   def encode_nice(value) when is_nil(value), do: value
   def encode_nice(_), do: {:error, "Unexpected type when encoding Scale.nice"}
 
+  def decode_padding(value) when is_float(value) and value >= 0, do: value
+  def decode_padding(value) when is_integer(value) and value >= 0, do: value
+  def decode_padding(_), do: {:error, "Unexpected type when decoding Scale.padding"}
+
+  def encode_padding(value) when is_float(value), do: value
+  def encode_padding(value) when is_integer(value), do: value
+  def encode_padding(_), do: {:error, "Unexpected type when encoding Scale.padding"}
+
+  def decode_padding_inner(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_padding_inner(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_padding_inner(_), do: {:error, "Unexpected type when decoding Scale.padding_inner"}
+
+  def encode_padding_inner(value) when is_float(value), do: value
+  def encode_padding_inner(value) when is_integer(value), do: value
+  def encode_padding_inner(_), do: {:error, "Unexpected type when encoding Scale.padding_inner"}
+
+  def decode_padding_outer(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_padding_outer(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_padding_outer(_), do: {:error, "Unexpected type when decoding Scale.padding_outer"}
+
+  def encode_padding_outer(value) when is_float(value), do: value
+  def encode_padding_outer(value) when is_integer(value), do: value
+  def encode_padding_outer(_), do: {:error, "Unexpected type when encoding Scale.padding_outer"}
+
   def decode_range(value) when is_binary(value), do: value
   def decode_range(value) when is_list(value), do: value
   def decode_range(value) when is_nil(value), do: value
@@ -5786,15 +7394,15 @@ defmodule Scale do
 
   def from_map(m) do
     %Scale{
-      base: m["base"],
+      base: m["base"] && decode_base(m["base"]),
       clamp: m["clamp"],
       domain: decode_domain(m["domain"]),
-      exponent: m["exponent"],
+      exponent: m["exponent"] && decode_exponent(m["exponent"]),
       interpolate: decode_interpolate(m["interpolate"]),
       nice: decode_nice(m["nice"]),
-      padding: m["padding"],
-      padding_inner: m["paddingInner"],
-      padding_outer: m["paddingOuter"],
+      padding: m["padding"] && decode_padding(m["padding"]),
+      padding_inner: m["paddingInner"] && decode_padding_inner(m["paddingInner"]),
+      padding_outer: m["paddingOuter"] && decode_padding_outer(m["paddingOuter"]),
       range: decode_range(m["range"]),
       range_step: m["rangeStep"],
       round: m["round"],
@@ -6300,10 +7908,18 @@ defmodule Header do
   def encode_format(value) when is_binary(value), do: value
   def encode_format(_), do: {:error, "Unexpected type when encoding Header.format"}
 
+  def decode_label_angle(value) when is_float(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(value) when is_integer(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(_), do: {:error, "Unexpected type when decoding Header.label_angle"}
+
+  def encode_label_angle(value) when is_float(value), do: value
+  def encode_label_angle(value) when is_integer(value), do: value
+  def encode_label_angle(_), do: {:error, "Unexpected type when encoding Header.label_angle"}
+
   def from_map(m) do
     %Header{
       format: m["format"] && decode_format(m["format"]),
-      label_angle: m["labelAngle"],
+      label_angle: m["labelAngle"] && decode_label_angle(m["labelAngle"]),
       title: m["title"],
     }
   end
@@ -7059,6 +8675,14 @@ defmodule Axis do
   def encode_format(value) when is_binary(value), do: value
   def encode_format(_), do: {:error, "Unexpected type when encoding Axis.format"}
 
+  def decode_label_angle(value) when is_float(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(value) when is_integer(value) and value >= -360 and value <= 360, do: value
+  def decode_label_angle(_), do: {:error, "Unexpected type when decoding Axis.label_angle"}
+
+  def encode_label_angle(value) when is_float(value), do: value
+  def encode_label_angle(value) when is_integer(value), do: value
+  def encode_label_angle(_), do: {:error, "Unexpected type when encoding Axis.label_angle"}
+
   def decode_label_overlap(value) when is_boolean(value), do: value
   def decode_label_overlap(value) when is_binary(value), do: LabelOverlapEnum.decode(value)
   def decode_label_overlap(value) when is_nil(value), do: value
@@ -7069,6 +8693,78 @@ defmodule Axis do
   def encode_label_overlap(value) when is_nil(value), do: value
   def encode_label_overlap(_), do: {:error, "Unexpected type when encoding Axis.label_overlap"}
 
+  def decode_label_padding(value) when is_float(value), do: value
+  def decode_label_padding(value) when is_integer(value), do: value
+  def decode_label_padding(_), do: {:error, "Unexpected type when decoding Axis.label_padding"}
+
+  def encode_label_padding(value) when is_float(value), do: value
+  def encode_label_padding(value) when is_integer(value), do: value
+  def encode_label_padding(_), do: {:error, "Unexpected type when encoding Axis.label_padding"}
+
+  def decode_max_extent(value) when is_float(value), do: value
+  def decode_max_extent(value) when is_integer(value), do: value
+  def decode_max_extent(_), do: {:error, "Unexpected type when decoding Axis.max_extent"}
+
+  def encode_max_extent(value) when is_float(value), do: value
+  def encode_max_extent(value) when is_integer(value), do: value
+  def encode_max_extent(_), do: {:error, "Unexpected type when encoding Axis.max_extent"}
+
+  def decode_min_extent(value) when is_float(value), do: value
+  def decode_min_extent(value) when is_integer(value), do: value
+  def decode_min_extent(_), do: {:error, "Unexpected type when decoding Axis.min_extent"}
+
+  def encode_min_extent(value) when is_float(value), do: value
+  def encode_min_extent(value) when is_integer(value), do: value
+  def encode_min_extent(_), do: {:error, "Unexpected type when encoding Axis.min_extent"}
+
+  def decode_offset(value) when is_float(value), do: value
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Axis.offset"}
+
+  def encode_offset(value) when is_float(value), do: value
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Axis.offset"}
+
+  def decode_position(value) when is_float(value), do: value
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Axis.position"}
+
+  def encode_position(value) when is_float(value), do: value
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Axis.position"}
+
+  def decode_tick_count(value) when is_float(value), do: value
+  def decode_tick_count(value) when is_integer(value), do: value
+  def decode_tick_count(_), do: {:error, "Unexpected type when decoding Axis.tick_count"}
+
+  def encode_tick_count(value) when is_float(value), do: value
+  def encode_tick_count(value) when is_integer(value), do: value
+  def encode_tick_count(_), do: {:error, "Unexpected type when encoding Axis.tick_count"}
+
+  def decode_tick_size(value) when is_float(value) and value >= 0, do: value
+  def decode_tick_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_tick_size(_), do: {:error, "Unexpected type when decoding Axis.tick_size"}
+
+  def encode_tick_size(value) when is_float(value), do: value
+  def encode_tick_size(value) when is_integer(value), do: value
+  def encode_tick_size(_), do: {:error, "Unexpected type when encoding Axis.tick_size"}
+
+  def decode_title_max_length(value) when is_float(value), do: value
+  def decode_title_max_length(value) when is_integer(value), do: value
+  def decode_title_max_length(_), do: {:error, "Unexpected type when decoding Axis.title_max_length"}
+
+  def encode_title_max_length(value) when is_float(value), do: value
+  def encode_title_max_length(value) when is_integer(value), do: value
+  def encode_title_max_length(_), do: {:error, "Unexpected type when encoding Axis.title_max_length"}
+
+  def decode_title_padding(value) when is_float(value), do: value
+  def decode_title_padding(value) when is_integer(value), do: value
+  def decode_title_padding(_), do: {:error, "Unexpected type when decoding Axis.title_padding"}
+
+  def encode_title_padding(value) when is_float(value), do: value
+  def encode_title_padding(value) when is_integer(value), do: value
+  def encode_title_padding(_), do: {:error, "Unexpected type when encoding Axis.title_padding"}
+
   def decode_values_element(%{} = value), do: DateTimeClass.from_map(value)
   def decode_values_element(value) when is_float(value), do: value
   def decode_values_element(value) when is_integer(value), do: value
@@ -7079,30 +8775,38 @@ defmodule Axis do
   def encode_values_element(value) when is_integer(value), do: value
   def encode_values_element(_), do: {:error, "Unexpected type when encoding Axis.values"}
 
+  def decode_zindex(value) when is_float(value) and value >= 0, do: value
+  def decode_zindex(value) when is_integer(value) and value >= 0, do: value
+  def decode_zindex(_), do: {:error, "Unexpected type when decoding Axis.zindex"}
+
+  def encode_zindex(value) when is_float(value), do: value
+  def encode_zindex(value) when is_integer(value), do: value
+  def encode_zindex(_), do: {:error, "Unexpected type when encoding Axis.zindex"}
+
   def from_map(m) do
     %Axis{
       domain: m["domain"],
       format: m["format"] && decode_format(m["format"]),
       grid: m["grid"],
-      label_angle: m["labelAngle"],
+      label_angle: m["labelAngle"] && decode_label_angle(m["labelAngle"]),
       label_bound: m["labelBound"],
       label_flush: m["labelFlush"],
       label_overlap: decode_label_overlap(m["labelOverlap"]),
-      label_padding: m["labelPadding"],
+      label_padding: m["labelPadding"] && decode_label_padding(m["labelPadding"]),
       labels: m["labels"],
-      max_extent: m["maxExtent"],
-      min_extent: m["minExtent"],
-      offset: m["offset"],
+      max_extent: m["maxExtent"] && decode_max_extent(m["maxExtent"]),
+      min_extent: m["minExtent"] && decode_min_extent(m["minExtent"]),
+      offset: m["offset"] && decode_offset(m["offset"]),
       orient: m["orient"] && TitleOrient.decode(m["orient"]),
-      position: m["position"],
-      tick_count: m["tickCount"],
+      position: m["position"] && decode_position(m["position"]),
+      tick_count: m["tickCount"] && decode_tick_count(m["tickCount"]),
       ticks: m["ticks"],
-      tick_size: m["tickSize"],
+      tick_size: m["tickSize"] && decode_tick_size(m["tickSize"]),
       title: m["title"],
-      title_max_length: m["titleMaxLength"],
-      title_padding: m["titlePadding"],
+      title_max_length: m["titleMaxLength"] && decode_title_max_length(m["titleMaxLength"]),
+      title_padding: m["titlePadding"] && decode_title_padding(m["titlePadding"]),
       values: m["values"] && Enum.map(m["values"], &decode_values_element/1),
-      zindex: m["zindex"],
+      zindex: m["zindex"] && decode_zindex(m["zindex"]),
     }
   end
 
@@ -7734,27 +9438,67 @@ defmodule MarkDef do
           type: Mark.t()
         }
 
+  def decode_angle(value) when is_float(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(value) when is_integer(value) and value >= 0 and value <= 360, do: value
+  def decode_angle(_), do: {:error, "Unexpected type when decoding MarkDef.angle"}
+
+  def encode_angle(value) when is_float(value), do: value
+  def encode_angle(value) when is_integer(value), do: value
+  def encode_angle(_), do: {:error, "Unexpected type when encoding MarkDef.angle"}
+
   def decode_color(value) when is_binary(value), do: value
   def decode_color(_), do: {:error, "Unexpected type when decoding MarkDef.color"}
 
   def encode_color(value) when is_binary(value), do: value
   def encode_color(_), do: {:error, "Unexpected type when encoding MarkDef.color"}
 
+  def decode_dx(value) when is_float(value), do: value
+  def decode_dx(value) when is_integer(value), do: value
+  def decode_dx(_), do: {:error, "Unexpected type when decoding MarkDef.dx"}
+
+  def encode_dx(value) when is_float(value), do: value
+  def encode_dx(value) when is_integer(value), do: value
+  def encode_dx(_), do: {:error, "Unexpected type when encoding MarkDef.dx"}
+
+  def decode_dy(value) when is_float(value), do: value
+  def decode_dy(value) when is_integer(value), do: value
+  def decode_dy(_), do: {:error, "Unexpected type when decoding MarkDef.dy"}
+
+  def encode_dy(value) when is_float(value), do: value
+  def encode_dy(value) when is_integer(value), do: value
+  def encode_dy(_), do: {:error, "Unexpected type when encoding MarkDef.dy"}
+
   def decode_fill(value) when is_binary(value), do: value
   def decode_fill(_), do: {:error, "Unexpected type when decoding MarkDef.fill"}
 
   def encode_fill(value) when is_binary(value), do: value
   def encode_fill(_), do: {:error, "Unexpected type when encoding MarkDef.fill"}
 
+  def decode_fill_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_fill_opacity(_), do: {:error, "Unexpected type when decoding MarkDef.fill_opacity"}
+
+  def encode_fill_opacity(value) when is_float(value), do: value
+  def encode_fill_opacity(value) when is_integer(value), do: value
+  def encode_fill_opacity(_), do: {:error, "Unexpected type when encoding MarkDef.fill_opacity"}
+
   def decode_font(value) when is_binary(value), do: value
   def decode_font(_), do: {:error, "Unexpected type when decoding MarkDef.font"}
 
   def encode_font(value) when is_binary(value), do: value
   def encode_font(_), do: {:error, "Unexpected type when encoding MarkDef.font"}
 
+  def decode_font_size(value) when is_float(value) and value >= 0, do: value
+  def decode_font_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_font_size(_), do: {:error, "Unexpected type when decoding MarkDef.font_size"}
+
+  def encode_font_size(value) when is_float(value), do: value
+  def encode_font_size(value) when is_integer(value), do: value
+  def encode_font_size(_), do: {:error, "Unexpected type when encoding MarkDef.font_size"}
+
   def decode_font_weight(value) when is_binary(value), do: FontWeight.decode(value)
-  def decode_font_weight(value) when is_float(value), do: value
-  def decode_font_weight(value) when is_integer(value), do: value
+  def decode_font_weight(value) when is_float(value) and value >= 100 and value <= 900, do: value
+  def decode_font_weight(value) when is_integer(value) and value >= 100 and value <= 900, do: value
   def decode_font_weight(value) when is_nil(value), do: value
   def decode_font_weight(_), do: {:error, "Unexpected type when decoding MarkDef.font_weight"}
 
@@ -7770,18 +9514,74 @@ defmodule MarkDef do
   def encode_href(value) when is_binary(value), do: value
   def encode_href(_), do: {:error, "Unexpected type when encoding MarkDef.href"}
 
+  def decode_limit(value) when is_float(value), do: value
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding MarkDef.limit"}
+
+  def encode_limit(value) when is_float(value), do: value
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding MarkDef.limit"}
+
+  def decode_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_opacity(_), do: {:error, "Unexpected type when decoding MarkDef.opacity"}
+
+  def encode_opacity(value) when is_float(value), do: value
+  def encode_opacity(value) when is_integer(value), do: value
+  def encode_opacity(_), do: {:error, "Unexpected type when encoding MarkDef.opacity"}
+
+  def decode_radius(value) when is_float(value) and value >= 0, do: value
+  def decode_radius(value) when is_integer(value) and value >= 0, do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding MarkDef.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding MarkDef.radius"}
+
   def decode_shape(value) when is_binary(value), do: value
   def decode_shape(_), do: {:error, "Unexpected type when decoding MarkDef.shape"}
 
   def encode_shape(value) when is_binary(value), do: value
   def encode_shape(_), do: {:error, "Unexpected type when encoding MarkDef.shape"}
 
+  def decode_size(value) when is_float(value) and value >= 0, do: value
+  def decode_size(value) when is_integer(value) and value >= 0, do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding MarkDef.size"}
+
+  def encode_size(value) when is_float(value), do: value
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding MarkDef.size"}
+
   def decode_stroke(value) when is_binary(value), do: value
   def decode_stroke(_), do: {:error, "Unexpected type when decoding MarkDef.stroke"}
 
   def encode_stroke(value) when is_binary(value), do: value
   def encode_stroke(_), do: {:error, "Unexpected type when encoding MarkDef.stroke"}
 
+  def decode_stroke_dash_offset(value) when is_float(value), do: value
+  def decode_stroke_dash_offset(value) when is_integer(value), do: value
+  def decode_stroke_dash_offset(_), do: {:error, "Unexpected type when decoding MarkDef.stroke_dash_offset"}
+
+  def encode_stroke_dash_offset(value) when is_float(value), do: value
+  def encode_stroke_dash_offset(value) when is_integer(value), do: value
+  def encode_stroke_dash_offset(_), do: {:error, "Unexpected type when encoding MarkDef.stroke_dash_offset"}
+
+  def decode_stroke_opacity(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_stroke_opacity(_), do: {:error, "Unexpected type when decoding MarkDef.stroke_opacity"}
+
+  def encode_stroke_opacity(value) when is_float(value), do: value
+  def encode_stroke_opacity(value) when is_integer(value), do: value
+  def encode_stroke_opacity(_), do: {:error, "Unexpected type when encoding MarkDef.stroke_opacity"}
+
+  def decode_stroke_width(value) when is_float(value) and value >= 0, do: value
+  def decode_stroke_width(value) when is_integer(value) and value >= 0, do: value
+  def decode_stroke_width(_), do: {:error, "Unexpected type when decoding MarkDef.stroke_width"}
+
+  def encode_stroke_width(value) when is_float(value), do: value
+  def encode_stroke_width(value) when is_integer(value), do: value
+  def encode_stroke_width(_), do: {:error, "Unexpected type when encoding MarkDef.stroke_width"}
+
   def decode_style(value) when is_binary(value), do: value
   def decode_style(value) when is_list(value), do: value
   def decode_style(value) when is_nil(value), do: value
@@ -7792,46 +9592,62 @@ defmodule MarkDef do
   def encode_style(value) when is_nil(value), do: value
   def encode_style(_), do: {:error, "Unexpected type when encoding MarkDef.style"}
 
+  def decode_tension(value) when is_float(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(value) when is_integer(value) and value >= 0 and value <= 1, do: value
+  def decode_tension(_), do: {:error, "Unexpected type when decoding MarkDef.tension"}
+
+  def encode_tension(value) when is_float(value), do: value
+  def encode_tension(value) when is_integer(value), do: value
+  def encode_tension(_), do: {:error, "Unexpected type when encoding MarkDef.tension"}
+
   def decode_text(value) when is_binary(value), do: value
   def decode_text(_), do: {:error, "Unexpected type when decoding MarkDef.text"}
 
   def encode_text(value) when is_binary(value), do: value
   def encode_text(_), do: {:error, "Unexpected type when encoding MarkDef.text"}
 
+  def decode_theta(value) when is_float(value), do: value
+  def decode_theta(value) when is_integer(value), do: value
+  def decode_theta(_), do: {:error, "Unexpected type when decoding MarkDef.theta"}
+
+  def encode_theta(value) when is_float(value), do: value
+  def encode_theta(value) when is_integer(value), do: value
+  def encode_theta(_), do: {:error, "Unexpected type when encoding MarkDef.theta"}
+
   def from_map(m) do
     %MarkDef{
       align: m["align"] && HorizontalAlign.decode(m["align"]),
-      angle: m["angle"],
+      angle: m["angle"] && decode_angle(m["angle"]),
       baseline: m["baseline"] && VerticalAlign.decode(m["baseline"]),
       clip: m["clip"],
       color: m["color"] && decode_color(m["color"]),
       cursor: m["cursor"] && Cursor.decode(m["cursor"]),
-      dx: m["dx"],
-      dy: m["dy"],
+      dx: m["dx"] && decode_dx(m["dx"]),
+      dy: m["dy"] && decode_dy(m["dy"]),
       fill: m["fill"] && decode_fill(m["fill"]),
       filled: m["filled"],
-      fill_opacity: m["fillOpacity"],
+      fill_opacity: m["fillOpacity"] && decode_fill_opacity(m["fillOpacity"]),
       font: m["font"] && decode_font(m["font"]),
-      font_size: m["fontSize"],
+      font_size: m["fontSize"] && decode_font_size(m["fontSize"]),
       font_style: m["fontStyle"] && FontStyle.decode(m["fontStyle"]),
       font_weight: decode_font_weight(m["fontWeight"]),
       href: m["href"] && decode_href(m["href"]),
       interpolate: m["interpolate"] && Interpolate.decode(m["interpolate"]),
-      limit: m["limit"],
-      opacity: m["opacity"],
+      limit: m["limit"] && decode_limit(m["limit"]),
+      opacity: m["opacity"] && decode_opacity(m["opacity"]),
       orient: m["orient"] && Orient.decode(m["orient"]),
-      radius: m["radius"],
+      radius: m["radius"] && decode_radius(m["radius"]),
       shape: m["shape"] && decode_shape(m["shape"]),
-      size: m["size"],
+      size: m["size"] && decode_size(m["size"]),
       stroke: m["stroke"] && decode_stroke(m["stroke"]),
       stroke_dash: m["strokeDash"],
-      stroke_dash_offset: m["strokeDashOffset"],
-      stroke_opacity: m["strokeOpacity"],
-      stroke_width: m["strokeWidth"],
+      stroke_dash_offset: m["strokeDashOffset"] && decode_stroke_dash_offset(m["strokeDashOffset"]),
+      stroke_opacity: m["strokeOpacity"] && decode_stroke_opacity(m["strokeOpacity"]),
+      stroke_width: m["strokeWidth"] && decode_stroke_width(m["strokeWidth"]),
       style: decode_style(m["style"]),
-      tension: m["tension"],
+      tension: m["tension"] && decode_tension(m["tension"]),
       text: m["text"] && decode_text(m["text"]),
-      theta: m["theta"],
+      theta: m["theta"] && decode_theta(m["theta"]),
       type: Mark.decode(m["type"]),
     }
   end
@@ -7921,6 +9737,54 @@ defmodule Projection do
           type: VGProjectionType.t() | nil
         }
 
+  def decode_clip_angle(value) when is_float(value), do: value
+  def decode_clip_angle(value) when is_integer(value), do: value
+  def decode_clip_angle(_), do: {:error, "Unexpected type when decoding Projection.clip_angle"}
+
+  def encode_clip_angle(value) when is_float(value), do: value
+  def encode_clip_angle(value) when is_integer(value), do: value
+  def encode_clip_angle(_), do: {:error, "Unexpected type when encoding Projection.clip_angle"}
+
+  def decode_coefficient(value) when is_float(value), do: value
+  def decode_coefficient(value) when is_integer(value), do: value
+  def decode_coefficient(_), do: {:error, "Unexpected type when decoding Projection.coefficient"}
+
+  def encode_coefficient(value) when is_float(value), do: value
+  def encode_coefficient(value) when is_integer(value), do: value
+  def encode_coefficient(_), do: {:error, "Unexpected type when encoding Projection.coefficient"}
+
+  def decode_distance(value) when is_float(value), do: value
+  def decode_distance(value) when is_integer(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Projection.distance"}
+
+  def encode_distance(value) when is_float(value), do: value
+  def encode_distance(value) when is_integer(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Projection.distance"}
+
+  def decode_fraction(value) when is_float(value), do: value
+  def decode_fraction(value) when is_integer(value), do: value
+  def decode_fraction(_), do: {:error, "Unexpected type when decoding Projection.fraction"}
+
+  def encode_fraction(value) when is_float(value), do: value
+  def encode_fraction(value) when is_integer(value), do: value
+  def encode_fraction(_), do: {:error, "Unexpected type when encoding Projection.fraction"}
+
+  def decode_lobes(value) when is_float(value), do: value
+  def decode_lobes(value) when is_integer(value), do: value
+  def decode_lobes(_), do: {:error, "Unexpected type when decoding Projection.lobes"}
+
+  def encode_lobes(value) when is_float(value), do: value
+  def encode_lobes(value) when is_integer(value), do: value
+  def encode_lobes(_), do: {:error, "Unexpected type when encoding Projection.lobes"}
+
+  def decode_parallel(value) when is_float(value), do: value
+  def decode_parallel(value) when is_integer(value), do: value
+  def decode_parallel(_), do: {:error, "Unexpected type when decoding Projection.parallel"}
+
+  def encode_parallel(value) when is_float(value), do: value
+  def encode_parallel(value) when is_integer(value), do: value
+  def encode_parallel(_), do: {:error, "Unexpected type when encoding Projection.parallel"}
+
   def decode_precision_value(value) when is_float(value), do: value
   def decode_precision_value(value) when is_integer(value), do: value
   def decode_precision_value(value) when is_binary(value), do: value
@@ -7931,23 +9795,55 @@ defmodule Projection do
   def encode_precision_value(value) when is_binary(value), do: value
   def encode_precision_value(_), do: {:error, "Unexpected type when encoding Projection.precision"}
 
+  def decode_radius(value) when is_float(value), do: value
+  def decode_radius(value) when is_integer(value), do: value
+  def decode_radius(_), do: {:error, "Unexpected type when decoding Projection.radius"}
+
+  def encode_radius(value) when is_float(value), do: value
+  def encode_radius(value) when is_integer(value), do: value
+  def encode_radius(_), do: {:error, "Unexpected type when encoding Projection.radius"}
+
+  def decode_ratio(value) when is_float(value), do: value
+  def decode_ratio(value) when is_integer(value), do: value
+  def decode_ratio(_), do: {:error, "Unexpected type when decoding Projection.ratio"}
+
+  def encode_ratio(value) when is_float(value), do: value
+  def encode_ratio(value) when is_integer(value), do: value
+  def encode_ratio(_), do: {:error, "Unexpected type when encoding Projection.ratio"}
+
+  def decode_spacing(value) when is_float(value), do: value
+  def decode_spacing(value) when is_integer(value), do: value
+  def decode_spacing(_), do: {:error, "Unexpected type when decoding Projection.spacing"}
+
+  def encode_spacing(value) when is_float(value), do: value
+  def encode_spacing(value) when is_integer(value), do: value
+  def encode_spacing(_), do: {:error, "Unexpected type when encoding Projection.spacing"}
+
+  def decode_tilt(value) when is_float(value), do: value
+  def decode_tilt(value) when is_integer(value), do: value
+  def decode_tilt(_), do: {:error, "Unexpected type when decoding Projection.tilt"}
+
+  def encode_tilt(value) when is_float(value), do: value
+  def encode_tilt(value) when is_integer(value), do: value
+  def encode_tilt(_), do: {:error, "Unexpected type when encoding Projection.tilt"}
+
   def from_map(m) do
     %Projection{
       center: m["center"],
-      clip_angle: m["clipAngle"],
+      clip_angle: m["clipAngle"] && decode_clip_angle(m["clipAngle"]),
       clip_extent: m["clipExtent"],
-      coefficient: m["coefficient"],
-      distance: m["distance"],
-      fraction: m["fraction"],
-      lobes: m["lobes"],
-      parallel: m["parallel"],
+      coefficient: m["coefficient"] && decode_coefficient(m["coefficient"]),
+      distance: m["distance"] && decode_distance(m["distance"]),
+      fraction: m["fraction"] && decode_fraction(m["fraction"]),
+      lobes: m["lobes"] && decode_lobes(m["lobes"]),
+      parallel: m["parallel"] && decode_parallel(m["parallel"]),
       precision: m["precision"]
       |> Map.new(fn {key, value} -> {key, decode_precision_value(value)} end),
-      radius: m["radius"],
-      ratio: m["ratio"],
+      radius: m["radius"] && decode_radius(m["radius"]),
+      ratio: m["ratio"] && decode_ratio(m["ratio"]),
       rotate: m["rotate"],
-      spacing: m["spacing"],
-      tilt: m["tilt"],
+      spacing: m["spacing"] && decode_spacing(m["spacing"]),
+      tilt: m["tilt"] && decode_tilt(m["tilt"]),
       type: m["type"] && VGProjectionType.decode(m["type"]),
     }
   end
@@ -8365,6 +10261,14 @@ defmodule TitleParams do
           text: String.t()
         }
 
+  def decode_offset(value) when is_float(value), do: value
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TitleParams.offset"}
+
+  def encode_offset(value) when is_float(value), do: value
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TitleParams.offset"}
+
   def decode_style(value) when is_binary(value), do: value
   def decode_style(value) when is_list(value), do: value
   def decode_style(value) when is_nil(value), do: value
@@ -8384,7 +10288,7 @@ defmodule TitleParams do
   def from_map(m) do
     %TitleParams{
       anchor: m["anchor"] && Anchor.decode(m["anchor"]),
-      offset: m["offset"],
+      offset: m["offset"] && decode_offset(m["offset"]),
       orient: m["orient"] && TitleOrient.decode(m["orient"]),
       style: decode_style(m["style"]),
       text: decode_text(m["text"]),
@@ -8695,6 +10599,14 @@ defmodule LayerSpec do
   def encode_description(value) when is_binary(value), do: value
   def encode_description(_), do: {:error, "Unexpected type when encoding LayerSpec.description"}
 
+  def decode_height(value) when is_float(value), do: value
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding LayerSpec.height"}
+
+  def encode_height(value) when is_float(value), do: value
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding LayerSpec.height"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding LayerSpec.name"}
 
@@ -8711,6 +10623,14 @@ defmodule LayerSpec do
   def encode_title(value) when is_nil(value), do: value
   def encode_title(_), do: {:error, "Unexpected type when encoding LayerSpec.title"}
 
+  def decode_width(value) when is_float(value), do: value
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding LayerSpec.width"}
+
+  def encode_width(value) when is_float(value), do: value
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding LayerSpec.width"}
+
   def decode_mark(%{"type" => _,} = value), do: MarkDef.from_map(value)
   def decode_mark(value) when is_binary(value), do: Mark.decode(value)
   def decode_mark(value) when is_nil(value), do: value
@@ -8725,13 +10645,13 @@ defmodule LayerSpec do
     %LayerSpec{
       data: m["data"] && Data.from_map(m["data"]),
       description: m["description"] && decode_description(m["description"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       layer: m["layer"] && Enum.map(m["layer"], &LayerSpec.from_map/1),
       name: m["name"] && decode_name(m["name"]),
       resolve: m["resolve"] && Resolve.from_map(m["resolve"]),
       title: decode_title(m["title"]),
       transform: m["transform"] && Enum.map(m["transform"], &Transform.from_map/1),
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
       encoding: m["encoding"] && Encoding.from_map(m["encoding"]),
       mark: decode_mark(m["mark"]),
       projection: m["projection"] && Projection.from_map(m["projection"]),
@@ -8866,6 +10786,14 @@ defmodule Spec do
   def encode_description(value) when is_binary(value), do: value
   def encode_description(_), do: {:error, "Unexpected type when encoding Spec.description"}
 
+  def decode_height(value) when is_float(value), do: value
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Spec.height"}
+
+  def encode_height(value) when is_float(value), do: value
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Spec.height"}
+
   def decode_name(value) when is_binary(value), do: value
   def decode_name(_), do: {:error, "Unexpected type when decoding Spec.name"}
 
@@ -8882,6 +10810,14 @@ defmodule Spec do
   def encode_title(value) when is_nil(value), do: value
   def encode_title(_), do: {:error, "Unexpected type when encoding Spec.title"}
 
+  def decode_width(value) when is_float(value), do: value
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Spec.width"}
+
+  def encode_width(value) when is_float(value), do: value
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Spec.width"}
+
   def decode_mark(%{"type" => _,} = value), do: MarkDef.from_map(value)
   def decode_mark(value) when is_binary(value), do: Mark.decode(value)
   def decode_mark(value) when is_nil(value), do: value
@@ -8896,13 +10832,13 @@ defmodule Spec do
     %Spec{
       data: m["data"] && Data.from_map(m["data"]),
       description: m["description"] && decode_description(m["description"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       layer: m["layer"] && Enum.map(m["layer"], &LayerSpec.from_map/1),
       name: m["name"] && decode_name(m["name"]),
       resolve: m["resolve"] && Resolve.from_map(m["resolve"]),
       title: decode_title(m["title"]),
       transform: m["transform"] && Enum.map(m["transform"], &Transform.from_map/1),
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
       encoding: m["encoding"] && Encoding.from_map(m["encoding"]),
       mark: decode_mark(m["mark"]),
       projection: m["projection"] && Projection.from_map(m["projection"]),
@@ -9036,6 +10972,14 @@ defmodule TopLevel do
   def encode_description(value) when is_binary(value), do: value
   def encode_description(_), do: {:error, "Unexpected type when encoding TopLevel.description"}
 
+  def decode_height(value) when is_float(value), do: value
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding TopLevel.height"}
+
+  def encode_height(value) when is_float(value), do: value
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding TopLevel.height"}
+
   def decode_mark(%{"type" => _,} = value), do: MarkDef.from_map(value)
   def decode_mark(value) when is_binary(value), do: Mark.decode(value)
   def decode_mark(value) when is_nil(value), do: value
@@ -9074,6 +11018,14 @@ defmodule TopLevel do
   def encode_title(value) when is_nil(value), do: value
   def encode_title(_), do: {:error, "Unexpected type when encoding TopLevel.title"}
 
+  def decode_width(value) when is_float(value), do: value
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding TopLevel.width"}
+
+  def encode_width(value) when is_float(value), do: value
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding TopLevel.width"}
+
   def from_map(m) do
     %TopLevel{
       schema: m["$schema"] && decode_schema(m["$schema"]),
@@ -9083,7 +11035,7 @@ defmodule TopLevel do
       data: m["data"] && Data.from_map(m["data"]),
       description: m["description"] && decode_description(m["description"]),
       encoding: m["encoding"] && EncodingWithFacet.from_map(m["encoding"]),
-      height: m["height"],
+      height: m["height"] && decode_height(m["height"]),
       mark: decode_mark(m["mark"]),
       name: m["name"] && decode_name(m["name"]),
       padding: decode_padding(m["padding"]),
@@ -9092,7 +11044,7 @@ defmodule TopLevel do
       |> Map.new(fn {key, value} -> {key, SelectionDef.from_map(value)} end),
       title: decode_title(m["title"]),
       transform: m["transform"] && Enum.map(m["transform"], &Transform.from_map/1),
-      width: m["width"],
+      width: m["width"] && decode_width(m["width"]),
       layer: m["layer"] && Enum.map(m["layer"], &LayerSpec.from_map/1),
       resolve: m["resolve"] && Resolve.from_map(m["resolve"]),
       facet: m["facet"] && FacetMapping.from_map(m["facet"]),
diff --git a/base/swift/test/inputs/json/priority/keywords.json/default/quicktype.swift b/head/swift/test/inputs/json/priority/keywords.json/default/quicktype.swift
index 77836ce..542e12e 100644
--- a/base/swift/test/inputs/json/priority/keywords.json/default/quicktype.swift
+++ b/head/swift/test/inputs/json/priority/keywords.json/default/quicktype.swift
@@ -9596,6 +9596,7 @@ struct Obj4: Codable {
     let requires: Requires
     let restrict: Restrict
     let retain: Retain
+    let s: S
     let sbyte: Sbyte
     let sealed: Sealed
     let sel: Sel
@@ -9663,6 +9664,7 @@ struct Obj4: Codable {
         case requires = "requires"
         case restrict = "restrict"
         case retain = "retain"
+        case s = "s"
         case sbyte = "sbyte"
         case sealed = "sealed"
         case sel = "SEL"
@@ -9750,6 +9752,7 @@ extension Obj4 {
         requires: Requires? = nil,
         restrict: Restrict? = nil,
         retain: Retain? = nil,
+        s: S? = nil,
         sbyte: Sbyte? = nil,
         sealed: Sealed? = nil,
         sel: Sel? = nil,
@@ -9817,6 +9820,7 @@ extension Obj4 {
             requires: requires ?? self.requires,
             restrict: restrict ?? self.restrict,
             retain: retain ?? self.retain,
+            s: s ?? self.s,
             sbyte: sbyte ?? self.sbyte,
             sealed: sealed ?? self.sealed,
             sel: sel ?? self.sel,
@@ -11269,6 +11273,50 @@ extension Retain {
     }
 }
 
+// MARK: - S
+struct S: Codable {
+    let s: Int
+
+    enum CodingKeys: String, CodingKey {
+        case s = "s"
+    }
+}
+
+// MARK: S convenience initializers and mutators
+
+extension S {
+    init(data: Data) throws {
+        self = try newJSONDecoder().decode(S.self, from: data)
+    }
+
+    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
+        guard let data = json.data(using: encoding) else {
+            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
+        }
+        try self.init(data: data)
+    }
+
+    init(fromURL url: URL) throws {
+        try self.init(data: try Data(contentsOf: url))
+    }
+
+    func with(
+        s: Int? = nil
+    ) -> S {
+        return S(
+            s: s ?? self.s
+        )
+    }
+
+    func jsonData() throws -> Data {
+        return try newJSONEncoder().encode(self)
+    }
+
+    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
+        return String(data: try self.jsonData(), encoding: encoding)
+    }
+}
+
 // MARK: - Sbyte
 struct Sbyte: Codable {
     let sbyte: Int
diff --git a/head/swift/test/inputs/json/samples/objc-control-characters.json/default/quicktype.swift b/head/swift/test/inputs/json/samples/objc-control-characters.json/default/quicktype.swift
new file mode 100644
index 0000000..c66a4d7
--- /dev/null
+++ b/head/swift/test/inputs/json/samples/objc-control-characters.json/default/quicktype.swift
@@ -0,0 +1,98 @@
+// This file was generated from JSON Schema using quicktype, do not modify it directly.
+// To parse the JSON, add this file to your project and do:
+//
+//   let topLevel = try TopLevel(json)
+
+import Foundation
+
+// MARK: - TopLevel
+struct TopLevel: Codable {
+    let empty: String
+    let purple: String
+    let topLevel: String
+    let u001B: String
+
+    enum CodingKeys: String, CodingKey {
+        case empty = "\u{0}\u{1}\u{1b}\u{1f}"
+        case purple = "\u{1f600}"
+        case topLevel = "\u{7f}\u{80}\u{85}\u{9f}"
+        case u001B = "\\u001b"
+    }
+}
+
+// MARK: TopLevel convenience initializers and mutators
+
+extension TopLevel {
+    init(data: Data) throws {
+        self = try newJSONDecoder().decode(TopLevel.self, from: data)
+    }
+
+    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
+        guard let data = json.data(using: encoding) else {
+            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
+        }
+        try self.init(data: data)
+    }
+
+    init(fromURL url: URL) throws {
+        try self.init(data: try Data(contentsOf: url))
+    }
+
+    func with(
+        empty: String? = nil,
+        purple: String? = nil,
+        topLevel: String? = nil,
+        u001B: String? = nil
+    ) -> TopLevel {
+        return TopLevel(
+            empty: empty ?? self.empty,
+            purple: purple ?? self.purple,
+            topLevel: topLevel ?? self.topLevel,
+            u001B: u001B ?? self.u001B
+        )
+    }
+
+    func jsonData() throws -> Data {
+        return try newJSONEncoder().encode(self)
+    }
+
+    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
+        return String(data: try self.jsonData(), encoding: encoding)
+    }
+}
+
+// MARK: - Helper functions for creating encoders and decoders
+
+func newJSONDecoder() -> JSONDecoder {
+    let decoder = JSONDecoder()
+    decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
+        let container = try decoder.singleValueContainer()
+        let dateStr = try container.decode(String.self)
+
+        let formatter = DateFormatter()
+        formatter.calendar = Calendar(identifier: .iso8601)
+        formatter.locale = Locale(identifier: "en_US_POSIX")
+        formatter.timeZone = TimeZone(secondsFromGMT: 0)
+        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
+        if let date = formatter.date(from: dateStr) {
+            return date
+        }
+        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
+        if let date = formatter.date(from: dateStr) {
+            return date
+        }
+        throw DecodingError.typeMismatch(Date.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Could not decode date"))
+    })
+    return decoder
+}
+
+func newJSONEncoder() -> JSONEncoder {
+    let encoder = JSONEncoder()
+    let formatter = DateFormatter()
+    formatter.calendar = Calendar(identifier: .iso8601)
+    formatter.locale = Locale(identifier: "en_US_POSIX")
+    formatter.timeZone = TimeZone(secondsFromGMT: 0)
+    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXXXX"
+    encoder.dateEncodingStrategy = .formatted(formatter)
+    return encoder
+}
diff --git a/base/typescript/test/inputs/json/priority/keywords.json/default/TopLevel.ts b/head/typescript/test/inputs/json/priority/keywords.json/default/TopLevel.ts
index 1f4c69d..338246b 100644
--- a/base/typescript/test/inputs/json/priority/keywords.json/default/TopLevel.ts
+++ b/head/typescript/test/inputs/json/priority/keywords.json/default/TopLevel.ts
@@ -73,7 +73,7 @@ export interface Obj1 {
     constructor:         Constructor;
     continue:            Continue;
     convenience:         Convenience;
-    convert:             Convert;
+    convert:             ConvertClass;
     converter:           Converter;
     date:                DateClass;
     date_parse_handling: DateParseHandling;
@@ -309,7 +309,7 @@ export interface Convenience {
     convenience: number;
 }
 
-export interface Convert {
+export interface ConvertClass {
     convert: number;
 }
 
@@ -1026,6 +1026,7 @@ export interface Obj4 {
     rethrows:         Rethrows;
     return:           Return;
     right:            Right;
+    s:                S;
     sbyte:            Sbyte;
     sealed:           Sealed;
     select:           Select;
@@ -1155,6 +1156,10 @@ export interface Right {
     right: number;
 }
 
+export interface S {
+    s: number;
+}
+
 export interface Sbyte {
     sbyte: number;
 }
@@ -1683,7 +1688,7 @@ const typeMap: any = {
         { json: "constructor", js: "constructor", typ: r("Constructor") },
         { json: "continue", js: "continue", typ: r("Continue") },
         { json: "convenience", js: "convenience", typ: r("Convenience") },
-        { json: "convert", js: "convert", typ: r("Convert") },
+        { json: "convert", js: "convert", typ: r("ConvertClass") },
         { json: "converter", js: "converter", typ: r("Converter") },
         { json: "date", js: "date", typ: r("DateClass") },
         { json: "date_parse_handling", js: "date_parse_handling", typ: r("DateParseHandling") },
@@ -1862,7 +1867,7 @@ const typeMap: any = {
     "Convenience": o([
         { json: "convenience", js: "convenience", typ: i(0) },
     ], false),
-    "Convert": o([
+    "ConvertClass": o([
         { json: "convert", js: "convert", typ: i(0) },
     ], false),
     "Converter": o([
@@ -2438,6 +2443,7 @@ const typeMap: any = {
         { json: "rethrows", js: "rethrows", typ: r("Rethrows") },
         { json: "return", js: "return", typ: r("Return") },
         { json: "right", js: "right", typ: r("Right") },
+        { json: "s", js: "s", typ: r("S") },
         { json: "sbyte", js: "sbyte", typ: r("Sbyte") },
         { json: "sealed", js: "sealed", typ: r("Sealed") },
         { json: "select", js: "select", typ: r("Select") },
@@ -2545,6 +2551,9 @@ const typeMap: any = {
     "Right": o([
         { json: "right", js: "right", typ: i(0) },
     ], false),
+    "S": o([
+        { json: "s", js: "s", typ: i(0) },
+    ], false),
     "Sbyte": o([
         { json: "sbyte", js: "sbyte", typ: i(0) },
     ], false),
diff --git a/head/typescript/test/inputs/json/priority/keywords.json/prefer-types-true--df33e18681f9/TopLevel.ts b/head/typescript/test/inputs/json/priority/keywords.json/prefer-types-true--df33e18681f9/TopLevel.ts
new file mode 100644
index 0000000..b6d855e
--- /dev/null
+++ b/head/typescript/test/inputs/json/priority/keywords.json/prefer-types-true--df33e18681f9/TopLevel.ts
@@ -0,0 +1,2769 @@
+// To parse this data:
+//
+//   import { Convert, TopLevel } from "./TopLevel";
+//
+//   const topLevel = Convert.toTopLevel(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export type TopLevel = {
+    dummy: number;
+    obj1:  Obj1;
+    obj2:  Obj2;
+    obj3:  Obj3;
+    obj4:  Obj4;
+    obj5:  Obj5;
+}
+
+export type Obj1 = {
+    Any:                 Any;
+    BOOL:                Bool;
+    Class:               Class;
+    _:                   Empty;
+    _Bool:               BoolClass;
+    _Complex:            Complex;
+    _Imaginery:          Imaginery;
+    abstract:            Abstract;
+    alignas:             Alignas;
+    alignof:             Alignof;
+    and:                 And;
+    and_eq:              AndEq;
+    any:                 AnyClass;
+    array:               ArrayClass;
+    as:                  As;
+    asm:                 ASM;
+    assert:              Assert;
+    associatedtype:      Associatedtype;
+    associativity:       Associativity;
+    async:               Async;
+    atomic:              Atomic;
+    atomic_cancel:       AtomicCancel;
+    atomic_commit:       AtomicCommit;
+    atomic_noexcept:     AtomicNoexcept;
+    auto:                Auto;
+    await:               Await;
+    base:                Base;
+    bitand:              Bitand;
+    bitor:               Bitor;
+    bool:                Obj1Bool;
+    boolean:             Boolean;
+    break:               Break;
+    bycopy:              Bycopy;
+    byref:               Byref;
+    byte:                Byte;
+    case:                Case;
+    catch:               Catch;
+    chan:                Chan;
+    char:                Char;
+    char16_t:            Char16T;
+    char32_t:            Char32T;
+    checked:             Checked;
+    class:               ClassClass;
+    clone:               Clone;
+    co_await:            CoAwait;
+    co_return:           CoReturn;
+    co_yield:            CoYield;
+    compl:               Compl;
+    concept:             Concept;
+    console:             Console;
+    const:               Const;
+    const_cast:          ConstCast;
+    constexpr:           Constexpr;
+    constructor:         Constructor;
+    continue:            Continue;
+    convenience:         Convenience;
+    convert:             ConvertClass;
+    converter:           Converter;
+    date:                DateClass;
+    date_parse_handling: DateParseHandling;
+    debugger:            Debugger;
+    decimal:             Decimal;
+    declare:             Declare;
+    decltype:            Decltype;
+    decode_string:       DecodeString;
+    dummy:               number;
+}
+
+export type Any = {
+    Any: number;
+}
+
+export type Bool = {
+    BOOL: number;
+}
+
+export type Class = {
+    Class: number;
+}
+
+export type Empty = {
+    _: number;
+}
+
+export type BoolClass = {
+    _Bool: number;
+}
+
+export type Complex = {
+    _Complex: number;
+}
+
+export type Imaginery = {
+    _Imaginery: number;
+}
+
+export type Abstract = {
+    abstract: number;
+}
+
+export type Alignas = {
+    alignas: number;
+}
+
+export type Alignof = {
+    alignof: number;
+}
+
+export type And = {
+    and: number;
+}
+
+export type AndEq = {
+    and_eq: number;
+}
+
+export type AnyClass = {
+    any: number;
+}
+
+export type ArrayClass = {
+    array: number;
+}
+
+export type As = {
+    as: number;
+}
+
+export type ASM = {
+    asm: number;
+}
+
+export type Assert = {
+    assert: number;
+}
+
+export type Associatedtype = {
+    associatedtype: number;
+}
+
+export type Associativity = {
+    associativity: number;
+}
+
+export type Async = {
+    async: number;
+}
+
+export type Atomic = {
+    atomic: number;
+}
+
+export type AtomicCancel = {
+    atomic_cancel: number;
+}
+
+export type AtomicCommit = {
+    atomic_commit: number;
+}
+
+export type AtomicNoexcept = {
+    atomic_noexcept: number;
+}
+
+export type Auto = {
+    auto: number;
+}
+
+export type Await = {
+    await: number;
+}
+
+export type Base = {
+    base: number;
+}
+
+export type Bitand = {
+    bitand: number;
+}
+
+export type Bitor = {
+    bitor: number;
+}
+
+export type Obj1Bool = {
+    bool: number;
+}
+
+export type Boolean = {
+    boolean: number;
+}
+
+export type Break = {
+    break: number;
+}
+
+export type Bycopy = {
+    bycopy: number;
+}
+
+export type Byref = {
+    byref: number;
+}
+
+export type Byte = {
+    byte: number;
+}
+
+export type Case = {
+    case: number;
+}
+
+export type Catch = {
+    catch: number;
+}
+
+export type Chan = {
+    chan: number;
+}
+
+export type Char = {
+    char: number;
+}
+
+export type Char16T = {
+    char16_t: number;
+}
+
+export type Char32T = {
+    char32_t: number;
+}
+
+export type Checked = {
+    checked: number;
+}
+
+export type ClassClass = {
+    class: number;
+}
+
+export type Clone = {
+    clone: number;
+}
+
+export type CoAwait = {
+    co_await: number;
+}
+
+export type CoReturn = {
+    co_return: number;
+}
+
+export type CoYield = {
+    co_yield: number;
+}
+
+export type Compl = {
+    compl: number;
+}
+
+export type Concept = {
+    concept: number;
+}
+
+export type Console = {
+    console: number;
+}
+
+export type Const = {
+    const: number;
+}
+
+export type ConstCast = {
+    const_cast: number;
+}
+
+export type Constexpr = {
+    constexpr: number;
+}
+
+export type Constructor = {
+    constructor: number;
+}
+
+export type Continue = {
+    continue: number;
+}
+
+export type Convenience = {
+    convenience: number;
+}
+
+export type ConvertClass = {
+    convert: number;
+}
+
+export type Converter = {
+    converter: number;
+}
+
+export type DateClass = {
+    date: number;
+}
+
+export type DateParseHandling = {
+    date_parse_handling: number;
+}
+
+export type Debugger = {
+    debugger: number;
+}
+
+export type Decimal = {
+    decimal: number;
+}
+
+export type Declare = {
+    declare: number;
+}
+
+export type Decltype = {
+    decltype: number;
+}
+
+export type DecodeString = {
+    decode_string: number;
+}
+
+export type Obj2 = {
+    False:             False;
+    IMP:               Imp;
+    def:               Def;
+    default:           Default;
+    defer:             Defer;
+    deinit:            Deinit;
+    del:               Del;
+    delegate:          Delegate;
+    delete:            Delete;
+    dict:              Dict;
+    dictionary:        Dictionary;
+    didSet:            DidSet;
+    do:                Do;
+    double:            Double;
+    dummy:             number;
+    dynamic:           Dynamic;
+    dynamic_cast:      DynamicCast;
+    elif:              Elif;
+    else:              Else;
+    encode_quick_type: EncodeQuickType;
+    enum:              Enum;
+    equalityContract:  EqualityContract;
+    event:             Event;
+    except:            Except;
+    exception:         Exception;
+    explicit:          Explicit;
+    export:            Export;
+    exposing:          Exposing;
+    extends:           Extends;
+    extension:         Extension;
+    extern:            Extern;
+    fallthrough:       Fallthrough;
+    false:             FalseClass;
+    fileprivate:       Fileprivate;
+    final:             Final;
+    finally:           Finally;
+    fixed:             Fixed;
+    float:             Float;
+    for:               For;
+    foreach:           Foreach;
+    friend:            Friend;
+    from:              From;
+    from_json:         FromJSON;
+    func:              Func;
+    function:          Function;
+    get:               Get;
+    global:            Global;
+    go:                Go;
+    goto:              Goto;
+    guard:             Guard;
+    hasOwnProperty:    HasOwnProperty;
+    id:                ID;
+    if:                If;
+    implements:        Implements;
+    implicit:          Implicit;
+    import:            Import;
+    in:                In;
+    indirect:          Indirect;
+    infix:             Infix;
+    init:              Init;
+    inline:            Inline;
+    inout:             Inout;
+    instanceof:        Instanceof;
+    int:               Int;
+    interface:         Interface;
+    internal:          Internal;
+}
+
+export type False = {
+    False: number;
+}
+
+export type Imp = {
+    IMP: number;
+}
+
+export type Def = {
+    def: number;
+}
+
+export type Default = {
+    default: number;
+}
+
+export type Defer = {
+    defer: number;
+}
+
+export type Deinit = {
+    deinit: number;
+}
+
+export type Del = {
+    del: number;
+}
+
+export type Delegate = {
+    delegate: number;
+}
+
+export type Delete = {
+    delete: number;
+}
+
+export type Dict = {
+    dict: number;
+}
+
+export type Dictionary = {
+    dictionary: number;
+}
+
+export type DidSet = {
+    didSet: number;
+}
+
+export type Do = {
+    do: number;
+}
+
+export type Double = {
+    double: number;
+}
+
+export type Dynamic = {
+    dynamic: number;
+}
+
+export type DynamicCast = {
+    dynamic_cast: number;
+}
+
+export type Elif = {
+    elif: number;
+}
+
+export type Else = {
+    else: number;
+}
+
+export type EncodeQuickType = {
+    encode_quick_type: number;
+}
+
+export type Enum = {
+    enum: number;
+}
+
+export type EqualityContract = {
+    equalityContract: number;
+}
+
+export type Event = {
+    event: number;
+}
+
+export type Except = {
+    except: number;
+}
+
+export type Exception = {
+    exception: number;
+}
+
+export type Explicit = {
+    explicit: number;
+}
+
+export type Export = {
+    export: number;
+}
+
+export type Exposing = {
+    exposing: number;
+}
+
+export type Extends = {
+    extends: number;
+}
+
+export type Extension = {
+    extension: number;
+}
+
+export type Extern = {
+    extern: number;
+}
+
+export type Fallthrough = {
+    fallthrough: number;
+}
+
+export type FalseClass = {
+    false: number;
+}
+
+export type Fileprivate = {
+    fileprivate: number;
+}
+
+export type Final = {
+    final: number;
+}
+
+export type Finally = {
+    finally: number;
+}
+
+export type Fixed = {
+    fixed: number;
+}
+
+export type Float = {
+    float: number;
+}
+
+export type For = {
+    for: number;
+}
+
+export type Foreach = {
+    foreach: number;
+}
+
+export type Friend = {
+    friend: number;
+}
+
+export type From = {
+    from: number;
+}
+
+export type FromJSON = {
+    from_json: number;
+}
+
+export type Func = {
+    func: number;
+}
+
+export type Function = {
+    function: number;
+}
+
+export type Get = {
+    get: number;
+}
+
+export type Global = {
+    global: number;
+}
+
+export type Go = {
+    go: number;
+}
+
+export type Goto = {
+    goto: number;
+}
+
+export type Guard = {
+    guard: number;
+}
+
+export type HasOwnProperty = {
+    hasOwnProperty: number;
+}
+
+export type ID = {
+    id: number;
+}
+
+export type If = {
+    if: number;
+}
+
+export type Implements = {
+    implements: number;
+}
+
+export type Implicit = {
+    implicit: number;
+}
+
+export type Import = {
+    import: number;
+}
+
+export type In = {
+    in: number;
+}
+
+export type Indirect = {
+    indirect: number;
+}
+
+export type Infix = {
+    infix: number;
+}
+
+export type Init = {
+    init: number;
+}
+
+export type Inline = {
+    inline: number;
+}
+
+export type Inout = {
+    inout: number;
+}
+
+export type Instanceof = {
+    instanceof: number;
+}
+
+export type Int = {
+    int: number;
+}
+
+export type Interface = {
+    interface: number;
+}
+
+export type Internal = {
+    internal: number;
+}
+
+export type Obj3 = {
+    NO:                         No;
+    NSString:                   NSString;
+    NULL:                       Null;
+    None:                       None;
+    Protocol:                   Protocol;
+    dummy:                      number;
+    is:                         Is;
+    iterable:                   Iterable;
+    jdec:                       Jdec;
+    jenc:                       Jenc;
+    jpipe:                      Jpipe;
+    json:                       JSON;
+    json_converter:             JSONConverter;
+    json_serializer:            JSONSerializer;
+    json_token:                 JSONToken;
+    json_writer:                JSONWriter;
+    lambda:                     Lambda;
+    lazy:                       Lazy;
+    left:                       Left;
+    let:                        Let;
+    list:                       List;
+    lock:                       Lock;
+    long:                       Long;
+    map:                        Map;
+    metadata_property_handling: MetadataPropertyHandling;
+    module:                     Module;
+    mutable:                    Mutable;
+    mutating:                   Mutating;
+    namespace:                  Namespace;
+    native:                     Native;
+    new:                        New;
+    newtonsoft:                 Newtonsoft;
+    nil:                        Nil;
+    noexcept:                   Noexcept;
+    nonatomic:                  Nonatomic;
+    none:                       NoneClass;
+    nonlocal:                   Nonlocal;
+    nonmutating:                Nonmutating;
+    not:                        Not;
+    not_eq:                     NotEq;
+    null:                       NullClass;
+    nullptr:                    Nullptr;
+    number:                     Number;
+    object:                     Object;
+    of:                         Of;
+    oneway:                     Oneway;
+    open:                       Open;
+    operator:                   Operator;
+    optional:                   Optional;
+    or:                         Or;
+    or_eq:                      OrEq;
+    out:                        Out;
+    override:                   Override;
+    package:                    Package;
+    params:                     Params;
+    pass:                       Pass;
+    port:                       Port;
+    postfix:                    Postfix;
+    precedence:                 Precedence;
+    prefix:                     Prefix;
+    print:                      Print;
+    printMembers:               PrintMembers;
+    printf:                     Printf;
+    private:                    Private;
+    protected:                  Protected;
+    protocol:                   ProtocolClass;
+}
+
+export type No = {
+    NO: number;
+}
+
+export type NSString = {
+    NSString: number;
+}
+
+export type Null = {
+    NULL: number;
+}
+
+export type None = {
+    None: number;
+}
+
+export type Protocol = {
+    Protocol: number;
+}
+
+export type Is = {
+    is: number;
+}
+
+export type Iterable = {
+    iterable: number;
+}
+
+export type Jdec = {
+    jdec: number;
+}
+
+export type Jenc = {
+    jenc: number;
+}
+
+export type Jpipe = {
+    jpipe: number;
+}
+
+export type JSON = {
+    json: number;
+}
+
+export type JSONConverter = {
+    json_converter: number;
+}
+
+export type JSONSerializer = {
+    json_serializer: number;
+}
+
+export type JSONToken = {
+    json_token: number;
+}
+
+export type JSONWriter = {
+    json_writer: number;
+}
+
+export type Lambda = {
+    lambda: number;
+}
+
+export type Lazy = {
+    lazy: number;
+}
+
+export type Left = {
+    left: number;
+}
+
+export type Let = {
+    let: number;
+}
+
+export type List = {
+    list: number;
+}
+
+export type Lock = {
+    lock: number;
+}
+
+export type Long = {
+    long: number;
+}
+
+export type Map = {
+    map: number;
+}
+
+export type MetadataPropertyHandling = {
+    metadata_property_handling: number;
+}
+
+export type Module = {
+    module: number;
+}
+
+export type Mutable = {
+    mutable: number;
+}
+
+export type Mutating = {
+    mutating: number;
+}
+
+export type Namespace = {
+    namespace: number;
+}
+
+export type Native = {
+    native: number;
+}
+
+export type New = {
+    new: number;
+}
+
+export type Newtonsoft = {
+    newtonsoft: number;
+}
+
+export type Nil = {
+    nil: number;
+}
+
+export type Noexcept = {
+    noexcept: number;
+}
+
+export type Nonatomic = {
+    nonatomic: number;
+}
+
+export type NoneClass = {
+    none: number;
+}
+
+export type Nonlocal = {
+    nonlocal: number;
+}
+
+export type Nonmutating = {
+    nonmutating: number;
+}
+
+export type Not = {
+    not: number;
+}
+
+export type NotEq = {
+    not_eq: number;
+}
+
+export type NullClass = {
+    null: number;
+}
+
+export type Nullptr = {
+    nullptr: number;
+}
+
+export type Number = {
+    number: number;
+}
+
+export type Object = {
+    object: number;
+}
+
+export type Of = {
+    of: number;
+}
+
+export type Oneway = {
+    oneway: number;
+}
+
+export type Open = {
+    open: number;
+}
+
+export type Operator = {
+    operator: number;
+}
+
+export type Optional = {
+    optional: number;
+}
+
+export type Or = {
+    or: number;
+}
+
+export type OrEq = {
+    or_eq: number;
+}
+
+export type Out = {
+    out: number;
+}
+
+export type Override = {
+    override: number;
+}
+
+export type Package = {
+    package: number;
+}
+
+export type Params = {
+    params: number;
+}
+
+export type Pass = {
+    pass: number;
+}
+
+export type Port = {
+    port: number;
+}
+
+export type Postfix = {
+    postfix: number;
+}
+
+export type Precedence = {
+    precedence: number;
+}
+
+export type Prefix = {
+    prefix: number;
+}
+
+export type Print = {
+    print: number;
+}
+
+export type PrintMembers = {
+    printMembers: number;
+}
+
+export type Printf = {
+    printf: number;
+}
+
+export type Private = {
+    private: number;
+}
+
+export type Protected = {
+    protected: number;
+}
+
+export type ProtocolClass = {
+    protocol: number;
+}
+
+export type Obj4 = {
+    SEL:              Sel;
+    Self:             Self;
+    True:             True;
+    Type:             Type;
+    dummy:            number;
+    public:           Public;
+    quicktype:        Quicktype;
+    raise:            Raise;
+    range:            Range;
+    readonly:         Readonly;
+    ref:              Ref;
+    register:         Register;
+    reinterpret_cast: ReinterpretCast;
+    repeat:           Repeat;
+    require:          Require;
+    required:         Required;
+    requires:         Requires;
+    restrict:         Restrict;
+    retain:           Retain;
+    rethrows:         Rethrows;
+    return:           Return;
+    right:            Right;
+    s:                S;
+    sbyte:            Sbyte;
+    sealed:           Sealed;
+    select:           Select;
+    self:             SelfClass;
+    serialize:        Serialize;
+    set:              Set;
+    short:            Short;
+    signed:           Signed;
+    sizeof:           Sizeof;
+    stackalloc:       Stackalloc;
+    static:           Static;
+    static_assert:    StaticAssert;
+    static_cast:      StaticCast;
+    strictfp:         Strictfp;
+    string:           String;
+    struct:           Struct;
+    subscript:        Subscript;
+    super:            Super;
+    switch:           Switch;
+    symbol:           Symbol;
+    synchronized:     Synchronized;
+    system:           System;
+    template:         Template;
+    then:             Then;
+    this:             This;
+    thread_local:     ThreadLocal;
+    throw:            Throw;
+    throws:           Throws;
+    to_json:          ToJSON;
+    top_level:        TopLevelClass;
+    transient:        Transient;
+    true:             TrueClass;
+    try:              Try;
+    type:             TypeClass;
+    typealias:        Typealias;
+    typedef:          Typedef;
+    typeid:           Typeid;
+    typename:         Typename;
+    typeof:           Typeof;
+    uint:             Uint;
+    ulong:            Ulong;
+    unchecked:        Unchecked;
+    undefined:        Undefined;
+}
+
+export type Sel = {
+    SEL: number;
+}
+
+export type Self = {
+    Self: number;
+}
+
+export type True = {
+    True: number;
+}
+
+export type Type = {
+    Type: number;
+}
+
+export type Public = {
+    public: number;
+}
+
+export type Quicktype = {
+    quicktype: number;
+}
+
+export type Raise = {
+    raise: number;
+}
+
+export type Range = {
+    range: number;
+}
+
+export type Readonly = {
+    readonly: number;
+}
+
+export type Ref = {
+    ref: number;
+}
+
+export type Register = {
+    register: number;
+}
+
+export type ReinterpretCast = {
+    reinterpret_cast: number;
+}
+
+export type Repeat = {
+    repeat: number;
+}
+
+export type Require = {
+    require: number;
+}
+
+export type Required = {
+    required: number;
+}
+
+export type Requires = {
+    requires: number;
+}
+
+export type Restrict = {
+    restrict: number;
+}
+
+export type Retain = {
+    retain: number;
+}
+
+export type Rethrows = {
+    rethrows: number;
+}
+
+export type Return = {
+    return: number;
+}
+
+export type Right = {
+    right: number;
+}
+
+export type S = {
+    s: number;
+}
+
+export type Sbyte = {
+    sbyte: number;
+}
+
+export type Sealed = {
+    sealed: number;
+}
+
+export type Select = {
+    select: number;
+}
+
+export type SelfClass = {
+    self: number;
+}
+
+export type Serialize = {
+    serialize: number;
+}
+
+export type Set = {
+    set: number;
+}
+
+export type Short = {
+    short: number;
+}
+
+export type Signed = {
+    signed: number;
+}
+
+export type Sizeof = {
+    sizeof: number;
+}
+
+export type Stackalloc = {
+    stackalloc: number;
+}
+
+export type Static = {
+    static: number;
+}
+
+export type StaticAssert = {
+    static_assert: number;
+}
+
+export type StaticCast = {
+    static_cast: number;
+}
+
+export type Strictfp = {
+    strictfp: number;
+}
+
+export type String = {
+    string: number;
+}
+
+export type Struct = {
+    struct: number;
+}
+
+export type Subscript = {
+    subscript: number;
+}
+
+export type Super = {
+    super: number;
+}
+
+export type Switch = {
+    switch: number;
+}
+
+export type Symbol = {
+    symbol: number;
+}
+
+export type Synchronized = {
+    synchronized: number;
+}
+
+export type System = {
+    system: number;
+}
+
+export type Template = {
+    template: number;
+}
+
+export type Then = {
+    then: number;
+}
+
+export type This = {
+    this: number;
+}
+
+export type ThreadLocal = {
+    thread_local: number;
+}
+
+export type Throw = {
+    throw: number;
+}
+
+export type Throws = {
+    throws: number;
+}
+
+export type ToJSON = {
+    to_json: number;
+}
+
+export type TopLevelClass = {
+    top_level: number;
+}
+
+export type Transient = {
+    transient: number;
+}
+
+export type TrueClass = {
+    true: number;
+}
+
+export type Try = {
+    try: number;
+}
+
+export type TypeClass = {
+    type: number;
+}
+
+export type Typealias = {
+    typealias: number;
+}
+
+export type Typedef = {
+    typedef: number;
+}
+
+export type Typeid = {
+    typeid: number;
+}
+
+export type Typename = {
+    typename: number;
+}
+
+export type Typeof = {
+    typeof: number;
+}
+
+export type Uint = {
+    uint: number;
+}
+
+export type Ulong = {
+    ulong: number;
+}
+
+export type Unchecked = {
+    unchecked: number;
+}
+
+export type Undefined = {
+    undefined: number;
+}
+
+export type Obj5 = {
+    YES:      Yes;
+    dummy:    number;
+    union:    Union;
+    unowned:  Unowned;
+    unsafe:   Unsafe;
+    unsigned: Unsigned;
+    ushort:   Ushort;
+    using:    Using;
+    var:      Var;
+    virtual:  Virtual;
+    void:     Void;
+    volatile: Volatile;
+    wchar_t:  WcharT;
+    weak:     Weak;
+    where:    Where;
+    while:    While;
+    willSet:  WillSet;
+    with:     With;
+    xor:      Xor;
+    xor_eq:   XorEq;
+    yield:    Yield;
+}
+
+export type Yes = {
+    YES: number;
+}
+
+export type Union = {
+    union: number;
+}
+
+export type Unowned = {
+    unowned: number;
+}
+
+export type Unsafe = {
+    unsafe: number;
+}
+
+export type Unsigned = {
+    unsigned: number;
+}
+
+export type Ushort = {
+    ushort: number;
+}
+
+export type Using = {
+    using: number;
+}
+
+export type Var = {
+    var: number;
+}
+
+export type Virtual = {
+    virtual: number;
+}
+
+export type Void = {
+    void: number;
+}
+
+export type Volatile = {
+    volatile: number;
+}
+
+export type WcharT = {
+    wchar_t: number;
+}
+
+export type Weak = {
+    weak: number;
+}
+
+export type Where = {
+    where: number;
+}
+
+export type While = {
+    while: number;
+}
+
+export type WillSet = {
+    willSet: number;
+}
+
+export type With = {
+    with: number;
+}
+
+export type Xor = {
+    xor: number;
+}
+
+export type XorEq = {
+    xor_eq: number;
+}
+
+export type Yield = {
+    yield: number;
+}
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+export class Convert {
+    public static toTopLevel(json: string): TopLevel {
+        return cast(JSON.parse(json), r("TopLevel"));
+    }
+
+    public static topLevelToJson(value: TopLevel): string {
+        return JSON.stringify(uncast(value, r("TopLevel")), null, 2);
+    }
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
+    const prettyTyp = prettyTypeName(typ);
+    const parentText = parent ? ` on ${parent}` : '';
+    const keyText = key ? ` for key "${key}"` : '';
+    throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+    if (Array.isArray(typ)) {
+        if (typ.length === 2 && typ[0] === undefined) {
+            return `an optional ${prettyTypeName(typ[1])}`;
+        } else {
+            return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+        }
+    } else if (typeof typ === "object" && typ.literal !== undefined) {
+        return typ.literal;
+    } else {
+        return typeof typ;
+    }
+}
+
+function jsonToJSProps(typ: any): any {
+    if (typ.jsonToJS === undefined) {
+        const map: any = {};
+        typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+        typ.jsonToJS = map;
+    }
+    return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+    if (typ.jsToJSON === undefined) {
+        const map: any = {};
+        typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+        typ.jsToJSON = map;
+    }
+    return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+    function transformPrimitive(typ: string, val: any): any {
+        if (typeof typ === typeof val) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+
+    function transformUnion(typs: any[], val: any): any {
+        // val must validate against one typ in typs
+        const l = typs.length;
+        for (let i = 0; i < l; i++) {
+            const typ = typs[i];
+            try {
+                return transform(val, typ, getProps);
+            } catch (_) {}
+        }
+        return invalidValue(typs, val, key, parent);
+    }
+
+    function transformEnum(cases: string[], val: any): any {
+        if (cases.indexOf(val) !== -1) return val;
+        return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+    }
+
+    function transformArray(typ: any, val: any): any {
+        // val must be an array with no invalid elements
+        if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+
+        return val.map(el => transform(el, typ, getProps));
+    }
+
+    function transformDate(val: any): any {
+        if (val === null) {
+            return null;
+        }
+        const d = new Date(val);
+        if (isNaN(d.valueOf())) {
+            return invalidValue(l("Date"), val, key, parent);
+        }
+        return d;
+    }
+
+    function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+        if (val === null || typeof val !== "object" || Array.isArray(val)) {
+            return invalidValue(l(ref || "object"), val, key, parent);
+        }
+        const result: any = {};
+        Object.getOwnPropertyNames(props).forEach(key => {
+            const prop = props[key];
+            const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+            result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+        });
+        Object.getOwnPropertyNames(val).forEach(key => {
+            if (!Object.prototype.hasOwnProperty.call(props, key)) {
+                result[key] = transform(val[key], additional, getProps, key, ref);
+            }
+        });
+        return result;
+    }
+
+    if (typ === "any") return val;
+    if (typ === null) {
+        if (val === null) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+    if (typ === false) return invalidValue(typ, val, key, parent);
+    let ref: any = undefined;
+    while (typeof typ === "object" && typ.ref !== undefined) {
+        ref = typ.ref;
+        typ = typeMap[typ.ref];
+    }
+    if (Array.isArray(typ)) return transformEnum(typ, val);
+    if (typeof typ === "object") {
+        return typ.hasOwnProperty("pattern")      ? typeof val === "string" && new RegExp(typ.pattern).test(val) ? val : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("string")       ? typeof val === "string" && (typ.min === undefined || val.length >= typ.min) && (typ.max === undefined || val.length <= typ.max) ? transform(val, typ.string, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("number")       ? typeof val === "number" && (typ.min === undefined || val >= typ.min) && (typ.max === undefined || val <= typ.max) ? transform(val, typ.number, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("integer")      ? typeof val === "number" && val % 1 === 0 ? val : invalidValue(l("integer"), val, key, parent)
+            : typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+            : typ.hasOwnProperty("arrayItems")    ? transformArray(typ.arrayItems, val)
+            : typ.hasOwnProperty("props")         ? transformObject(getProps(typ), typ.additional, val)
+            : invalidValue(typ, val, key, parent);
+    }
+    // Numbers can be parsed by Date but shouldn't be.
+    if (typ === Date && typeof val !== "number") return transformDate(val);
+    return transformPrimitive(typ, val);
+}
+
+function cast<T>(val: any, typ: any): T {
+    return transform(val, typ, jsonToJSProps);
+}
+
+function uncast<T>(val: T, typ: any): any {
+    return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+    return { literal: typ };
+}
+
+function a(typ: any) {
+    return { arrayItems: typ };
+}
+
+function i(typ: any) {
+    return { integer: typ };
+}
+
+function p(pattern: any) {
+    return { pattern };
+}
+
+function s(typ: any, min: any, max: any) {
+    return { string: typ, min, max };
+}
+
+function n(typ: any, min: any, max: any) {
+    return { number: typ, min, max };
+}
+
+function u(...typs: any[]) {
+    return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+    return { props, additional };
+}
+
+function m(additional: any) {
+    const props: any[] = [];
+    return { props, additional };
+}
+
+function r(name: string) {
+    return { ref: name };
+}
+
+const typeMap: any = {
+    "TopLevel": o([
+        { json: "dummy", js: "dummy", typ: i(0) },
+        { json: "obj1", js: "obj1", typ: r("Obj1") },
+        { json: "obj2", js: "obj2", typ: r("Obj2") },
+        { json: "obj3", js: "obj3", typ: r("Obj3") },
+        { json: "obj4", js: "obj4", typ: r("Obj4") },
+        { json: "obj5", js: "obj5", typ: r("Obj5") },
+    ], false),
+    "Obj1": o([
+        { json: "Any", js: "Any", typ: r("Any") },
+        { json: "BOOL", js: "BOOL", typ: r("Bool") },
+        { json: "Class", js: "Class", typ: r("Class") },
+        { json: "_", js: "_", typ: r("Empty") },
+        { json: "_Bool", js: "_Bool", typ: r("BoolClass") },
+        { json: "_Complex", js: "_Complex", typ: r("Complex") },
+        { json: "_Imaginery", js: "_Imaginery", typ: r("Imaginery") },
+        { json: "abstract", js: "abstract", typ: r("Abstract") },
+        { json: "alignas", js: "alignas", typ: r("Alignas") },
+        { json: "alignof", js: "alignof", typ: r("Alignof") },
+        { json: "and", js: "and", typ: r("And") },
+        { json: "and_eq", js: "and_eq", typ: r("AndEq") },
+        { json: "any", js: "any", typ: r("AnyClass") },
+        { json: "array", js: "array", typ: r("ArrayClass") },
+        { json: "as", js: "as", typ: r("As") },
+        { json: "asm", js: "asm", typ: r("ASM") },
+        { json: "assert", js: "assert", typ: r("Assert") },
+        { json: "associatedtype", js: "associatedtype", typ: r("Associatedtype") },
+        { json: "associativity", js: "associativity", typ: r("Associativity") },
+        { json: "async", js: "async", typ: r("Async") },
+        { json: "atomic", js: "atomic", typ: r("Atomic") },
+        { json: "atomic_cancel", js: "atomic_cancel", typ: r("AtomicCancel") },
+        { json: "atomic_commit", js: "atomic_commit", typ: r("AtomicCommit") },
+        { json: "atomic_noexcept", js: "atomic_noexcept", typ: r("AtomicNoexcept") },
+        { json: "auto", js: "auto", typ: r("Auto") },
+        { json: "await", js: "await", typ: r("Await") },
+        { json: "base", js: "base", typ: r("Base") },
+        { json: "bitand", js: "bitand", typ: r("Bitand") },
+        { json: "bitor", js: "bitor", typ: r("Bitor") },
+        { json: "bool", js: "bool", typ: r("Obj1Bool") },
+        { json: "boolean", js: "boolean", typ: r("Boolean") },
+        { json: "break", js: "break", typ: r("Break") },
+        { json: "bycopy", js: "bycopy", typ: r("Bycopy") },
+        { json: "byref", js: "byref", typ: r("Byref") },
+        { json: "byte", js: "byte", typ: r("Byte") },
+        { json: "case", js: "case", typ: r("Case") },
+        { json: "catch", js: "catch", typ: r("Catch") },
+        { json: "chan", js: "chan", typ: r("Chan") },
+        { json: "char", js: "char", typ: r("Char") },
+        { json: "char16_t", js: "char16_t", typ: r("Char16T") },
+        { json: "char32_t", js: "char32_t", typ: r("Char32T") },
+        { json: "checked", js: "checked", typ: r("Checked") },
+        { json: "class", js: "class", typ: r("ClassClass") },
+        { json: "clone", js: "clone", typ: r("Clone") },
+        { json: "co_await", js: "co_await", typ: r("CoAwait") },
+        { json: "co_return", js: "co_return", typ: r("CoReturn") },
+        { json: "co_yield", js: "co_yield", typ: r("CoYield") },
+        { json: "compl", js: "compl", typ: r("Compl") },
+        { json: "concept", js: "concept", typ: r("Concept") },
+        { json: "console", js: "console", typ: r("Console") },
+        { json: "const", js: "const", typ: r("Const") },
+        { json: "const_cast", js: "const_cast", typ: r("ConstCast") },
+        { json: "constexpr", js: "constexpr", typ: r("Constexpr") },
+        { json: "constructor", js: "constructor", typ: r("Constructor") },
+        { json: "continue", js: "continue", typ: r("Continue") },
+        { json: "convenience", js: "convenience", typ: r("Convenience") },
+        { json: "convert", js: "convert", typ: r("ConvertClass") },
+        { json: "converter", js: "converter", typ: r("Converter") },
+        { json: "date", js: "date", typ: r("DateClass") },
+        { json: "date_parse_handling", js: "date_parse_handling", typ: r("DateParseHandling") },
+        { json: "debugger", js: "debugger", typ: r("Debugger") },
+        { json: "decimal", js: "decimal", typ: r("Decimal") },
+        { json: "declare", js: "declare", typ: r("Declare") },
+        { json: "decltype", js: "decltype", typ: r("Decltype") },
+        { json: "decode_string", js: "decode_string", typ: r("DecodeString") },
+        { json: "dummy", js: "dummy", typ: i(0) },
+    ], false),
+    "Any": o([
+        { json: "Any", js: "Any", typ: i(0) },
+    ], false),
+    "Bool": o([
+        { json: "BOOL", js: "BOOL", typ: i(0) },
+    ], false),
+    "Class": o([
+        { json: "Class", js: "Class", typ: i(0) },
+    ], false),
+    "Empty": o([
+        { json: "_", js: "_", typ: i(0) },
+    ], false),
+    "BoolClass": o([
+        { json: "_Bool", js: "_Bool", typ: i(0) },
+    ], false),
+    "Complex": o([
+        { json: "_Complex", js: "_Complex", typ: i(0) },
+    ], false),
+    "Imaginery": o([
+        { json: "_Imaginery", js: "_Imaginery", typ: i(0) },
+    ], false),
+    "Abstract": o([
+        { json: "abstract", js: "abstract", typ: i(0) },
+    ], false),
+    "Alignas": o([
+        { json: "alignas", js: "alignas", typ: i(0) },
+    ], false),
+    "Alignof": o([
+        { json: "alignof", js: "alignof", typ: i(0) },
+    ], false),
+    "And": o([
+        { json: "and", js: "and", typ: i(0) },
+    ], false),
+    "AndEq": o([
+        { json: "and_eq", js: "and_eq", typ: i(0) },
+    ], false),
+    "AnyClass": o([
+        { json: "any", js: "any", typ: i(0) },
+    ], false),
+    "ArrayClass": o([
+        { json: "array", js: "array", typ: i(0) },
+    ], false),
+    "As": o([
+        { json: "as", js: "as", typ: i(0) },
+    ], false),
+    "ASM": o([
+        { json: "asm", js: "asm", typ: i(0) },
+    ], false),
+    "Assert": o([
+        { json: "assert", js: "assert", typ: i(0) },
+    ], false),
+    "Associatedtype": o([
+        { json: "associatedtype", js: "associatedtype", typ: i(0) },
+    ], false),
+    "Associativity": o([
+        { json: "associativity", js: "associativity", typ: i(0) },
+    ], false),
+    "Async": o([
+        { json: "async", js: "async", typ: i(0) },
+    ], false),
+    "Atomic": o([
+        { json: "atomic", js: "atomic", typ: i(0) },
+    ], false),
+    "AtomicCancel": o([
+        { json: "atomic_cancel", js: "atomic_cancel", typ: i(0) },
+    ], false),
+    "AtomicCommit": o([
+        { json: "atomic_commit", js: "atomic_commit", typ: i(0) },
+    ], false),
+    "AtomicNoexcept": o([
+        { json: "atomic_noexcept", js: "atomic_noexcept", typ: i(0) },
+    ], false),
+    "Auto": o([
+        { json: "auto", js: "auto", typ: i(0) },
+    ], false),
+    "Await": o([
+        { json: "await", js: "await", typ: i(0) },
+    ], false),
+    "Base": o([
+        { json: "base", js: "base", typ: i(0) },
+    ], false),
+    "Bitand": o([
+        { json: "bitand", js: "bitand", typ: i(0) },
+    ], false),
+    "Bitor": o([
+        { json: "bitor", js: "bitor", typ: i(0) },
+    ], false),
+    "Obj1Bool": o([
+        { json: "bool", js: "bool", typ: i(0) },
+    ], false),
+    "Boolean": o([
+        { json: "boolean", js: "boolean", typ: i(0) },
+    ], false),
+    "Break": o([
+        { json: "break", js: "break", typ: i(0) },
+    ], false),
+    "Bycopy": o([
+        { json: "bycopy", js: "bycopy", typ: i(0) },
+    ], false),
+    "Byref": o([
+        { json: "byref", js: "byref", typ: i(0) },
+    ], false),
+    "Byte": o([
+        { json: "byte", js: "byte", typ: i(0) },
+    ], false),
+    "Case": o([
+        { json: "case", js: "case", typ: i(0) },
+    ], false),
+    "Catch": o([
+        { json: "catch", js: "catch", typ: i(0) },
+    ], false),
+    "Chan": o([
+        { json: "chan", js: "chan", typ: i(0) },
+    ], false),
+    "Char": o([
+        { json: "char", js: "char", typ: i(0) },
+    ], false),
+    "Char16T": o([
+        { json: "char16_t", js: "char16_t", typ: i(0) },
+    ], false),
+    "Char32T": o([
+        { json: "char32_t", js: "char32_t", typ: i(0) },
+    ], false),
+    "Checked": o([
+        { json: "checked", js: "checked", typ: i(0) },
+    ], false),
+    "ClassClass": o([
+        { json: "class", js: "class", typ: i(0) },
+    ], false),
+    "Clone": o([
+        { json: "clone", js: "clone", typ: i(0) },
+    ], false),
+    "CoAwait": o([
+        { json: "co_await", js: "co_await", typ: i(0) },
+    ], false),
+    "CoReturn": o([
+        { json: "co_return", js: "co_return", typ: i(0) },
+    ], false),
+    "CoYield": o([
+        { json: "co_yield", js: "co_yield", typ: i(0) },
+    ], false),
+    "Compl": o([
+        { json: "compl", js: "compl", typ: i(0) },
+    ], false),
+    "Concept": o([
+        { json: "concept", js: "concept", typ: i(0) },
+    ], false),
+    "Console": o([
+        { json: "console", js: "console", typ: i(0) },
+    ], false),
+    "Const": o([
+        { json: "const", js: "const", typ: i(0) },
+    ], false),
+    "ConstCast": o([
+        { json: "const_cast", js: "const_cast", typ: i(0) },
+    ], false),
+    "Constexpr": o([
+        { json: "constexpr", js: "constexpr", typ: i(0) },
+    ], false),
+    "Constructor": o([
+        { json: "constructor", js: "constructor", typ: i(0) },
+    ], false),
+    "Continue": o([
+        { json: "continue", js: "continue", typ: i(0) },
+    ], false),
+    "Convenience": o([
+        { json: "convenience", js: "convenience", typ: i(0) },
+    ], false),
+    "ConvertClass": o([
+        { json: "convert", js: "convert", typ: i(0) },
+    ], false),
+    "Converter": o([
+        { json: "converter", js: "converter", typ: i(0) },
+    ], false),
+    "DateClass": o([
+        { json: "date", js: "date", typ: i(0) },
+    ], false),
+    "DateParseHandling": o([
+        { json: "date_parse_handling", js: "date_parse_handling", typ: i(0) },
+    ], false),
+    "Debugger": o([
+        { json: "debugger", js: "debugger", typ: i(0) },
+    ], false),
+    "Decimal": o([
+        { json: "decimal", js: "decimal", typ: i(0) },
+    ], false),
+    "Declare": o([
+        { json: "declare", js: "declare", typ: i(0) },
+    ], false),
+    "Decltype": o([
+        { json: "decltype", js: "decltype", typ: i(0) },
+    ], false),
+    "DecodeString": o([
+        { json: "decode_string", js: "decode_string", typ: i(0) },
+    ], false),
+    "Obj2": o([
+        { json: "False", js: "False", typ: r("False") },
+        { json: "IMP", js: "IMP", typ: r("Imp") },
+        { json: "def", js: "def", typ: r("Def") },
+        { json: "default", js: "default", typ: r("Default") },
+        { json: "defer", js: "defer", typ: r("Defer") },
+        { json: "deinit", js: "deinit", typ: r("Deinit") },
+        { json: "del", js: "del", typ: r("Del") },
+        { json: "delegate", js: "delegate", typ: r("Delegate") },
+        { json: "delete", js: "delete", typ: r("Delete") },
+        { json: "dict", js: "dict", typ: r("Dict") },
+        { json: "dictionary", js: "dictionary", typ: r("Dictionary") },
+        { json: "didSet", js: "didSet", typ: r("DidSet") },
+        { json: "do", js: "do", typ: r("Do") },
+        { json: "double", js: "double", typ: r("Double") },
+        { json: "dummy", js: "dummy", typ: i(0) },
+        { json: "dynamic", js: "dynamic", typ: r("Dynamic") },
+        { json: "dynamic_cast", js: "dynamic_cast", typ: r("DynamicCast") },
+        { json: "elif", js: "elif", typ: r("Elif") },
+        { json: "else", js: "else", typ: r("Else") },
+        { json: "encode_quick_type", js: "encode_quick_type", typ: r("EncodeQuickType") },
+        { json: "enum", js: "enum", typ: r("Enum") },
+        { json: "equalityContract", js: "equalityContract", typ: r("EqualityContract") },
+        { json: "event", js: "event", typ: r("Event") },
+        { json: "except", js: "except", typ: r("Except") },
+        { json: "exception", js: "exception", typ: r("Exception") },
+        { json: "explicit", js: "explicit", typ: r("Explicit") },
+        { json: "export", js: "export", typ: r("Export") },
+        { json: "exposing", js: "exposing", typ: r("Exposing") },
+        { json: "extends", js: "extends", typ: r("Extends") },
+        { json: "extension", js: "extension", typ: r("Extension") },
+        { json: "extern", js: "extern", typ: r("Extern") },
+        { json: "fallthrough", js: "fallthrough", typ: r("Fallthrough") },
+        { json: "false", js: "false", typ: r("FalseClass") },
+        { json: "fileprivate", js: "fileprivate", typ: r("Fileprivate") },
+        { json: "final", js: "final", typ: r("Final") },
+        { json: "finally", js: "finally", typ: r("Finally") },
+        { json: "fixed", js: "fixed", typ: r("Fixed") },
+        { json: "float", js: "float", typ: r("Float") },
+        { json: "for", js: "for", typ: r("For") },
+        { json: "foreach", js: "foreach", typ: r("Foreach") },
+        { json: "friend", js: "friend", typ: r("Friend") },
+        { json: "from", js: "from", typ: r("From") },
+        { json: "from_json", js: "from_json", typ: r("FromJSON") },
+        { json: "func", js: "func", typ: r("Func") },
+        { json: "function", js: "function", typ: r("Function") },
+        { json: "get", js: "get", typ: r("Get") },
+        { json: "global", js: "global", typ: r("Global") },
+        { json: "go", js: "go", typ: r("Go") },
+        { json: "goto", js: "goto", typ: r("Goto") },
+        { json: "guard", js: "guard", typ: r("Guard") },
+        { json: "hasOwnProperty", js: "hasOwnProperty", typ: r("HasOwnProperty") },
+        { json: "id", js: "id", typ: r("ID") },
+        { json: "if", js: "if", typ: r("If") },
+        { json: "implements", js: "implements", typ: r("Implements") },
+        { json: "implicit", js: "implicit", typ: r("Implicit") },
+        { json: "import", js: "import", typ: r("Import") },
+        { json: "in", js: "in", typ: r("In") },
+        { json: "indirect", js: "indirect", typ: r("Indirect") },
+        { json: "infix", js: "infix", typ: r("Infix") },
+        { json: "init", js: "init", typ: r("Init") },
+        { json: "inline", js: "inline", typ: r("Inline") },
+        { json: "inout", js: "inout", typ: r("Inout") },
+        { json: "instanceof", js: "instanceof", typ: r("Instanceof") },
+        { json: "int", js: "int", typ: r("Int") },
+        { json: "interface", js: "interface", typ: r("Interface") },
+        { json: "internal", js: "internal", typ: r("Internal") },
+    ], false),
+    "False": o([
+        { json: "False", js: "False", typ: i(0) },
+    ], false),
+    "Imp": o([
+        { json: "IMP", js: "IMP", typ: i(0) },
+    ], false),
+    "Def": o([
+        { json: "def", js: "def", typ: i(0) },
+    ], false),
+    "Default": o([
+        { json: "default", js: "default", typ: i(0) },
+    ], false),
+    "Defer": o([
+        { json: "defer", js: "defer", typ: i(0) },
+    ], false),
+    "Deinit": o([
+        { json: "deinit", js: "deinit", typ: i(0) },
+    ], false),
+    "Del": o([
+        { json: "del", js: "del", typ: i(0) },
+    ], false),
+    "Delegate": o([
+        { json: "delegate", js: "delegate", typ: i(0) },
+    ], false),
+    "Delete": o([
+        { json: "delete", js: "delete", typ: i(0) },
+    ], false),
+    "Dict": o([
+        { json: "dict", js: "dict", typ: i(0) },
+    ], false),
+    "Dictionary": o([
+        { json: "dictionary", js: "dictionary", typ: i(0) },
+    ], false),
+    "DidSet": o([
+        { json: "didSet", js: "didSet", typ: i(0) },
+    ], false),
+    "Do": o([
+        { json: "do", js: "do", typ: i(0) },
+    ], false),
+    "Double": o([
+        { json: "double", js: "double", typ: i(0) },
+    ], false),
+    "Dynamic": o([
+        { json: "dynamic", js: "dynamic", typ: i(0) },
+    ], false),
+    "DynamicCast": o([
+        { json: "dynamic_cast", js: "dynamic_cast", typ: i(0) },
+    ], false),
+    "Elif": o([
+        { json: "elif", js: "elif", typ: i(0) },
+    ], false),
+    "Else": o([
+        { json: "else", js: "else", typ: i(0) },
+    ], false),
+    "EncodeQuickType": o([
+        { json: "encode_quick_type", js: "encode_quick_type", typ: i(0) },
+    ], false),
+    "Enum": o([
+        { json: "enum", js: "enum", typ: i(0) },
+    ], false),
+    "EqualityContract": o([
+        { json: "equalityContract", js: "equalityContract", typ: i(0) },
+    ], false),
+    "Event": o([
+        { json: "event", js: "event", typ: i(0) },
+    ], false),
+    "Except": o([
+        { json: "except", js: "except", typ: i(0) },
+    ], false),
+    "Exception": o([
+        { json: "exception", js: "exception", typ: i(0) },
+    ], false),
+    "Explicit": o([
+        { json: "explicit", js: "explicit", typ: i(0) },
+    ], false),
+    "Export": o([
+        { json: "export", js: "export", typ: i(0) },
+    ], false),
+    "Exposing": o([
+        { json: "exposing", js: "exposing", typ: i(0) },
+    ], false),
+    "Extends": o([
+        { json: "extends", js: "extends", typ: i(0) },
+    ], false),
+    "Extension": o([
+        { json: "extension", js: "extension", typ: i(0) },
+    ], false),
+    "Extern": o([
+        { json: "extern", js: "extern", typ: i(0) },
+    ], false),
+    "Fallthrough": o([
+        { json: "fallthrough", js: "fallthrough", typ: i(0) },
+    ], false),
+    "FalseClass": o([
+        { json: "false", js: "false", typ: i(0) },
+    ], false),
+    "Fileprivate": o([
+        { json: "fileprivate", js: "fileprivate", typ: i(0) },
+    ], false),
+    "Final": o([
+        { json: "final", js: "final", typ: i(0) },
+    ], false),
+    "Finally": o([
+        { json: "finally", js: "finally", typ: i(0) },
+    ], false),
+    "Fixed": o([
+        { json: "fixed", js: "fixed", typ: i(0) },
+    ], false),
+    "Float": o([
+        { json: "float", js: "float", typ: i(0) },
+    ], false),
+    "For": o([
+        { json: "for", js: "for", typ: i(0) },
+    ], false),
+    "Foreach": o([
+        { json: "foreach", js: "foreach", typ: i(0) },
+    ], false),
+    "Friend": o([
+        { json: "friend", js: "friend", typ: i(0) },
+    ], false),
+    "From": o([
+        { json: "from", js: "from", typ: i(0) },
+    ], false),
+    "FromJSON": o([
+        { json: "from_json", js: "from_json", typ: i(0) },
+    ], false),
+    "Func": o([
+        { json: "func", js: "func", typ: i(0) },
+    ], false),
+    "Function": o([
+        { json: "function", js: "function", typ: i(0) },
+    ], false),
+    "Get": o([
+        { json: "get", js: "get", typ: i(0) },
+    ], false),
+    "Global": o([
+        { json: "global", js: "global", typ: i(0) },
+    ], false),
+    "Go": o([
+        { json: "go", js: "go", typ: i(0) },
+    ], false),
+    "Goto": o([
+        { json: "goto", js: "goto", typ: i(0) },
+    ], false),
+    "Guard": o([
+        { json: "guard", js: "guard", typ: i(0) },
+    ], false),
+    "HasOwnProperty": o([
+        { json: "hasOwnProperty", js: "hasOwnProperty", typ: i(0) },
+    ], false),
+    "ID": o([
+        { json: "id", js: "id", typ: i(0) },
+    ], false),
+    "If": o([
+        { json: "if", js: "if", typ: i(0) },
+    ], false),
+    "Implements": o([
+        { json: "implements", js: "implements", typ: i(0) },
+    ], false),
+    "Implicit": o([
+        { json: "implicit", js: "implicit", typ: i(0) },
+    ], false),
+    "Import": o([
+        { json: "import", js: "import", typ: i(0) },
+    ], false),
+    "In": o([
+        { json: "in", js: "in", typ: i(0) },
+    ], false),
+    "Indirect": o([
+        { json: "indirect", js: "indirect", typ: i(0) },
+    ], false),
+    "Infix": o([
+        { json: "infix", js: "infix", typ: i(0) },
+    ], false),
+    "Init": o([
+        { json: "init", js: "init", typ: i(0) },
+    ], false),
+    "Inline": o([
+        { json: "inline", js: "inline", typ: i(0) },
+    ], false),
+    "Inout": o([
+        { json: "inout", js: "inout", typ: i(0) },
+    ], false),
+    "Instanceof": o([
+        { json: "instanceof", js: "instanceof", typ: i(0) },
+    ], false),
+    "Int": o([
+        { json: "int", js: "int", typ: i(0) },
+    ], false),
+    "Interface": o([
+        { json: "interface", js: "interface", typ: i(0) },
+    ], false),
+    "Internal": o([
+        { json: "internal", js: "internal", typ: i(0) },
+    ], false),
+    "Obj3": o([
+        { json: "NO", js: "NO", typ: r("No") },
+        { json: "NSString", js: "NSString", typ: r("NSString") },
+        { json: "NULL", js: "NULL", typ: r("Null") },
+        { json: "None", js: "None", typ: r("None") },
+        { json: "Protocol", js: "Protocol", typ: r("Protocol") },
+        { json: "dummy", js: "dummy", typ: i(0) },
+        { json: "is", js: "is", typ: r("Is") },
+        { json: "iterable", js: "iterable", typ: r("Iterable") },
+        { json: "jdec", js: "jdec", typ: r("Jdec") },
+        { json: "jenc", js: "jenc", typ: r("Jenc") },
+        { json: "jpipe", js: "jpipe", typ: r("Jpipe") },
+        { json: "json", js: "json", typ: r("JSON") },
+        { json: "json_converter", js: "json_converter", typ: r("JSONConverter") },
+        { json: "json_serializer", js: "json_serializer", typ: r("JSONSerializer") },
+        { json: "json_token", js: "json_token", typ: r("JSONToken") },
+        { json: "json_writer", js: "json_writer", typ: r("JSONWriter") },
+        { json: "lambda", js: "lambda", typ: r("Lambda") },
+        { json: "lazy", js: "lazy", typ: r("Lazy") },
+        { json: "left", js: "left", typ: r("Left") },
+        { json: "let", js: "let", typ: r("Let") },
+        { json: "list", js: "list", typ: r("List") },
+        { json: "lock", js: "lock", typ: r("Lock") },
+        { json: "long", js: "long", typ: r("Long") },
+        { json: "map", js: "map", typ: r("Map") },
+        { json: "metadata_property_handling", js: "metadata_property_handling", typ: r("MetadataPropertyHandling") },
+        { json: "module", js: "module", typ: r("Module") },
+        { json: "mutable", js: "mutable", typ: r("Mutable") },
+        { json: "mutating", js: "mutating", typ: r("Mutating") },
+        { json: "namespace", js: "namespace", typ: r("Namespace") },
+        { json: "native", js: "native", typ: r("Native") },
+        { json: "new", js: "new", typ: r("New") },
+        { json: "newtonsoft", js: "newtonsoft", typ: r("Newtonsoft") },
+        { json: "nil", js: "nil", typ: r("Nil") },
+        { json: "noexcept", js: "noexcept", typ: r("Noexcept") },
+        { json: "nonatomic", js: "nonatomic", typ: r("Nonatomic") },
+        { json: "none", js: "none", typ: r("NoneClass") },
+        { json: "nonlocal", js: "nonlocal", typ: r("Nonlocal") },
+        { json: "nonmutating", js: "nonmutating", typ: r("Nonmutating") },
+        { json: "not", js: "not", typ: r("Not") },
+        { json: "not_eq", js: "not_eq", typ: r("NotEq") },
+        { json: "null", js: "null", typ: r("NullClass") },
+        { json: "nullptr", js: "nullptr", typ: r("Nullptr") },
+        { json: "number", js: "number", typ: r("Number") },
+        { json: "object", js: "object", typ: r("Object") },
+        { json: "of", js: "of", typ: r("Of") },
+        { json: "oneway", js: "oneway", typ: r("Oneway") },
+        { json: "open", js: "open", typ: r("Open") },
+        { json: "operator", js: "operator", typ: r("Operator") },
+        { json: "optional", js: "optional", typ: r("Optional") },
+        { json: "or", js: "or", typ: r("Or") },
+        { json: "or_eq", js: "or_eq", typ: r("OrEq") },
+        { json: "out", js: "out", typ: r("Out") },
+        { json: "override", js: "override", typ: r("Override") },
+        { json: "package", js: "package", typ: r("Package") },
+        { json: "params", js: "params", typ: r("Params") },
+        { json: "pass", js: "pass", typ: r("Pass") },
+        { json: "port", js: "port", typ: r("Port") },
+        { json: "postfix", js: "postfix", typ: r("Postfix") },
+        { json: "precedence", js: "precedence", typ: r("Precedence") },
+        { json: "prefix", js: "prefix", typ: r("Prefix") },
+        { json: "print", js: "print", typ: r("Print") },
+        { json: "printMembers", js: "printMembers", typ: r("PrintMembers") },
+        { json: "printf", js: "printf", typ: r("Printf") },
+        { json: "private", js: "private", typ: r("Private") },
+        { json: "protected", js: "protected", typ: r("Protected") },
+        { json: "protocol", js: "protocol", typ: r("ProtocolClass") },
+    ], false),
+    "No": o([
+        { json: "NO", js: "NO", typ: i(0) },
+    ], false),
+    "NSString": o([
+        { json: "NSString", js: "NSString", typ: i(0) },
+    ], false),
+    "Null": o([
+        { json: "NULL", js: "NULL", typ: i(0) },
+    ], false),
+    "None": o([
+        { json: "None", js: "None", typ: i(0) },
+    ], false),
+    "Protocol": o([
+        { json: "Protocol", js: "Protocol", typ: i(0) },
+    ], false),
+    "Is": o([
+        { json: "is", js: "is", typ: i(0) },
+    ], false),
+    "Iterable": o([
+        { json: "iterable", js: "iterable", typ: i(0) },
+    ], false),
+    "Jdec": o([
+        { json: "jdec", js: "jdec", typ: i(0) },
+    ], false),
+    "Jenc": o([
+        { json: "jenc", js: "jenc", typ: i(0) },
+    ], false),
+    "Jpipe": o([
+        { json: "jpipe", js: "jpipe", typ: i(0) },
+    ], false),
+    "JSON": o([
+        { json: "json", js: "json", typ: i(0) },
+    ], false),
+    "JSONConverter": o([
+        { json: "json_converter", js: "json_converter", typ: i(0) },
+    ], false),
+    "JSONSerializer": o([
+        { json: "json_serializer", js: "json_serializer", typ: i(0) },
+    ], false),
+    "JSONToken": o([
+        { json: "json_token", js: "json_token", typ: i(0) },
+    ], false),
+    "JSONWriter": o([
+        { json: "json_writer", js: "json_writer", typ: i(0) },
+    ], false),
+    "Lambda": o([
+        { json: "lambda", js: "lambda", typ: i(0) },
+    ], false),
+    "Lazy": o([
+        { json: "lazy", js: "lazy", typ: i(0) },
+    ], false),
+    "Left": o([
+        { json: "left", js: "left", typ: i(0) },
+    ], false),
+    "Let": o([
+        { json: "let", js: "let", typ: i(0) },
+    ], false),
+    "List": o([
+        { json: "list", js: "list", typ: i(0) },
+    ], false),
+    "Lock": o([
+        { json: "lock", js: "lock", typ: i(0) },
+    ], false),
+    "Long": o([
+        { json: "long", js: "long", typ: i(0) },
+    ], false),
+    "Map": o([
+        { json: "map", js: "map", typ: i(0) },
+    ], false),
+    "MetadataPropertyHandling": o([
+        { json: "metadata_property_handling", js: "metadata_property_handling", typ: i(0) },
+    ], false),
+    "Module": o([
+        { json: "module", js: "module", typ: i(0) },
+    ], false),
+    "Mutable": o([
+        { json: "mutable", js: "mutable", typ: i(0) },
+    ], false),
+    "Mutating": o([
+        { json: "mutating", js: "mutating", typ: i(0) },
+    ], false),
+    "Namespace": o([
+        { json: "namespace", js: "namespace", typ: i(0) },
+    ], false),
+    "Native": o([
+        { json: "native", js: "native", typ: i(0) },
+    ], false),
+    "New": o([
+        { json: "new", js: "new", typ: i(0) },
+    ], false),
+    "Newtonsoft": o([
+        { json: "newtonsoft", js: "newtonsoft", typ: i(0) },
+    ], false),
+    "Nil": o([
+        { json: "nil", js: "nil", typ: i(0) },
+    ], false),
+    "Noexcept": o([
+        { json: "noexcept", js: "noexcept", typ: i(0) },
+    ], false),
+    "Nonatomic": o([
+        { json: "nonatomic", js: "nonatomic", typ: i(0) },
+    ], false),
+    "NoneClass": o([
+        { json: "none", js: "none", typ: i(0) },
+    ], false),
+    "Nonlocal": o([
+        { json: "nonlocal", js: "nonlocal", typ: i(0) },
+    ], false),
+    "Nonmutating": o([
+        { json: "nonmutating", js: "nonmutating", typ: i(0) },
+    ], false),
+    "Not": o([
+        { json: "not", js: "not", typ: i(0) },
+    ], false),
+    "NotEq": o([
+        { json: "not_eq", js: "not_eq", typ: i(0) },
+    ], false),
+    "NullClass": o([
+        { json: "null", js: "null", typ: i(0) },
+    ], false),
+    "Nullptr": o([
+        { json: "nullptr", js: "nullptr", typ: i(0) },
+    ], false),
+    "Number": o([
+        { json: "number", js: "number", typ: i(0) },
+    ], false),
+    "Object": o([
+        { json: "object", js: "object", typ: i(0) },
+    ], false),
+    "Of": o([
+        { json: "of", js: "of", typ: i(0) },
+    ], false),
+    "Oneway": o([
+        { json: "oneway", js: "oneway", typ: i(0) },
+    ], false),
+    "Open": o([
+        { json: "open", js: "open", typ: i(0) },
+    ], false),
+    "Operator": o([
+        { json: "operator", js: "operator", typ: i(0) },
+    ], false),
+    "Optional": o([
+        { json: "optional", js: "optional", typ: i(0) },
+    ], false),
+    "Or": o([
+        { json: "or", js: "or", typ: i(0) },
+    ], false),
+    "OrEq": o([
+        { json: "or_eq", js: "or_eq", typ: i(0) },
+    ], false),
+    "Out": o([
+        { json: "out", js: "out", typ: i(0) },
+    ], false),
+    "Override": o([
+        { json: "override", js: "override", typ: i(0) },
+    ], false),
+    "Package": o([
+        { json: "package", js: "package", typ: i(0) },
+    ], false),
+    "Params": o([
+        { json: "params", js: "params", typ: i(0) },
+    ], false),
+    "Pass": o([
+        { json: "pass", js: "pass", typ: i(0) },
+    ], false),
+    "Port": o([
+        { json: "port", js: "port", typ: i(0) },
+    ], false),
+    "Postfix": o([
+        { json: "postfix", js: "postfix", typ: i(0) },
+    ], false),
+    "Precedence": o([
+        { json: "precedence", js: "precedence", typ: i(0) },
+    ], false),
+    "Prefix": o([
+        { json: "prefix", js: "prefix", typ: i(0) },
+    ], false),
+    "Print": o([
+        { json: "print", js: "print", typ: i(0) },
+    ], false),
+    "PrintMembers": o([
+        { json: "printMembers", js: "printMembers", typ: i(0) },
+    ], false),
+    "Printf": o([
+        { json: "printf", js: "printf", typ: i(0) },
+    ], false),
+    "Private": o([
+        { json: "private", js: "private", typ: i(0) },
+    ], false),
+    "Protected": o([
+        { json: "protected", js: "protected", typ: i(0) },
+    ], false),
+    "ProtocolClass": o([
+        { json: "protocol", js: "protocol", typ: i(0) },
+    ], false),
+    "Obj4": o([
+        { json: "SEL", js: "SEL", typ: r("Sel") },
+        { json: "Self", js: "Self", typ: r("Self") },
+        { json: "True", js: "True", typ: r("True") },
+        { json: "Type", js: "Type", typ: r("Type") },
+        { json: "dummy", js: "dummy", typ: i(0) },
+        { json: "public", js: "public", typ: r("Public") },
+        { json: "quicktype", js: "quicktype", typ: r("Quicktype") },
+        { json: "raise", js: "raise", typ: r("Raise") },
+        { json: "range", js: "range", typ: r("Range") },
+        { json: "readonly", js: "readonly", typ: r("Readonly") },
+        { json: "ref", js: "ref", typ: r("Ref") },
+        { json: "register", js: "register", typ: r("Register") },
+        { json: "reinterpret_cast", js: "reinterpret_cast", typ: r("ReinterpretCast") },
+        { json: "repeat", js: "repeat", typ: r("Repeat") },
+        { json: "require", js: "require", typ: r("Require") },
+        { json: "required", js: "required", typ: r("Required") },
+        { json: "requires", js: "requires", typ: r("Requires") },
+        { json: "restrict", js: "restrict", typ: r("Restrict") },
+        { json: "retain", js: "retain", typ: r("Retain") },
+        { json: "rethrows", js: "rethrows", typ: r("Rethrows") },
+        { json: "return", js: "return", typ: r("Return") },
+        { json: "right", js: "right", typ: r("Right") },
+        { json: "s", js: "s", typ: r("S") },
+        { json: "sbyte", js: "sbyte", typ: r("Sbyte") },
+        { json: "sealed", js: "sealed", typ: r("Sealed") },
+        { json: "select", js: "select", typ: r("Select") },
+        { json: "self", js: "self", typ: r("SelfClass") },
+        { json: "serialize", js: "serialize", typ: r("Serialize") },
+        { json: "set", js: "set", typ: r("Set") },
+        { json: "short", js: "short", typ: r("Short") },
+        { json: "signed", js: "signed", typ: r("Signed") },
+        { json: "sizeof", js: "sizeof", typ: r("Sizeof") },
+        { json: "stackalloc", js: "stackalloc", typ: r("Stackalloc") },
+        { json: "static", js: "static", typ: r("Static") },
+        { json: "static_assert", js: "static_assert", typ: r("StaticAssert") },
+        { json: "static_cast", js: "static_cast", typ: r("StaticCast") },
+        { json: "strictfp", js: "strictfp", typ: r("Strictfp") },
+        { json: "string", js: "string", typ: r("String") },
+        { json: "struct", js: "struct", typ: r("Struct") },
+        { json: "subscript", js: "subscript", typ: r("Subscript") },
+        { json: "super", js: "super", typ: r("Super") },
+        { json: "switch", js: "switch", typ: r("Switch") },
+        { json: "symbol", js: "symbol", typ: r("Symbol") },
+        { json: "synchronized", js: "synchronized", typ: r("Synchronized") },
+        { json: "system", js: "system", typ: r("System") },
+        { json: "template", js: "template", typ: r("Template") },
+        { json: "then", js: "then", typ: r("Then") },
+        { json: "this", js: "this", typ: r("This") },
+        { json: "thread_local", js: "thread_local", typ: r("ThreadLocal") },
+        { json: "throw", js: "throw", typ: r("Throw") },
+        { json: "throws", js: "throws", typ: r("Throws") },
+        { json: "to_json", js: "to_json", typ: r("ToJSON") },
+        { json: "top_level", js: "top_level", typ: r("TopLevelClass") },
+        { json: "transient", js: "transient", typ: r("Transient") },
+        { json: "true", js: "true", typ: r("TrueClass") },
+        { json: "try", js: "try", typ: r("Try") },
+        { json: "type", js: "type", typ: r("TypeClass") },
+        { json: "typealias", js: "typealias", typ: r("Typealias") },
+        { json: "typedef", js: "typedef", typ: r("Typedef") },
+        { json: "typeid", js: "typeid", typ: r("Typeid") },
+        { json: "typename", js: "typename", typ: r("Typename") },
+        { json: "typeof", js: "typeof", typ: r("Typeof") },
+        { json: "uint", js: "uint", typ: r("Uint") },
+        { json: "ulong", js: "ulong", typ: r("Ulong") },
+        { json: "unchecked", js: "unchecked", typ: r("Unchecked") },
+        { json: "undefined", js: "undefined", typ: r("Undefined") },
+    ], false),
+    "Sel": o([
+        { json: "SEL", js: "SEL", typ: i(0) },
+    ], false),
+    "Self": o([
+        { json: "Self", js: "Self", typ: i(0) },
+    ], false),
+    "True": o([
+        { json: "True", js: "True", typ: i(0) },
+    ], false),
+    "Type": o([
+        { json: "Type", js: "Type", typ: i(0) },
+    ], false),
+    "Public": o([
+        { json: "public", js: "public", typ: i(0) },
+    ], false),
+    "Quicktype": o([
+        { json: "quicktype", js: "quicktype", typ: i(0) },
+    ], false),
+    "Raise": o([
+        { json: "raise", js: "raise", typ: i(0) },
+    ], false),
+    "Range": o([
+        { json: "range", js: "range", typ: i(0) },
+    ], false),
+    "Readonly": o([
+        { json: "readonly", js: "readonly", typ: i(0) },
+    ], false),
+    "Ref": o([
+        { json: "ref", js: "ref", typ: i(0) },
+    ], false),
+    "Register": o([
+        { json: "register", js: "register", typ: i(0) },
+    ], false),
+    "ReinterpretCast": o([
+        { json: "reinterpret_cast", js: "reinterpret_cast", typ: i(0) },
+    ], false),
+    "Repeat": o([
+        { json: "repeat", js: "repeat", typ: i(0) },
+    ], false),
+    "Require": o([
+        { json: "require", js: "require", typ: i(0) },
+    ], false),
+    "Required": o([
+        { json: "required", js: "required", typ: i(0) },
+    ], false),
+    "Requires": o([
+        { json: "requires", js: "requires", typ: i(0) },
+    ], false),
+    "Restrict": o([
+        { json: "restrict", js: "restrict", typ: i(0) },
+    ], false),
+    "Retain": o([
+        { json: "retain", js: "retain", typ: i(0) },
+    ], false),
+    "Rethrows": o([
+        { json: "rethrows", js: "rethrows", typ: i(0) },
+    ], false),
+    "Return": o([
+        { json: "return", js: "return", typ: i(0) },
+    ], false),
+    "Right": o([
+        { json: "right", js: "right", typ: i(0) },
+    ], false),
+    "S": o([
+        { json: "s", js: "s", typ: i(0) },
+    ], false),
+    "Sbyte": o([
+        { json: "sbyte", js: "sbyte", typ: i(0) },
+    ], false),
+    "Sealed": o([
+        { json: "sealed", js: "sealed", typ: i(0) },
+    ], false),
+    "Select": o([
+        { json: "select", js: "select", typ: i(0) },
+    ], false),
+    "SelfClass": o([
+        { json: "self", js: "self", typ: i(0) },
+    ], false),
+    "Serialize": o([
+        { json: "serialize", js: "serialize", typ: i(0) },
+    ], false),
+    "Set": o([
+        { json: "set", js: "set", typ: i(0) },
+    ], false),
+    "Short": o([
+        { json: "short", js: "short", typ: i(0) },
+    ], false),
+    "Signed": o([
+        { json: "signed", js: "signed", typ: i(0) },
+    ], false),
+    "Sizeof": o([
+        { json: "sizeof", js: "sizeof", typ: i(0) },
+    ], false),
+    "Stackalloc": o([
+        { json: "stackalloc", js: "stackalloc", typ: i(0) },
+    ], false),
+    "Static": o([
+        { json: "static", js: "static", typ: i(0) },
+    ], false),
+    "StaticAssert": o([
+        { json: "static_assert", js: "static_assert", typ: i(0) },
+    ], false),
+    "StaticCast": o([
+        { json: "static_cast", js: "static_cast", typ: i(0) },
+    ], false),
+    "Strictfp": o([
+        { json: "strictfp", js: "strictfp", typ: i(0) },
+    ], false),
+    "String": o([
+        { json: "string", js: "string", typ: i(0) },
+    ], false),
+    "Struct": o([
+        { json: "struct", js: "struct", typ: i(0) },
+    ], false),
+    "Subscript": o([
+        { json: "subscript", js: "subscript", typ: i(0) },
+    ], false),
+    "Super": o([
+        { json: "super", js: "super", typ: i(0) },
+    ], false),
+    "Switch": o([
+        { json: "switch", js: "switch", typ: i(0) },
+    ], false),
+    "Symbol": o([
+        { json: "symbol", js: "symbol", typ: i(0) },
+    ], false),
+    "Synchronized": o([
+        { json: "synchronized", js: "synchronized", typ: i(0) },
+    ], false),
+    "System": o([
+        { json: "system", js: "system", typ: i(0) },
+    ], false),
+    "Template": o([
+        { json: "template", js: "template", typ: i(0) },
+    ], false),
+    "Then": o([
+        { json: "then", js: "then", typ: i(0) },
+    ], false),
+    "This": o([
+        { json: "this", js: "this", typ: i(0) },
+    ], false),
+    "ThreadLocal": o([
+        { json: "thread_local", js: "thread_local", typ: i(0) },
+    ], false),
+    "Throw": o([
+        { json: "throw", js: "throw", typ: i(0) },
+    ], false),
+    "Throws": o([
+        { json: "throws", js: "throws", typ: i(0) },
+    ], false),
+    "ToJSON": o([
+        { json: "to_json", js: "to_json", typ: i(0) },
+    ], false),
+    "TopLevelClass": o([
+        { json: "top_level", js: "top_level", typ: i(0) },
+    ], false),
+    "Transient": o([
+        { json: "transient", js: "transient", typ: i(0) },
+    ], false),
+    "TrueClass": o([
+        { json: "true", js: "true", typ: i(0) },
+    ], false),
+    "Try": o([
+        { json: "try", js: "try", typ: i(0) },
+    ], false),
+    "TypeClass": o([
+        { json: "type", js: "type", typ: i(0) },
+    ], false),
+    "Typealias": o([
+        { json: "typealias", js: "typealias", typ: i(0) },
+    ], false),
+    "Typedef": o([
+        { json: "typedef", js: "typedef", typ: i(0) },
+    ], false),
+    "Typeid": o([
+        { json: "typeid", js: "typeid", typ: i(0) },
+    ], false),
+    "Typename": o([
+        { json: "typename", js: "typename", typ: i(0) },
+    ], false),
+    "Typeof": o([
+        { json: "typeof", js: "typeof", typ: i(0) },
+    ], false),
+    "Uint": o([
+        { json: "uint", js: "uint", typ: i(0) },
+    ], false),
+    "Ulong": o([
+        { json: "ulong", js: "ulong", typ: i(0) },
+    ], false),
+    "Unchecked": o([
+        { json: "unchecked", js: "unchecked", typ: i(0) },
+    ], false),
+    "Undefined": o([
+        { json: "undefined", js: "undefined", typ: i(0) },
+    ], false),
+    "Obj5": o([
+        { json: "YES", js: "YES", typ: r("Yes") },
+        { json: "dummy", js: "dummy", typ: i(0) },
+        { json: "union", js: "union", typ: r("Union") },
+        { json: "unowned", js: "unowned", typ: r("Unowned") },
+        { json: "unsafe", js: "unsafe", typ: r("Unsafe") },
+        { json: "unsigned", js: "unsigned", typ: r("Unsigned") },
+        { json: "ushort", js: "ushort", typ: r("Ushort") },
+        { json: "using", js: "using", typ: r("Using") },
+        { json: "var", js: "var", typ: r("Var") },
+        { json: "virtual", js: "virtual", typ: r("Virtual") },
+        { json: "void", js: "void", typ: r("Void") },
+        { json: "volatile", js: "volatile", typ: r("Volatile") },
+        { json: "wchar_t", js: "wchar_t", typ: r("WcharT") },
+        { json: "weak", js: "weak", typ: r("Weak") },
+        { json: "where", js: "where", typ: r("Where") },
+        { json: "while", js: "while", typ: r("While") },
+        { json: "willSet", js: "willSet", typ: r("WillSet") },
+        { json: "with", js: "with", typ: r("With") },
+        { json: "xor", js: "xor", typ: r("Xor") },
+        { json: "xor_eq", js: "xor_eq", typ: r("XorEq") },
+        { json: "yield", js: "yield", typ: r("Yield") },
+    ], false),
+    "Yes": o([
+        { json: "YES", js: "YES", typ: i(0) },
+    ], false),
+    "Union": o([
+        { json: "union", js: "union", typ: i(0) },
+    ], false),
+    "Unowned": o([
+        { json: "unowned", js: "unowned", typ: i(0) },
+    ], false),
+    "Unsafe": o([
+        { json: "unsafe", js: "unsafe", typ: i(0) },
+    ], false),
+    "Unsigned": o([
+        { json: "unsigned", js: "unsigned", typ: i(0) },
+    ], false),
+    "Ushort": o([
+        { json: "ushort", js: "ushort", typ: i(0) },
+    ], false),
+    "Using": o([
+        { json: "using", js: "using", typ: i(0) },
+    ], false),
+    "Var": o([
+        { json: "var", js: "var", typ: i(0) },
+    ], false),
+    "Virtual": o([
+        { json: "virtual", js: "virtual", typ: i(0) },
+    ], false),
+    "Void": o([
+        { json: "void", js: "void", typ: i(0) },
+    ], false),
+    "Volatile": o([
+        { json: "volatile", js: "volatile", typ: i(0) },
+    ], false),
+    "WcharT": o([
+        { json: "wchar_t", js: "wchar_t", typ: i(0) },
+    ], false),
+    "Weak": o([
+        { json: "weak", js: "weak", typ: i(0) },
+    ], false),
+    "Where": o([
+        { json: "where", js: "where", typ: i(0) },
+    ], false),
+    "While": o([
+        { json: "while", js: "while", typ: i(0) },
+    ], false),
+    "WillSet": o([
+        { json: "willSet", js: "willSet", typ: i(0) },
+    ], false),
+    "With": o([
+        { json: "with", js: "with", typ: i(0) },
+    ], false),
+    "Xor": o([
+        { json: "xor", js: "xor", typ: i(0) },
+    ], false),
+    "XorEq": o([
+        { json: "xor_eq", js: "xor_eq", typ: i(0) },
+    ], false),
+    "Yield": o([
+        { json: "yield", js: "yield", typ: i(0) },
+    ], false),
+};
diff --git a/head/typescript/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts b/head/typescript/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts
new file mode 100644
index 0000000..6d5268b
--- /dev/null
+++ b/head/typescript/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts
@@ -0,0 +1,210 @@
+// To parse this data:
+//
+//   import { Convert, TopLevel } from "./TopLevel";
+//
+//   const topLevel = Convert.toTopLevel(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export interface TopLevel {
+    "\u0000\u0001\u001b\u001f": string;
+    "\\u001b":                  string;
+    "\u007f\u0080\u0085\u009f": string;
+    "\ud83d\ude00":             string;
+}
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+export class Convert {
+    public static toTopLevel(json: string): TopLevel {
+        return cast(JSON.parse(json), r("TopLevel"));
+    }
+
+    public static topLevelToJson(value: TopLevel): string {
+        return JSON.stringify(uncast(value, r("TopLevel")), null, 2);
+    }
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
+    const prettyTyp = prettyTypeName(typ);
+    const parentText = parent ? ` on ${parent}` : '';
+    const keyText = key ? ` for key "${key}"` : '';
+    throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+    if (Array.isArray(typ)) {
+        if (typ.length === 2 && typ[0] === undefined) {
+            return `an optional ${prettyTypeName(typ[1])}`;
+        } else {
+            return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+        }
+    } else if (typeof typ === "object" && typ.literal !== undefined) {
+        return typ.literal;
+    } else {
+        return typeof typ;
+    }
+}
+
+function jsonToJSProps(typ: any): any {
+    if (typ.jsonToJS === undefined) {
+        const map: any = {};
+        typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+        typ.jsonToJS = map;
+    }
+    return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+    if (typ.jsToJSON === undefined) {
+        const map: any = {};
+        typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+        typ.jsToJSON = map;
+    }
+    return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+    function transformPrimitive(typ: string, val: any): any {
+        if (typeof typ === typeof val) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+
+    function transformUnion(typs: any[], val: any): any {
+        // val must validate against one typ in typs
+        const l = typs.length;
+        for (let i = 0; i < l; i++) {
+            const typ = typs[i];
+            try {
+                return transform(val, typ, getProps);
+            } catch (_) {}
+        }
+        return invalidValue(typs, val, key, parent);
+    }
+
+    function transformEnum(cases: string[], val: any): any {
+        if (cases.indexOf(val) !== -1) return val;
+        return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+    }
+
+    function transformArray(typ: any, val: any): any {
+        // val must be an array with no invalid elements
+        if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+
+        return val.map(el => transform(el, typ, getProps));
+    }
+
+    function transformDate(val: any): any {
+        if (val === null) {
+            return null;
+        }
+        const d = new Date(val);
+        if (isNaN(d.valueOf())) {
+            return invalidValue(l("Date"), val, key, parent);
+        }
+        return d;
+    }
+
+    function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+        if (val === null || typeof val !== "object" || Array.isArray(val)) {
+            return invalidValue(l(ref || "object"), val, key, parent);
+        }
+        const result: any = {};
+        Object.getOwnPropertyNames(props).forEach(key => {
+            const prop = props[key];
+            const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+            result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+        });
+        Object.getOwnPropertyNames(val).forEach(key => {
+            if (!Object.prototype.hasOwnProperty.call(props, key)) {
+                result[key] = transform(val[key], additional, getProps, key, ref);
+            }
+        });
+        return result;
+    }
+
+    if (typ === "any") return val;
+    if (typ === null) {
+        if (val === null) return val;
+        return invalidValue(typ, val, key, parent);
+    }
+    if (typ === false) return invalidValue(typ, val, key, parent);
+    let ref: any = undefined;
+    while (typeof typ === "object" && typ.ref !== undefined) {
+        ref = typ.ref;
+        typ = typeMap[typ.ref];
+    }
+    if (Array.isArray(typ)) return transformEnum(typ, val);
+    if (typeof typ === "object") {
+        return typ.hasOwnProperty("pattern")      ? typeof val === "string" && new RegExp(typ.pattern).test(val) ? val : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("string")       ? typeof val === "string" && (typ.min === undefined || val.length >= typ.min) && (typ.max === undefined || val.length <= typ.max) ? transform(val, typ.string, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("number")       ? typeof val === "number" && (typ.min === undefined || val >= typ.min) && (typ.max === undefined || val <= typ.max) ? transform(val, typ.number, getProps, key, parent) : invalidValue(typ, val, key, parent)
+            : typ.hasOwnProperty("integer")      ? typeof val === "number" && val % 1 === 0 ? val : invalidValue(l("integer"), val, key, parent)
+            : typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+            : typ.hasOwnProperty("arrayItems")    ? transformArray(typ.arrayItems, val)
+            : typ.hasOwnProperty("props")         ? transformObject(getProps(typ), typ.additional, val)
+            : invalidValue(typ, val, key, parent);
+    }
+    // Numbers can be parsed by Date but shouldn't be.
+    if (typ === Date && typeof val !== "number") return transformDate(val);
+    return transformPrimitive(typ, val);
+}
+
+function cast<T>(val: any, typ: any): T {
+    return transform(val, typ, jsonToJSProps);
+}
+
+function uncast<T>(val: T, typ: any): any {
+    return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+    return { literal: typ };
+}
+
+function a(typ: any) {
+    return { arrayItems: typ };
+}
+
+function i(typ: any) {
+    return { integer: typ };
+}
+
+function p(pattern: any) {
+    return { pattern };
+}
+
+function s(typ: any, min: any, max: any) {
+    return { string: typ, min, max };
+}
+
+function n(typ: any, min: any, max: any) {
+    return { number: typ, min, max };
+}
+
+function u(...typs: any[]) {
+    return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+    return { props, additional };
+}
+
+function m(additional: any) {
+    const props: any[] = [];
+    return { props, additional };
+}
+
+function r(name: string) {
+    return { ref: name };
+}
+
+const typeMap: any = {
+    "TopLevel": o([
+        { json: "\u0000\u0001\u001b\u001f", js: "\u0000\u0001\u001b\u001f", typ: "" },
+        { json: "\\u001b", js: "\\u001b", typ: "" },
+        { json: "\u007f\u0080\u0085\u009f", js: "\u007f\u0080\u0085\u009f", typ: "" },
+        { json: "\ud83d\ude00", js: "\ud83d\ude00", typ: "" },
+    ], false),
+};
diff --git a/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..f1fe8ed
--- /dev/null
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,332 @@
+import * as S from "effect/Schema";
+
+
+export class Interacinar extends S.Class<Interacinar>("Interacinar")({
+    "assapan": S.Number,
+    "benefactorship": S.Boolean,
+    "triseriatim": S.String,
+    "tubbing": S.Int,
+    "untrimmed": S.Null,
+}) {}
+
+export class HemocoeleClass extends S.Class<HemocoeleClass>("HemocoeleClass")({
+    "acrogamy": S.optional(S.Null),
+    "amelification": S.optional(S.Null),
+    "autobiographic": S.optional(S.Null),
+    "berat": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "disproportionably": S.optional(S.Null),
+    "erythrite": S.optional(S.Null),
+    "graphic": S.optional(S.Null),
+    "hepatological": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "incommensurably": S.optional(S.Null),
+    "misaffirm": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "pocketbook": S.optional(S.Null),
+    "sclerometric": S.optional(S.Null),
+    "stambouline": S.optional(S.Null),
+    "stickpin": S.optional(S.Null),
+    "tubulure": S.optional(S.Null),
+    "undelated": S.optional(S.Null),
+    "unsalt": S.optional(S.Null),
+    "untutelar": S.optional(S.Null),
+    "vagrant": S.optional(S.Null),
+    "Walt": S.optional(S.Null),
+}) {}
+
+export class FlagmakingClass extends S.Class<FlagmakingClass>("FlagmakingClass")({
+    "albarco": S.Null,
+    "Bunodonta": S.Null,
+    "hornify": S.Null,
+    "Hydrocorisae": S.Null,
+    "hypoglossus": S.Null,
+    "inexpiably": S.Null,
+    "ingratitude": S.Null,
+    "ladyfly": S.Null,
+    "medicament": S.Null,
+    "monogrammatic": S.Null,
+    "nobbut": S.Null,
+    "Notacanthidae": S.Null,
+    "polyplacophore": S.Null,
+    "proexercise": S.Null,
+    "protoplast": S.Null,
+    "puzzling": S.Null,
+    "splanchnoskeleton": S.Null,
+    "unloveliness": S.Null,
+    "unquarantined": S.Null,
+    "unrenounceable": S.Null,
+}) {}
+
+export class FenkClass extends S.Class<FenkClass>("FenkClass")({
+    "apoise": S.Null,
+    "astronomize": S.Null,
+    "cockhorse": S.Null,
+    "copular": S.Null,
+    "Dagomba": S.Null,
+    "draffy": S.Null,
+    "foreigner": S.Null,
+    "Guyandot": S.Null,
+    "neurogliosis": S.Null,
+    "osmious": S.Null,
+    "palpitate": S.Null,
+    "rebukeable": S.Null,
+    "Reinwardtia": S.Null,
+    "reservatory": S.Null,
+    "scalt": S.Null,
+    "scripturalize": S.Null,
+    "tintometer": S.Null,
+    "Tritoness": S.Null,
+    "undergrade": S.Null,
+    "undermountain": S.Null,
+}) {}
+
+export class FagginglyClass extends S.Class<FagginglyClass>("FagginglyClass")({
+    "abranchian": S.Null,
+    "aculeiform": S.Null,
+    "adiaphoristic": S.Null,
+    "adoptionism": S.Null,
+    "Anglic": S.Null,
+    "antrotomy": S.Null,
+    "coerciveness": S.Null,
+    "decorist": S.Null,
+    "duckhood": S.Null,
+    "Heteromeri": S.Null,
+    "hypochnose": S.Null,
+    "lochage": S.Null,
+    "melee": S.Null,
+    "nonconformitant": S.Null,
+    "Poinsettia": S.Null,
+    "putatively": S.Null,
+    "semivolatile": S.Null,
+    "soleas": S.Null,
+    "unfastenable": S.Null,
+    "unmillinered": S.Null,
+}) {}
+
+export class Encrust extends S.Class<Encrust>("Encrust")({
+    "comradely": S.Null,
+    "diacanthous": S.Null,
+    "feminineness": S.Null,
+    "gossamered": S.Null,
+    "Hibernia": S.Null,
+    "Hibiscus": S.Null,
+    "Lepidosauria": S.Null,
+    "lollingly": S.Null,
+    "manager": S.Null,
+    "mechanic": S.Null,
+    "overminuteness": S.Null,
+    "papelonne": S.Null,
+    "plebification": S.Null,
+    "pugmiller": S.Null,
+    "recoveror": S.Null,
+    "spermatoblastic": S.Null,
+    "Syllidae": S.Null,
+    "ungyved": S.Null,
+    "whirlabout": S.Null,
+    "woodenware": S.Null,
+}) {}
+
+export class DiaereseClass extends S.Class<DiaereseClass>("DiaereseClass")({
+    "Amoreuxia": S.Null,
+    "ani": S.Null,
+    "bernicle": S.Null,
+    "blackwasher": S.Null,
+    "blowhard": S.Null,
+    "broma": S.Null,
+    "closecross": S.Null,
+    "congregationalism": S.Null,
+    "grayly": S.Null,
+    "historically": S.Null,
+    "hoast": S.Null,
+    "irretentive": S.Null,
+    "parcener": S.Null,
+    "pedder": S.Null,
+    "pseudoanatomic": S.Null,
+    "rhizocarpian": S.Null,
+    "samel": S.Null,
+    "silker": S.Null,
+    "subdentated": S.Null,
+    "subobscure": S.Null,
+}) {}
+
+export class DeruralizeClass extends S.Class<DeruralizeClass>("DeruralizeClass")({
+    "bockerel": S.Null,
+    "boulder": S.Null,
+    "churrus": S.Null,
+    "counterdigged": S.Null,
+    "dialogite": S.Null,
+    "digenic": S.Null,
+    "dunbird": S.Null,
+    "ergatogyne": S.Null,
+    "fiendful": S.Null,
+    "jackrod": S.Null,
+    "Jehovistic": S.Null,
+    "Paninean": S.Null,
+    "panther": S.Null,
+    "placentigerous": S.Null,
+    "Romney": S.Null,
+    "sparm": S.Null,
+    "tocsin": S.Null,
+    "unnicked": S.Null,
+    "unstavable": S.Null,
+    "windfirm": S.Null,
+}) {}
+
+export class CredulityClass extends S.Class<CredulityClass>("CredulityClass")({
+    "ammonolytic": S.Null,
+    "bushmaster": S.Null,
+    "considering": S.Null,
+    "consuetudinary": S.Null,
+    "embarras": S.Null,
+    "fineness": S.Null,
+    "flaithship": S.Null,
+    "Flavia": S.Null,
+    "gruffly": S.Null,
+    "Hedychium": S.Null,
+    "leadwort": S.Null,
+    "overseriously": S.Null,
+    "parabola": S.Null,
+    "pectinatodenticulate": S.Null,
+    "Popean": S.Null,
+    "pornocrat": S.Null,
+    "quadrisect": S.Null,
+    "seriality": S.Null,
+    "vamphorn": S.Null,
+    "wharp": S.Null,
+}) {}
+
+export class CoadjustClass extends S.Class<CoadjustClass>("CoadjustClass")({
+    "amidosulphonal": S.optional(S.Null),
+    "Benny": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "ensnare": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "hybridizer": S.optional(S.Null),
+    "leastwise": S.optional(S.Null),
+    "lof": S.optional(S.Null),
+    "monkhood": S.optional(S.Null),
+    "Netherlandish": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "peonism": S.optional(S.Null),
+    "Phonelescope": S.optional(S.Null),
+    "porphyrogeniture": S.optional(S.Null),
+    "preindemnify": S.optional(S.Null),
+    "rosal": S.optional(S.Null),
+    "scalenous": S.optional(S.Null),
+    "scopine": S.optional(S.Null),
+    "Sedaceae": S.optional(S.Null),
+    "suberinize": S.optional(S.Null),
+    "symbiot": S.optional(S.Null),
+    "tablefellow": S.optional(S.Null),
+    "unchargeable": S.optional(S.Null),
+}) {}
+
+export class CimeliaClass extends S.Class<CimeliaClass>("CimeliaClass")({
+    "catharticalness": S.Number,
+    "Chirotherium": S.Int,
+    "disdiapason": S.String,
+    "homocerc": S.Boolean,
+    "nonbookish": S.Null,
+}) {}
+
+export class ChemotherapeuticClass extends S.Class<ChemotherapeuticClass>("ChemotherapeuticClass")({
+    "angioneurotic": S.optional(S.Null),
+    "availment": S.optional(S.Null),
+    "bladelet": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "caulis": S.optional(S.Null),
+    "chalcus": S.optional(S.Null),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "enteradenological": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "imporosity": S.optional(S.Null),
+    "insistently": S.optional(S.Null),
+    "intraparietal": S.optional(S.Null),
+    "ivied": S.optional(S.Null),
+    "Maureen": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "nostochine": S.optional(S.Null),
+    "nutcracker": S.optional(S.Null),
+    "ofttimes": S.optional(S.Null),
+    "phenocryst": S.optional(S.Null),
+    "precoincident": S.optional(S.Null),
+    "ramiferous": S.optional(S.Null),
+    "stagmometer": S.optional(S.Null),
+    "tetherball": S.optional(S.Null),
+    "unshy": S.optional(S.Null),
+}) {}
+
+export class CerographClass extends S.Class<CerographClass>("CerographClass")({
+    "apotropaion": S.Null,
+    "casuary": S.Null,
+    "creaker": S.Null,
+    "disqualification": S.Null,
+    "imperatorious": S.Null,
+    "impermeabilize": S.Null,
+    "metastoma": S.Null,
+    "noctidiurnal": S.Null,
+    "nonreserve": S.Null,
+    "ophthalmotonometry": S.Null,
+    "pailful": S.Null,
+    "pigfish": S.Null,
+    "pongee": S.Null,
+    "prosodical": S.Null,
+    "scrofuloderm": S.Null,
+    "storekeeping": S.Null,
+    "therologist": S.Null,
+    "Tolowa": S.Null,
+    "tradeful": S.Null,
+    "unriveting": S.Null,
+}) {}
+
+export class TopLevel extends S.Class<TopLevel>("TopLevel")({
+    "centrodesmose": S.String,
+    "cerograph": S.Array(S.Union(S.String, CerographClass, S.Null)),
+    "chemotherapeutics": S.Array(S.Union(S.Int, ChemotherapeuticClass)),
+    "cimelia": S.Array(S.Union(S.Array(S.Int), CimeliaClass, S.Null)),
+    "citrated": S.Int,
+    "clinodome": S.Array(S.Union(S.Number, S.String)),
+    "coadjust": S.Array(S.Union(S.Number, CoadjustClass)),
+    "consilience": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "constructor": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "continuative": S.Array(S.Union(S.Record({ key: S.String, value: S.Int}), S.String)),
+    "credulity": S.Array(S.Union(S.Int, S.String, CredulityClass)),
+    "creviced": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "cubiculum": S.Array(S.Array(S.NullOr(S.Int))),
+    "deruralize": S.Array(S.Union(S.Array(S.Null), S.Boolean, DeruralizeClass)),
+    "diaereses": S.Array(S.Union(S.Array(S.Int), S.Boolean, DiaereseClass)),
+    "dissolution": S.Array(S.NullOr(S.Array(S.Null))),
+    "downstroke": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.String)),
+    "electrotautomerism": S.Array(S.NullOr(S.Number)),
+    "eleutheromania": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "encrust": Encrust,
+    "entomoid": S.Array(S.Union(S.Int, CimeliaClass)),
+    "epipaleolithic": S.Array(S.Union(S.Array(S.Int), S.Number)),
+    "expropriable": S.Array(S.Union(S.Array(S.Null), S.Number, CimeliaClass)),
+    "faggingly": S.Array(S.Union(S.Number, FagginglyClass)),
+    "fenks": S.Array(S.Union(S.String, FenkClass)),
+    "flagmaking": S.Array(S.Union(S.Boolean, S.Number, FlagmakingClass)),
+    "fluorometer": S.Array(S.Union(S.Int, S.String, S.Null)),
+    "fulsome": S.Array(S.NullOr(S.Int)),
+    "fuzzy": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "gardenwards": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.String)),
+    "generalissimo": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "habeas": S.Array(S.NullOr(S.Record({ key: S.String, value: S.Int}))),
+    "hemicrystalline": S.Array(S.Union(S.String, CimeliaClass)),
+    "hemocoele": S.Array(S.Union(S.Array(S.Int), HemocoeleClass)),
+    "hoister": S.Array(S.Union(S.String, CimeliaClass, S.Null)),
+    "hyperpiesis": S.Array(S.Union(S.Array(S.Null), CimeliaClass, S.Null)),
+    "hyppish": S.Array(S.Union(S.Boolean, S.String, S.Null)),
+    "idealizer": S.Array(S.Union(S.Array(S.Null), S.Int, CimeliaClass)),
+    "incrustator": S.Array(S.Union(S.Array(S.Int), S.Int, S.String)),
+    "intentiveness": S.Array(S.Union(S.Number, S.String, CimeliaClass)),
+    "interacinar": Interacinar,
+    "intercorrelation": S.Array(S.NullOr(S.Array(S.Int))),
+    "jacutinga": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+}) {}
diff --git a/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..659fe2e
--- /dev/null
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,280 @@
+import * as S from "effect/Schema";
+
+
+export class OskarClass extends S.Class<OskarClass>("OskarClass")({
+    "Acrobates": S.Null,
+    "beanshooter": S.Null,
+    "bearhound": S.Null,
+    "Cayuga": S.Null,
+    "guarneri": S.Null,
+    "hypochondriacism": S.Null,
+    "indication": S.Null,
+    "jaculative": S.Null,
+    "nagana": S.Null,
+    "Netherlandish": S.Null,
+    "noctivagous": S.Null,
+    "nonphysiological": S.Null,
+    "praxis": S.Null,
+    "provision": S.Null,
+    "subterhuman": S.Null,
+    "sunlit": S.Null,
+    "syncraniate": S.Null,
+    "teachment": S.Null,
+    "unmutinous": S.Null,
+    "unstoppable": S.Null,
+}) {}
+
+export class LaviniaClass extends S.Class<LaviniaClass>("LaviniaClass")({
+    "agitable": S.optional(S.NullOr(S.Int)),
+    "asininity": S.optional(S.NullOr(S.Int)),
+    "benefiter": S.optional(S.NullOr(S.Int)),
+    "bronzelike": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "cholesteatomatous": S.optional(S.NullOr(S.Int)),
+    "deprivement": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "flippantness": S.optional(S.NullOr(S.Int)),
+    "fogproof": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "merrymeeting": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "overcareful": S.optional(S.NullOr(S.Int)),
+    "panaris": S.optional(S.NullOr(S.Int)),
+    "preacceptance": S.optional(S.NullOr(S.Int)),
+    "quinoxaline": S.optional(S.NullOr(S.Int)),
+    "sig": S.optional(S.NullOr(S.Int)),
+    "superconfusion": S.optional(S.NullOr(S.Int)),
+    "Tacana": S.optional(S.NullOr(S.Int)),
+    "tillotter": S.optional(S.NullOr(S.Int)),
+    "tranquillize": S.optional(S.NullOr(S.Int)),
+    "unquestionable": S.optional(S.NullOr(S.Int)),
+    "uproute": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class GryphosaurusClass extends S.Class<GryphosaurusClass>("GryphosaurusClass")({
+    "amissibility": S.Null,
+    "Burushaski": S.Null,
+    "citronin": S.Null,
+    "coplaintiff": S.Null,
+    "disquisitionary": S.Null,
+    "enoplan": S.Null,
+    "faintness": S.Null,
+    "hebetomy": S.Null,
+    "islandry": S.Null,
+    "lameduck": S.Null,
+    "overbattle": S.Null,
+    "overinterested": S.Null,
+    "phrenologic": S.Null,
+    "rainband": S.Null,
+    "shiningly": S.Null,
+    "stamineous": S.Null,
+    "subscapularis": S.Null,
+    "Tahami": S.Null,
+    "undaubed": S.Null,
+    "underntime": S.Null,
+}) {}
+
+export class DiscordiaClass extends S.Class<DiscordiaClass>("DiscordiaClass")({
+    "Altaic": S.optional(S.NullOr(S.Int)),
+    "amoristic": S.optional(S.NullOr(S.Int)),
+    "blennophthalmia": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "disciplinability": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "goofer": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "laryngograph": S.optional(S.NullOr(S.Int)),
+    "leucitis": S.optional(S.NullOr(S.Int)),
+    "lymphocyst": S.optional(S.NullOr(S.Int)),
+    "microcosmology": S.optional(S.NullOr(S.Int)),
+    "nauseation": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "Patarin": S.optional(S.NullOr(S.Int)),
+    "preliberal": S.optional(S.NullOr(S.Int)),
+    "prettifier": S.optional(S.NullOr(S.Int)),
+    "rangework": S.optional(S.NullOr(S.Int)),
+    "redient": S.optional(S.NullOr(S.Int)),
+    "subfusiform": S.optional(S.NullOr(S.Int)),
+    "suicidical": S.optional(S.NullOr(S.Int)),
+    "swow": S.optional(S.NullOr(S.Int)),
+    "wastrel": S.optional(S.NullOr(S.Int)),
+    "wingle": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class ChytridiaceaeClass extends S.Class<ChytridiaceaeClass>("ChytridiaceaeClass")({
+    "Batidaceae": S.Null,
+    "Brechites": S.Null,
+    "codespairer": S.Null,
+    "Emery": S.Null,
+    "enervative": S.Null,
+    "excriminate": S.Null,
+    "goshenite": S.Null,
+    "grime": S.Null,
+    "gritten": S.Null,
+    "hectorly": S.Null,
+    "intermediation": S.Null,
+    "meeterly": S.Null,
+    "Narraganset": S.Null,
+    "onymatic": S.Null,
+    "paddlecock": S.Null,
+    "thana": S.Null,
+    "thornily": S.Null,
+    "uckia": S.Null,
+    "unmettle": S.Null,
+    "vorticellid": S.Null,
+}) {}
+
+export class AnsarieClass extends S.Class<AnsarieClass>("AnsarieClass")({
+    "accension": S.Null,
+    "Alida": S.Null,
+    "asteria": S.Null,
+    "beriberic": S.Null,
+    "edgebone": S.Null,
+    "gastrodialysis": S.Null,
+    "geographic": S.Null,
+    "Ictonyx": S.Null,
+    "metrocele": S.Null,
+    "misgraft": S.Null,
+    "monteith": S.Null,
+    "notcher": S.Null,
+    "prorestriction": S.Null,
+    "Ramist": S.Null,
+    "throatlet": S.Null,
+    "unfair": S.Null,
+    "unsynonymous": S.Null,
+    "water": S.Null,
+    "zestfully": S.Null,
+    "zincic": S.Null,
+}) {}
+
+export class AnkeeClass extends S.Class<AnkeeClass>("AnkeeClass")({
+    "Anomoean": S.Null,
+    "barleyhood": S.Null,
+    "befriender": S.Null,
+    "brutishness": S.Null,
+    "cephalalgy": S.Null,
+    "cirurgian": S.Null,
+    "conventionally": S.Null,
+    "jackshay": S.Null,
+    "milammeter": S.Null,
+    "Naja": S.Null,
+    "ombrological": S.Null,
+    "phonasthenia": S.Null,
+    "retrievableness": S.Null,
+    "snakily": S.Null,
+    "swot": S.Null,
+    "tartlet": S.Null,
+    "thiofuran": S.Null,
+    "tracheophone": S.Null,
+    "tuglike": S.Null,
+    "unscratchingly": S.Null,
+}) {}
+
+export class Amphithyron extends S.Class<Amphithyron>("Amphithyron")({
+    "akroasis": S.optional(S.NullOr(S.Int)),
+    "antiphonical": S.optional(S.NullOr(S.Int)),
+    "basebred": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "conductometric": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "ensilation": S.optional(S.NullOr(S.Int)),
+    "eyebolt": S.optional(S.NullOr(S.Int)),
+    "fistulated": S.optional(S.NullOr(S.Int)),
+    "heteropod": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "Juniperus": S.optional(S.NullOr(S.Int)),
+    "labyrinthically": S.optional(S.NullOr(S.Int)),
+    "martyrization": S.optional(S.NullOr(S.Int)),
+    "mispolicy": S.optional(S.NullOr(S.Int)),
+    "multipara": S.optional(S.NullOr(S.Int)),
+    "Nazirite": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "possessorial": S.optional(S.NullOr(S.Int)),
+    "shamed": S.optional(S.NullOr(S.Int)),
+    "shelfworn": S.optional(S.NullOr(S.Int)),
+    "stagnum": S.optional(S.NullOr(S.Int)),
+    "Those": S.optional(S.NullOr(S.Int)),
+    "undecimal": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class Rebecca extends S.Class<Rebecca>("Rebecca")({
+    "catharticalness": S.Number,
+    "Chirotherium": S.Int,
+    "disdiapason": S.String,
+    "homocerc": S.Boolean,
+    "nonbookish": S.Null,
+}) {}
+
+export class AlleviateClass extends S.Class<AlleviateClass>("AlleviateClass")({
+    "apriori": S.Null,
+    "beggarer": S.Null,
+    "brokenheartedly": S.Null,
+    "debilitation": S.Null,
+    "frike": S.Null,
+    "gastrolith": S.Null,
+    "Hulsean": S.Null,
+    "orthocentric": S.Null,
+    "petaly": S.Null,
+    "probudgeting": S.Null,
+    "reacquire": S.Null,
+    "scow": S.Null,
+    "shutoff": S.Null,
+    "subcontiguous": S.Null,
+    "suffumigate": S.Null,
+    "transformable": S.Null,
+    "uncoroneted": S.Null,
+    "unparking": S.Null,
+    "unvarnishedness": S.Null,
+    "wherewithal": S.Null,
+}) {}
+
+export class TopLevel extends S.Class<TopLevel>("TopLevel")({
+    "Abranchiata": S.Array(S.Union(S.Array(S.Int), S.Int, S.Null)),
+    "academe": S.Array(S.Union(S.Array(S.Int), S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "acquirable": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.Record({ key: S.String, value: S.Int}))),
+    "aerometry": S.Array(S.Union(S.Boolean, S.Number)),
+    "alexin": S.Array(S.Union(S.Array(S.Int), S.Boolean)),
+    "alleviate": S.Array(S.Union(S.Array(S.NullOr(S.Int)), AlleviateClass)),
+    "amaas": S.Array(S.Union(S.Boolean, S.Int, Rebecca)),
+    "ambassage": S.Array(S.Union(S.Array(S.Null), S.String)),
+    "amphithyron": S.Array(S.NullOr(Amphithyron)),
+    "Andriana": S.Array(S.NullOr(S.String)),
+    "ankee": S.Array(S.Union(S.Array(S.Int), S.Int, AnkeeClass)),
+    "annihilator": S.Array(S.NullOr(S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "annulose": S.Null,
+    "Ansarie": S.Array(S.Union(S.Array(S.Int), AnsarieClass, S.Null)),
+    "aphasia": S.Array(S.Union(S.Array(S.Int), S.Int)),
+    "asprawl": S.Array(S.Union(S.Number, S.String)),
+    "attractive": S.Array(S.NullOr(S.Boolean)),
+    "barksome": S.Record({ key: S.String, value: S.Int}),
+    "bedesman": S.Array(S.Union(S.Boolean, S.Number, S.String)),
+    "belard": S.Array(S.Union(S.Array(S.Int), S.Number, Rebecca)),
+    "bocking": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Record({ key: S.String, value: S.Int}))),
+    "brawlingly": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "brookie": S.Array(S.Union(S.Array(S.Int), Rebecca)),
+    "bumboatman": S.Array(S.Union(S.Array(S.Null), S.String, S.Null)),
+    "bystreet": S.Array(S.Null),
+    "calaverite": S.Array(S.Union(S.Array(S.Int), S.String)),
+    "catallactic": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Record({ key: S.String, value: S.Int}))),
+    "cemental": S.Array(S.Union(S.Array(S.Int), S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "Chytridiaceae": S.Array(S.Union(S.Boolean, ChytridiaceaeClass, S.Null)),
+    "Discordia": S.Array(S.Union(S.Array(S.Int), DiscordiaClass)),
+    "Endomyces": S.Array(S.Union(S.Int, S.String)),
+    "Epinephelidae": S.Array(S.Union(S.Boolean, S.Int, S.String)),
+    "Eupatorium": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}))),
+    "Gryphosaurus": S.Array(S.Union(S.Array(S.Int), S.String, GryphosaurusClass)),
+    "Koryak": S.Array(S.Union(S.Record({ key: S.String, value: S.NullOr(S.Int)}), S.String)),
+    "Lavinia": S.Array(S.Union(S.String, LaviniaClass)),
+    "Oskar": S.Array(S.Union(S.Array(S.Int), OskarClass)),
+    "Rebecca": S.Array(S.Union(S.Int, S.String, Rebecca)),
+    "Rhomboganoidei": S.Array(S.Union(S.Array(S.Int), S.String, Rebecca)),
+    "Rigsmal": S.Boolean,
+    "Ruellia": S.Array(S.Union(S.Boolean, S.String, Rebecca)),
+    "School": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "Shakespearolater": S.Array(S.Union(S.Array(S.Int), S.Number, S.String)),
+    "Svan": S.Array(S.Number),
+    "Wayao": S.Record({ key: S.String, value: S.Number}),
+}) {}
diff --git a/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..02be4a5
--- /dev/null
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,384 @@
+import * as S from "effect/Schema";
+
+
+export class PrefreshmanClass extends S.Class<PrefreshmanClass>("PrefreshmanClass")({
+    "azorubine": S.Null,
+    "choroiditis": S.Null,
+    "coagulatory": S.Null,
+    "cyclorama": S.Null,
+    "Dolphus": S.Null,
+    "duckhearted": S.Null,
+    "Ficus": S.Null,
+    "Gemaric": S.Null,
+    "jugation": S.Null,
+    "myoliposis": S.Null,
+    "nonnomination": S.Null,
+    "palay": S.Null,
+    "pentactinal": S.Null,
+    "Phaet": S.Null,
+    "piquant": S.Null,
+    "registration": S.Null,
+    "remancipation": S.Null,
+    "scutatiform": S.Null,
+    "theodolite": S.Null,
+    "underward": S.Null,
+}) {}
+
+export class PotwhiskyClass extends S.Class<PotwhiskyClass>("PotwhiskyClass")({
+    "arciform": S.Null,
+    "cresolin": S.Null,
+    "disheartener": S.Null,
+    "disproportionable": S.Null,
+    "Euchorda": S.Null,
+    "ferryway": S.Null,
+    "filamentiferous": S.Null,
+    "flemish": S.Null,
+    "forgainst": S.Null,
+    "grainering": S.Null,
+    "irrevoluble": S.Null,
+    "kindredship": S.Null,
+    "pinguitudinous": S.Null,
+    "simpletonic": S.Null,
+    "singsong": S.Null,
+    "submergement": S.Null,
+    "supraoesophagal": S.Null,
+    "thrashel": S.Null,
+    "tyremesis": S.Null,
+    "Yoruba": S.Null,
+}) {}
+
+export class Pneumocele extends S.Class<Pneumocele>("Pneumocele")({
+    "Carbonarism": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "cineolic": S.optional(S.Null),
+    "cobbly": S.optional(S.Null),
+    "conchyliferous": S.optional(S.Null),
+    "congregation": S.optional(S.Null),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "enterotomy": S.optional(S.Null),
+    "entophytal": S.optional(S.Null),
+    "fewtrils": S.optional(S.Null),
+    "herem": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "Koniga": S.optional(S.Null),
+    "meticulosity": S.optional(S.Null),
+    "Micky": S.optional(S.Null),
+    "mismarriage": S.optional(S.Null),
+    "neurotrophic": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "persuasively": S.optional(S.Null),
+    "replaceable": S.optional(S.Null),
+    "silex": S.optional(S.Null),
+    "taillight": S.optional(S.Null),
+    "unjealous": S.optional(S.Null),
+    "visitorial": S.optional(S.Null),
+}) {}
+
+export class PiaculumClass extends S.Class<PiaculumClass>("PiaculumClass")({
+    "alada": S.optional(S.NullOr(S.Int)),
+    "amphistomous": S.optional(S.NullOr(S.Int)),
+    "boysenberry": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "decardinalize": S.optional(S.NullOr(S.Int)),
+    "discouragement": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "doitrified": S.optional(S.NullOr(S.Int)),
+    "hexaspermous": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "insinking": S.optional(S.NullOr(S.Int)),
+    "loathfulness": S.optional(S.NullOr(S.Int)),
+    "miasmatical": S.optional(S.NullOr(S.Int)),
+    "neurofibril": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "phonendoscope": S.optional(S.NullOr(S.Int)),
+    "pilferment": S.optional(S.NullOr(S.Int)),
+    "predismissory": S.optional(S.NullOr(S.Int)),
+    "preinscription": S.optional(S.NullOr(S.Int)),
+    "quotative": S.optional(S.NullOr(S.Int)),
+    "sienna": S.optional(S.NullOr(S.Int)),
+    "thorax": S.optional(S.NullOr(S.Int)),
+    "yachting": S.optional(S.NullOr(S.Int)),
+    "Zipper": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class OutrivalClass extends S.Class<OutrivalClass>("OutrivalClass")({
+    "adroitly": S.Null,
+    "bridehood": S.Null,
+    "Castoroides": S.Null,
+    "Czechoslovak": S.Null,
+    "diagenesis": S.Null,
+    "dihexahedron": S.Null,
+    "dopester": S.Null,
+    "eumerism": S.Null,
+    "flyness": S.Null,
+    "fouler": S.Null,
+    "laudanosine": S.Null,
+    "Lingulidae": S.Null,
+    "minutary": S.Null,
+    "mitra": S.Null,
+    "opisthorchiasis": S.Null,
+    "pensively": S.Null,
+    "pubigerous": S.Null,
+    "rebellious": S.Null,
+    "recodify": S.Null,
+    "unpaced": S.Null,
+}) {}
+
+export class OccupationalistClass extends S.Class<OccupationalistClass>("OccupationalistClass")({
+    "beholdable": S.Null,
+    "brotuliform": S.Null,
+    "Chimakum": S.Null,
+    "doodler": S.Null,
+    "emulsin": S.Null,
+    "Fin": S.Null,
+    "flourishing": S.Null,
+    "flueless": S.Null,
+    "furtively": S.Null,
+    "gritter": S.Null,
+    "interwish": S.Null,
+    "monoxylic": S.Null,
+    "myristic": S.Null,
+    "nightwear": S.Null,
+    "peruser": S.Null,
+    "theoastrological": S.Null,
+    "thumby": S.Null,
+    "tingitid": S.Null,
+    "trailless": S.Null,
+    "unpocketed": S.Null,
+}) {}
+
+export class Noncontributing extends S.Class<Noncontributing>("Noncontributing")({
+    "estevin": S.String,
+    "jolterhead": S.Number,
+    "sauternes": S.Int,
+    "sparsely": S.Boolean,
+    "unrequested": S.Null,
+}) {}
+
+export class MonotheisticallyClass extends S.Class<MonotheisticallyClass>("MonotheisticallyClass")({
+    "blaspheme": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "celiosalpingectomy": S.optional(S.Null),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "consummativeness": S.optional(S.Null),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "egestive": S.optional(S.Null),
+    "enchylema": S.optional(S.Null),
+    "gasconade": S.optional(S.Null),
+    "holidayer": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "intuitionalism": S.optional(S.Null),
+    "lophiostomate": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "nonvolition": S.optional(S.Null),
+    "palatableness": S.optional(S.Null),
+    "pimpery": S.optional(S.Null),
+    "previolation": S.optional(S.Null),
+    "reconveyance": S.optional(S.Null),
+    "registership": S.optional(S.Null),
+    "rhyacolite": S.optional(S.Null),
+    "smithereens": S.optional(S.Null),
+    "superedification": S.optional(S.Null),
+    "trust": S.optional(S.Null),
+    "whitestone": S.optional(S.Null),
+}) {}
+
+export class MonaziteClass extends S.Class<MonaziteClass>("MonaziteClass")({
+    "catharticalness": S.Number,
+    "Chirotherium": S.Int,
+    "disdiapason": S.String,
+    "homocerc": S.Boolean,
+    "nonbookish": S.Null,
+}) {}
+
+export class Maslin extends S.Class<Maslin>("Maslin")({
+    "Alicant": S.optional(S.NullOr(S.Int)),
+    "antiatonement": S.optional(S.Null),
+    "anticorrosive": S.optional(S.NullOr(S.Int)),
+    "aphidozer": S.optional(S.Null),
+    "Bakuninist": S.optional(S.Null),
+    "be": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "chub": S.optional(S.NullOr(S.Int)),
+    "cuprosilicon": S.optional(S.NullOr(S.Int)),
+    "curtailedly": S.optional(S.NullOr(S.Int)),
+    "dellenite": S.optional(S.NullOr(S.Int)),
+    "Dimitry": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "edifying": S.optional(S.Null),
+    "ethmoiditis": S.optional(S.NullOr(S.Int)),
+    "gastralgy": S.optional(S.Null),
+    "goatherd": S.optional(S.NullOr(S.Int)),
+    "hammerdress": S.optional(S.NullOr(S.Int)),
+    "hangfire": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "lacunosity": S.optional(S.NullOr(S.Int)),
+    "longiloquence": S.optional(S.Null),
+    "mameliere": S.optional(S.NullOr(S.Int)),
+    "motherless": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "noncorrodible": S.optional(S.Null),
+    "nonsensicality": S.optional(S.Null),
+    "oafishly": S.optional(S.NullOr(S.Int)),
+    "pfund": S.optional(S.Null),
+    "preadvisory": S.optional(S.Null),
+    "retroflexed": S.optional(S.Null),
+    "saccharulmic": S.optional(S.NullOr(S.Int)),
+    "scowlful": S.optional(S.NullOr(S.Int)),
+    "secluded": S.optional(S.Null),
+    "slackage": S.optional(S.Null),
+    "sphaeridial": S.optional(S.NullOr(S.Int)),
+    "spondulics": S.optional(S.Null),
+    "subsecive": S.optional(S.NullOr(S.Int)),
+    "swellmobsman": S.optional(S.Null),
+    "trachyglossate": S.optional(S.NullOr(S.Int)),
+    "trialogue": S.optional(S.Null),
+    "unassuaged": S.optional(S.NullOr(S.Int)),
+    "ungross": S.optional(S.Null),
+    "unjudiciously": S.optional(S.Null),
+}) {}
+
+export class LupusClass extends S.Class<LupusClass>("LupusClass")({
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "Chlorioninae": S.optional(S.NullOr(S.Int)),
+    "Corvinae": S.optional(S.NullOr(S.Int)),
+    "Crassina": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "exiguity": S.optional(S.NullOr(S.Int)),
+    "farcist": S.optional(S.NullOr(S.Int)),
+    "holographical": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "ichthyophagan": S.optional(S.NullOr(S.Int)),
+    "implacable": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "outshiner": S.optional(S.NullOr(S.Int)),
+    "overweather": S.optional(S.NullOr(S.Int)),
+    "protonegroid": S.optional(S.NullOr(S.Int)),
+    "shallowish": S.optional(S.NullOr(S.Int)),
+    "snoke": S.optional(S.NullOr(S.Int)),
+    "snout": S.optional(S.NullOr(S.Int)),
+    "surveillance": S.optional(S.NullOr(S.Int)),
+    "threshingtime": S.optional(S.NullOr(S.Int)),
+    "Thysanocarpus": S.optional(S.NullOr(S.Int)),
+    "unsignificantly": S.optional(S.NullOr(S.Int)),
+    "unsnap": S.optional(S.NullOr(S.Int)),
+    "vendible": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class LandlubberlyClass extends S.Class<LandlubberlyClass>("LandlubberlyClass")({
+    "acropoleis": S.Null,
+    "aminate": S.Null,
+    "Amyraldism": S.Null,
+    "bipenniform": S.Null,
+    "bugre": S.Null,
+    "calycule": S.Null,
+    "caoutchouc": S.Null,
+    "disprover": S.Null,
+    "fitroot": S.Null,
+    "fulgently": S.Null,
+    "kickup": S.Null,
+    "laevoversion": S.Null,
+    "moter": S.Null,
+    "objectivity": S.Null,
+    "posterity": S.Null,
+    "postnuptial": S.Null,
+    "precedentary": S.Null,
+    "saddling": S.Null,
+    "subcurrent": S.Null,
+    "unrecriminative": S.Null,
+}) {}
+
+export class LadronismClass extends S.Class<LadronismClass>("LadronismClass")({
+    "acclaimer": S.Null,
+    "achree": S.Null,
+    "base": S.Null,
+    "conundrumize": S.Null,
+    "degerminator": S.Null,
+    "describable": S.Null,
+    "exasperatedly": S.Null,
+    "heroine": S.Null,
+    "indazin": S.Null,
+    "luteous": S.Null,
+    "papular": S.Null,
+    "pritch": S.Null,
+    "Prodenia": S.Null,
+    "seege": S.Null,
+    "shopgirl": S.Null,
+    "tragedietta": S.Null,
+    "unsparse": S.Null,
+    "uplook": S.Null,
+    "vermiformis": S.Null,
+    "whafabout": S.Null,
+}) {}
+
+export class JurorClass extends S.Class<JurorClass>("JurorClass")({
+    "adipsy": S.Null,
+    "auxiliator": S.Null,
+    "benda": S.Null,
+    "benjamin": S.Null,
+    "brandling": S.Null,
+    "epicurishly": S.Null,
+    "eremochaetous": S.Null,
+    "marten": S.Null,
+    "monocline": S.Null,
+    "Olea": S.Null,
+    "palgat": S.Null,
+    "pennyworth": S.Null,
+    "pioury": S.Null,
+    "pragmatistic": S.Null,
+    "stylelessness": S.Null,
+    "systematical": S.Null,
+    "thready": S.Null,
+    "uncontemporary": S.Null,
+    "uncouched": S.Null,
+    "uninhabitedness": S.Null,
+}) {}
+
+export class TopLevel extends S.Class<TopLevel>("TopLevel")({
+    "juror": S.Array(S.Union(S.Boolean, JurorClass)),
+    "kongoni": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}))),
+    "ladronism": S.Array(S.Union(S.Number, S.String, LadronismClass)),
+    "landlubberly": S.Array(S.Union(S.Boolean, S.Int, LandlubberlyClass)),
+    "listener": S.Array(S.Union(S.Array(S.Null), S.Int)),
+    "lupus": S.Array(S.Union(S.Int, LupusClass)),
+    "maslin": S.Array(Maslin),
+    "monazite": S.Array(S.Union(S.Number, MonaziteClass)),
+    "monoliteral": S.Array(S.Union(S.Array(S.Null), S.Boolean)),
+    "monotheistically": S.Array(S.Union(S.Array(S.Null), MonotheisticallyClass)),
+    "montage": S.Array(S.Union(S.Array(S.Null), S.Number, S.String)),
+    "moralness": S.Array(S.Union(S.Array(S.Null), S.Number, S.Null)),
+    "mowra": S.Array(S.NullOr(MonaziteClass)),
+    "mulishly": S.Array(S.Union(S.Array(S.Int), S.Number, S.Null)),
+    "myoscope": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Int)),
+    "nach": S.Array(S.NullOr(S.Array(S.NullOr(S.Int)))),
+    "neuromastic": S.Array(S.Union(S.Array(S.Null), S.Number)),
+    "noncontributing": S.Array(Noncontributing),
+    "nonnervous": S.Array(S.Union(S.Boolean, S.Int)),
+    "nonvaluation": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Number)),
+    "occupationalist": S.Array(S.Union(S.Array(S.Null), OccupationalistClass, S.Null)),
+    "outrival": S.Array(S.Union(S.Number, OutrivalClass, S.Null)),
+    "paleographically": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.NullOr(S.Int)}))),
+    "pamphletwise": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}), S.String)),
+    "pediatrics": S.Array(S.Union(S.Boolean, S.Number, S.Null)),
+    "perceptive": S.Array(S.Boolean),
+    "piaculum": S.Array(S.Union(S.Number, PiaculumClass)),
+    "piccadilly": S.Array(S.Union(S.Number, S.String, S.Null)),
+    "piffler": S.Array(S.Union(S.Array(S.Null), MonaziteClass)),
+    "pithful": S.Array(S.Union(S.Boolean, S.Int, S.Null)),
+    "placuntitis": S.Array(S.Union(S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "plectopterous": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "pneumocele": S.Array(S.NullOr(Pneumocele)),
+    "poliorcetic": S.Array(S.Union(S.Boolean, MonaziteClass)),
+    "poormaster": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "potwhisky": S.Array(S.Union(S.Int, PotwhiskyClass, S.Null)),
+    "practicalizer": S.Array(S.Union(S.Array(S.Null), S.String, MonaziteClass)),
+    "prefreshman": S.Array(S.Union(S.Array(S.Null), S.String, PrefreshmanClass)),
+    "prehensility": S.Array(S.Union(S.Array(S.Null), S.Boolean, MonaziteClass)),
+    "prevoidance": S.Array(S.Union(S.Array(S.Int), S.Int, MonaziteClass)),
+    "probant": S.Array(S.Record({ key: S.String, value: S.NullOr(S.Int)})),
+    "protext": S.Array(S.Union(S.Array(S.Int), S.Boolean, MonaziteClass)),
+}) {}
diff --git a/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..3a1909c
--- /dev/null
+++ b/head/typescript-effect-schema/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,440 @@
+import * as S from "effect/Schema";
+
+
+export class WrothyClass extends S.Class<WrothyClass>("WrothyClass")({
+    "Aeschynanthus": S.Null,
+    "aquiferous": S.Null,
+    "cheapener": S.Null,
+    "enumeration": S.Null,
+    "Ephesine": S.Null,
+    "escadrille": S.Null,
+    "estrous": S.Null,
+    "interestedly": S.Null,
+    "katakinetomer": S.Null,
+    "mortification": S.Null,
+    "morula": S.Null,
+    "orthosymmetrical": S.Null,
+    "overbark": S.Null,
+    "politist": S.Null,
+    "qualified": S.Null,
+    "sphenomalar": S.Null,
+    "throatful": S.Null,
+    "transhumance": S.Null,
+    "triandrian": S.Null,
+    "unbooked": S.Null,
+}) {}
+
+export class UnstressedClass extends S.Class<UnstressedClass>("UnstressedClass")({
+    "Alain": S.Null,
+    "Amphirhina": S.Null,
+    "antimachinery": S.Null,
+    "coldish": S.Null,
+    "crantara": S.Null,
+    "distinguishing": S.Null,
+    "elytroposis": S.Null,
+    "gentianwort": S.Null,
+    "heliosis": S.Null,
+    "instrumental": S.Null,
+    "introinflection": S.Null,
+    "kala": S.Null,
+    "Lincolnian": S.Null,
+    "metad": S.Null,
+    "Sarcophilus": S.Null,
+    "swingingly": S.Null,
+    "unconformity": S.Null,
+    "undecreed": S.Null,
+    "venerable": S.Null,
+    "vowellessness": S.Null,
+}) {}
+
+export class UnimpeachablyClass extends S.Class<UnimpeachablyClass>("UnimpeachablyClass")({
+    "acerin": S.optional(S.NullOr(S.Int)),
+    "Bobadil": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "chlorophylligenous": S.optional(S.NullOr(S.Int)),
+    "conversational": S.optional(S.NullOr(S.Int)),
+    "demiowl": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "ectorhinal": S.optional(S.NullOr(S.Int)),
+    "gamblesomeness": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "irrorate": S.optional(S.NullOr(S.Int)),
+    "kindergartening": S.optional(S.NullOr(S.Int)),
+    "lateritic": S.optional(S.NullOr(S.Int)),
+    "mespil": S.optional(S.NullOr(S.Int)),
+    "misconfiguration": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "planometry": S.optional(S.NullOr(S.Int)),
+    "Quiina": S.optional(S.NullOr(S.Int)),
+    "Robert": S.optional(S.NullOr(S.Int)),
+    "rot": S.optional(S.NullOr(S.Int)),
+    "subcinctorium": S.optional(S.NullOr(S.Int)),
+    "tussocker": S.optional(S.NullOr(S.Int)),
+    "ultraproud": S.optional(S.NullOr(S.Int)),
+    "unsuggestedness": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class TruantcyClass extends S.Class<TruantcyClass>("TruantcyClass")({
+    "alfiona": S.optional(S.Null),
+    "ascaridiasis": S.optional(S.Null),
+    "bungey": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "ceroxyle": S.optional(S.Null),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "chorology": S.optional(S.Null),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "enmarble": S.optional(S.Null),
+    "Epeira": S.optional(S.Null),
+    "Eurylaimi": S.optional(S.Null),
+    "germination": S.optional(S.Null),
+    "hallelujah": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "lev": S.optional(S.Null),
+    "mouthing": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "philliloo": S.optional(S.Null),
+    "planetal": S.optional(S.Null),
+    "poney": S.optional(S.Null),
+    "punctualist": S.optional(S.Null),
+    "returnlessly": S.optional(S.Null),
+    "skelder": S.optional(S.Null),
+    "windwaywardly": S.optional(S.Null),
+    "Yuman": S.optional(S.Null),
+}) {}
+
+export class StrenuosityClass extends S.Class<StrenuosityClass>("StrenuosityClass")({
+    "bliss": S.optional(S.NullOr(S.Int)),
+    "buccate": S.optional(S.NullOr(S.Int)),
+    "bulletproof": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "crumblingness": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "engagedly": S.optional(S.NullOr(S.Int)),
+    "fightable": S.optional(S.NullOr(S.Int)),
+    "hoariness": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "hypopodium": S.optional(S.NullOr(S.Int)),
+    "luxurist": S.optional(S.NullOr(S.Int)),
+    "mechanician": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "Onopordon": S.optional(S.NullOr(S.Int)),
+    "podgily": S.optional(S.NullOr(S.Int)),
+    "reformableness": S.optional(S.NullOr(S.Int)),
+    "scatterbrains": S.optional(S.NullOr(S.Int)),
+    "seminuria": S.optional(S.NullOr(S.Int)),
+    "Sodomite": S.optional(S.NullOr(S.Int)),
+    "tramp": S.optional(S.NullOr(S.Int)),
+    "undueness": S.optional(S.NullOr(S.Int)),
+    "worthily": S.optional(S.NullOr(S.Int)),
+    "Yankeeist": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class Staghunting extends S.Class<Staghunting>("Staghunting")({
+    "calorimetric": S.optional(S.NullOr(S.Int)),
+    "canid": S.optional(S.NullOr(S.Int)),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "ditriglyphic": S.optional(S.NullOr(S.Int)),
+    "floriferousness": S.optional(S.NullOr(S.Int)),
+    "gamelike": S.optional(S.NullOr(S.Int)),
+    "grig": S.optional(S.NullOr(S.Int)),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "interloan": S.optional(S.NullOr(S.Int)),
+    "lithotomy": S.optional(S.NullOr(S.Int)),
+    "loric": S.optional(S.NullOr(S.Int)),
+    "membranocoriaceous": S.optional(S.NullOr(S.Int)),
+    "membranogenic": S.optional(S.NullOr(S.Int)),
+    "nonbookish": S.optional(S.Null),
+    "overtrump": S.optional(S.NullOr(S.Int)),
+    "scotino": S.optional(S.NullOr(S.Int)),
+    "seasonable": S.optional(S.NullOr(S.Int)),
+    "sephen": S.optional(S.NullOr(S.Int)),
+    "stigmarioid": S.optional(S.NullOr(S.Int)),
+    "tired": S.optional(S.NullOr(S.Int)),
+    "trifid": S.optional(S.NullOr(S.Int)),
+    "undefeatedly": S.optional(S.NullOr(S.Int)),
+    "ungirlish": S.optional(S.NullOr(S.Int)),
+}) {}
+
+export class SisteringClass extends S.Class<SisteringClass>("SisteringClass")({
+    "amphicarpic": S.Null,
+    "Chianti": S.Null,
+    "frigorific": S.Null,
+    "Haplomi": S.Null,
+    "hyperkinesis": S.Null,
+    "laudable": S.Null,
+    "madwoman": S.Null,
+    "maimedly": S.Null,
+    "Micropterygidae": S.Null,
+    "microrhabdus": S.Null,
+    "nondense": S.Null,
+    "phlebemphraxis": S.Null,
+    "redsear": S.Null,
+    "schismatical": S.Null,
+    "tartryl": S.Null,
+    "unabhorred": S.Null,
+    "undeliberateness": S.Null,
+    "unmixable": S.Null,
+    "untruckling": S.Null,
+    "vineal": S.Null,
+}) {}
+
+export class Scatty extends S.Class<Scatty>("Scatty")({
+    "aeriferous": S.Null,
+    "antical": S.Null,
+    "antighostism": S.Null,
+    "arcanum": S.Null,
+    "autotrophy": S.Null,
+    "baronial": S.Null,
+    "caffeine": S.Null,
+    "gorgoniacean": S.Null,
+    "heroical": S.Null,
+    "hydropical": S.Null,
+    "mechanology": S.Null,
+    "musicopoetic": S.Null,
+    "officiality": S.Null,
+    "oftentimes": S.Null,
+    "ophthalmotonometer": S.Null,
+    "reflectively": S.Null,
+    "springer": S.Null,
+    "Tabasco": S.Null,
+    "teleianthous": S.Null,
+    "uncombated": S.Null,
+}) {}
+
+export class SaxtenClass extends S.Class<SaxtenClass>("SaxtenClass")({
+    "algarrobilla": S.optional(S.Null),
+    "bowgrace": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Centaurid": S.optional(S.Null),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "flix": S.optional(S.Null),
+    "germanely": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "inhume": S.optional(S.Null),
+    "lepidote": S.optional(S.Null),
+    "megalochirous": S.optional(S.Null),
+    "ninepenny": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "nondeist": S.optional(S.Null),
+    "nymphaeaceous": S.optional(S.Null),
+    "parietofrontal": S.optional(S.Null),
+    "sancyite": S.optional(S.Null),
+    "subjectivist": S.optional(S.Null),
+    "tibiad": S.optional(S.Null),
+    "transonic": S.optional(S.Null),
+    "tripetalous": S.optional(S.Null),
+    "trunchman": S.optional(S.Null),
+    "urger": S.optional(S.Null),
+    "withdrawnness": S.optional(S.Null),
+}) {}
+
+export class SantirClass extends S.Class<SantirClass>("SantirClass")({
+    "admiredly": S.Null,
+    "demicaponier": S.Null,
+    "epitympanic": S.Null,
+    "investitor": S.Null,
+    "lupiform": S.Null,
+    "monoflagellate": S.Null,
+    "paleoethnic": S.Null,
+    "prediscountable": S.Null,
+    "rhetoricals": S.Null,
+    "roomth": S.Null,
+    "saccharose": S.Null,
+    "septonasal": S.Null,
+    "serpenticide": S.Null,
+    "setarious": S.Null,
+    "spaework": S.Null,
+    "stylite": S.Null,
+    "Suessiones": S.Null,
+    "timelily": S.Null,
+    "unprofaned": S.Null,
+    "vorticular": S.Null,
+}) {}
+
+export class RewriteClass extends S.Class<RewriteClass>("RewriteClass")({
+    "accountancy": S.Null,
+    "cacotrophic": S.Null,
+    "contest": S.Null,
+    "couthily": S.Null,
+    "falculate": S.Null,
+    "foreseize": S.Null,
+    "Hyades": S.Null,
+    "lemnad": S.Null,
+    "monotheistically": S.Null,
+    "nonflying": S.Null,
+    "Ptenoglossa": S.Null,
+    "repatch": S.Null,
+    "rodman": S.Null,
+    "strung": S.Null,
+    "titmal": S.Null,
+    "twalpennyworth": S.Null,
+    "unblamable": S.Null,
+    "vertical": S.Null,
+    "Whiggification": S.Null,
+    "yardman": S.Null,
+}) {}
+
+export class Ressaut extends S.Class<Ressaut>("Ressaut")({
+    "apperceptive": S.String,
+    "cuttoo": S.String,
+    "douser": S.String,
+    "drinkproof": S.String,
+    "forementioned": S.String,
+    "Freesia": S.String,
+    "Genevieve": S.String,
+    "hyperdiabolical": S.String,
+    "hypocone": S.String,
+    "irreverentially": S.String,
+    "jumart": S.String,
+    "Mimosaceae": S.String,
+    "mollicrush": S.String,
+    "nedder": S.String,
+    "retinasphalt": S.String,
+    "sough": S.String,
+    "steading": S.String,
+    "Theopaschitism": S.String,
+    "undurableness": S.String,
+    "unmingleable": S.String,
+}) {}
+
+export class Reimagine extends S.Class<Reimagine>("Reimagine")({
+    "adducible": S.optional(S.Null),
+    "anabolin": S.optional(S.Null),
+    "brainy": S.optional(S.Null),
+    "catharticalness": S.optional(S.NullOr(S.Number)),
+    "Chirotherium": S.optional(S.NullOr(S.Int)),
+    "chrysamine": S.optional(S.Null),
+    "disdiapason": S.optional(S.NullOr(S.String)),
+    "fluxweed": S.optional(S.Null),
+    "glaucine": S.optional(S.Null),
+    "grobianism": S.optional(S.Null),
+    "Hermo": S.optional(S.Null),
+    "hieroglyphist": S.optional(S.Null),
+    "homocerc": S.optional(S.NullOr(S.Boolean)),
+    "icteroid": S.optional(S.Null),
+    "immortal": S.optional(S.Null),
+    "impetulant": S.optional(S.Null),
+    "irrigate": S.optional(S.Null),
+    "myxedema": S.optional(S.Null),
+    "nonbookish": S.optional(S.Null),
+    "onyx": S.optional(S.Null),
+    "repasser": S.optional(S.Null),
+    "septomarginal": S.optional(S.Null),
+    "subdie": S.optional(S.Null),
+    "tibiometatarsal": S.optional(S.Null),
+    "waltzlike": S.optional(S.Null),
+}) {}
+
+export class QuebrachineClass extends S.Class<QuebrachineClass>("QuebrachineClass")({
+    "catharticalness": S.Number,
+    "Chirotherium": S.Int,
+    "disdiapason": S.String,
+    "homocerc": S.Boolean,
+    "nonbookish": S.Null,
+}) {}
+
+export class PyodermiaClass extends S.Class<PyodermiaClass>("PyodermiaClass")({
+    "aphoristically": S.Null,
+    "apophyllous": S.Null,
+    "cognize": S.Null,
+    "dermonosology": S.Null,
+    "Gyppo": S.Null,
+    "ither": S.Null,
+    "juglandaceous": S.Null,
+    "litho": S.Null,
+    "macropterous": S.Null,
+    "photographer": S.Null,
+    "romancing": S.Null,
+    "rumness": S.Null,
+    "somniloquist": S.Null,
+    "stressfully": S.Null,
+    "tactically": S.Null,
+    "tracheophony": S.Null,
+    "unappositely": S.Null,
+    "unclothedly": S.Null,
+    "unimplied": S.Null,
+    "unsyncopated": S.Null,
+}) {}
+
+export class PulpitismClass extends S.Class<PulpitismClass>("PulpitismClass")({
+    "abnet": S.Null,
+    "buckhorn": S.Null,
+    "calciform": S.Null,
+    "chelophore": S.Null,
+    "cogitation": S.Null,
+    "decreeable": S.Null,
+    "despicable": S.Null,
+    "isodiazo": S.Null,
+    "jadedly": S.Null,
+    "leptochlorite": S.Null,
+    "nursling": S.Null,
+    "palamedean": S.Null,
+    "photoheliograph": S.Null,
+    "pipewood": S.Null,
+    "roberd": S.Null,
+    "statable": S.Null,
+    "superassume": S.Null,
+    "syllabe": S.Null,
+    "toughhead": S.Null,
+    "underburn": S.Null,
+}) {}
+
+export class TopLevel extends S.Class<TopLevel>("TopLevel")({
+    "protrusive": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.Number)),
+    "pulpitism": S.Array(S.Union(S.Array(S.Int), S.Number, PulpitismClass)),
+    "pyodermia": S.Array(S.Union(S.Int, PyodermiaClass)),
+    "quebrachine": S.Array(S.Union(S.Boolean, QuebrachineClass, S.Null)),
+    "querier": S.Array(S.Union(S.Boolean, S.Record({ key: S.String, value: S.Int}))),
+    "rebarbative": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Number)),
+    "reimagine": S.Array(Reimagine),
+    "ressaut": Ressaut,
+    "retrocervical": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.Int)),
+    "revert": S.Array(S.Union(S.Boolean, S.String)),
+    "rewrite": S.Array(S.Union(S.Array(S.Null), S.Number, RewriteClass)),
+    "saccoderm": S.Array(S.Union(S.Array(S.Int), S.String, S.Null)),
+    "santir": S.Array(S.Union(S.Number, SantirClass)),
+    "saprophilous": S.Array(S.Union(S.Record({ key: S.String, value: S.Int}), S.String, S.Null)),
+    "saxten": S.Array(S.Union(S.String, SaxtenClass)),
+    "scatty": S.Array(S.NullOr(Scatty)),
+    "scoffer": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "scrampum": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Null)),
+    "semantic": S.Number,
+    "serpentinic": S.Array(S.Union(S.Array(S.Int), S.Number)),
+    "shadowable": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.Boolean)),
+    "sistering": S.Array(S.Union(S.Array(S.Null), S.Int, SisteringClass)),
+    "staghunting": S.Array(Staghunting),
+    "stagmometer": S.Array(S.Union(S.Array(S.NullOr(S.Int)), S.String)),
+    "stimulability": S.Array(S.Union(S.Boolean, S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "strangleable": S.Array(S.Union(S.Array(S.Null), S.Number)),
+    "strenuosity": S.Array(S.Union(S.Array(S.Null), StrenuosityClass)),
+    "tabaxir": S.Array(S.Union(S.Boolean, S.Number)),
+    "talpiform": S.Array(S.Union(S.Number, QuebrachineClass, S.Null)),
+    "thwack": S.Array(S.Union(S.Boolean, S.Number, QuebrachineClass)),
+    "to": S.Array(S.NullOr(S.Number)),
+    "tortricine": S.Array(S.Union(S.Array(S.NullOr(S.Int)), QuebrachineClass)),
+    "truantcy": S.Array(S.Union(S.Boolean, TruantcyClass)),
+    "turgesce": S.Array(S.String),
+    "unbeginning": S.Array(S.Union(S.Array(S.Null), S.Record({ key: S.String, value: S.Int}), S.String)),
+    "underdunged": S.Array(S.Number),
+    "undesirability": S.Array(S.Union(S.Array(S.Int), S.Record({ key: S.String, value: S.Int}), S.String)),
+    "unerasing": S.Array(S.Union(S.Array(S.Null), S.Int, S.Record({ key: S.String, value: S.Int}))),
+    "unguentarium": S.Array(S.Union(S.Array(S.Null), S.Int, S.Null)),
+    "unimpeachably": S.Array(S.Union(S.Boolean, UnimpeachablyClass)),
+    "unmortgaged": S.Array(S.Union(S.Number, S.Record({ key: S.String, value: S.Int}), S.Null)),
+    "unobstructed": S.Array(S.Union(S.Int, QuebrachineClass, S.Null)),
+    "unreceptivity": S.Array(S.Union(S.Array(S.Null), S.Int, S.String)),
+    "unsatisfactoriness": S.Array(S.Union(S.Array(S.Int), S.Boolean, S.Int)),
+    "unsecurity": S.Array(S.Int),
+    "unstressed": S.Array(S.Union(S.Boolean, S.String, UnstressedClass)),
+    "untasked": S.Array(S.Union(S.Array(S.Null), S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "unvarying": S.Array(S.Union(S.Boolean, S.Number, S.Record({ key: S.String, value: S.Int}))),
+    "vehemently": S.Array(S.Union(S.Array(S.Null), S.Boolean, S.Null)),
+    "warriorship": S.Record({ key: S.String, value: S.Boolean}),
+    "whitepot": S.Array(S.Union(S.Number, QuebrachineClass)),
+    "wrothy": S.Array(S.Union(S.Array(S.Null), WrothyClass)),
+}) {}
diff --git a/base/typescript-effect-schema/test/inputs/json/priority/keywords.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/priority/keywords.json/default/TopLevel.ts
index e8faeb6..0f915b5 100644
--- a/base/typescript-effect-schema/test/inputs/json/priority/keywords.json/default/TopLevel.ts
+++ b/head/typescript-effect-schema/test/inputs/json/priority/keywords.json/default/TopLevel.ts
@@ -281,6 +281,10 @@ export class Sbyte extends S.Class<Sbyte>("Sbyte")({
     "sbyte": S.Int,
 }) {}
 
+export class SClass extends S.Class<SClass>("SClass")({
+    "s": S.Int,
+}) {}
+
 export class Right extends S.Class<Right>("Right")({
     "right": S.Int,
 }) {}
@@ -383,6 +387,7 @@ export class Obj4 extends S.Class<Obj4>("Obj4")({
     "rethrows": Rethrows,
     "return": Return,
     "right": Right,
+    "s": SClass,
     "sbyte": Sbyte,
     "sealed": Sealed,
     "SEL": Sel,
diff --git a/head/typescript-effect-schema/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts b/head/typescript-effect-schema/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts
new file mode 100644
index 0000000..2545b86
--- /dev/null
+++ b/head/typescript-effect-schema/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts
@@ -0,0 +1,9 @@
+import * as S from "effect/Schema";
+
+
+export class TopLevel extends S.Class<TopLevel>("TopLevel")({
+    "\u0000\u0001\u001b\u001f": S.String,
+    "\ud83d\ude00": S.String,
+    "\u007f\u0080\u0085\u009f": S.String,
+    "\\u001b": S.String,
+}) {}
diff --git a/head/typescript-zod/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-zod/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..d06391f
--- /dev/null
+++ b/head/typescript-zod/test/inputs/json/priority/combinations1.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,332 @@
+import * as z from "zod";
+
+
+export const CerographClassSchema = z.object({
+    "apotropaion": z.null(),
+    "casuary": z.null(),
+    "creaker": z.null(),
+    "disqualification": z.null(),
+    "imperatorious": z.null(),
+    "impermeabilize": z.null(),
+    "metastoma": z.null(),
+    "noctidiurnal": z.null(),
+    "nonreserve": z.null(),
+    "ophthalmotonometry": z.null(),
+    "pailful": z.null(),
+    "pigfish": z.null(),
+    "pongee": z.null(),
+    "prosodical": z.null(),
+    "scrofuloderm": z.null(),
+    "storekeeping": z.null(),
+    "therologist": z.null(),
+    "Tolowa": z.null(),
+    "tradeful": z.null(),
+    "unriveting": z.null(),
+});
+
+export const ChemotherapeuticClassSchema = z.object({
+    "angioneurotic": z.null().optional(),
+    "availment": z.null().optional(),
+    "bladelet": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "caulis": z.null().optional(),
+    "chalcus": z.null().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "enteradenological": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "imporosity": z.null().optional(),
+    "insistently": z.null().optional(),
+    "intraparietal": z.null().optional(),
+    "ivied": z.null().optional(),
+    "Maureen": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "nostochine": z.null().optional(),
+    "nutcracker": z.null().optional(),
+    "ofttimes": z.null().optional(),
+    "phenocryst": z.null().optional(),
+    "precoincident": z.null().optional(),
+    "ramiferous": z.null().optional(),
+    "stagmometer": z.null().optional(),
+    "tetherball": z.null().optional(),
+    "unshy": z.null().optional(),
+});
+
+export const CimeliaClassSchema = z.object({
+    "catharticalness": z.number(),
+    "Chirotherium": z.number().int(),
+    "disdiapason": z.string(),
+    "homocerc": z.boolean(),
+    "nonbookish": z.null(),
+});
+
+export const CoadjustClassSchema = z.object({
+    "amidosulphonal": z.null().optional(),
+    "Benny": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "ensnare": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "hybridizer": z.null().optional(),
+    "leastwise": z.null().optional(),
+    "lof": z.null().optional(),
+    "monkhood": z.null().optional(),
+    "Netherlandish": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "peonism": z.null().optional(),
+    "Phonelescope": z.null().optional(),
+    "porphyrogeniture": z.null().optional(),
+    "preindemnify": z.null().optional(),
+    "rosal": z.null().optional(),
+    "scalenous": z.null().optional(),
+    "scopine": z.null().optional(),
+    "Sedaceae": z.null().optional(),
+    "suberinize": z.null().optional(),
+    "symbiot": z.null().optional(),
+    "tablefellow": z.null().optional(),
+    "unchargeable": z.null().optional(),
+});
+
+export const CredulityClassSchema = z.object({
+    "ammonolytic": z.null(),
+    "bushmaster": z.null(),
+    "considering": z.null(),
+    "consuetudinary": z.null(),
+    "embarras": z.null(),
+    "fineness": z.null(),
+    "flaithship": z.null(),
+    "Flavia": z.null(),
+    "gruffly": z.null(),
+    "Hedychium": z.null(),
+    "leadwort": z.null(),
+    "overseriously": z.null(),
+    "parabola": z.null(),
+    "pectinatodenticulate": z.null(),
+    "Popean": z.null(),
+    "pornocrat": z.null(),
+    "quadrisect": z.null(),
+    "seriality": z.null(),
+    "vamphorn": z.null(),
+    "wharp": z.null(),
+});
+
+export const DeruralizeClassSchema = z.object({
+    "bockerel": z.null(),
+    "boulder": z.null(),
+    "churrus": z.null(),
+    "counterdigged": z.null(),
+    "dialogite": z.null(),
+    "digenic": z.null(),
+    "dunbird": z.null(),
+    "ergatogyne": z.null(),
+    "fiendful": z.null(),
+    "jackrod": z.null(),
+    "Jehovistic": z.null(),
+    "Paninean": z.null(),
+    "panther": z.null(),
+    "placentigerous": z.null(),
+    "Romney": z.null(),
+    "sparm": z.null(),
+    "tocsin": z.null(),
+    "unnicked": z.null(),
+    "unstavable": z.null(),
+    "windfirm": z.null(),
+});
+
+export const DiaereseClassSchema = z.object({
+    "Amoreuxia": z.null(),
+    "ani": z.null(),
+    "bernicle": z.null(),
+    "blackwasher": z.null(),
+    "blowhard": z.null(),
+    "broma": z.null(),
+    "closecross": z.null(),
+    "congregationalism": z.null(),
+    "grayly": z.null(),
+    "historically": z.null(),
+    "hoast": z.null(),
+    "irretentive": z.null(),
+    "parcener": z.null(),
+    "pedder": z.null(),
+    "pseudoanatomic": z.null(),
+    "rhizocarpian": z.null(),
+    "samel": z.null(),
+    "silker": z.null(),
+    "subdentated": z.null(),
+    "subobscure": z.null(),
+});
+
+export const EncrustSchema = z.object({
+    "comradely": z.null(),
+    "diacanthous": z.null(),
+    "feminineness": z.null(),
+    "gossamered": z.null(),
+    "Hibernia": z.null(),
+    "Hibiscus": z.null(),
+    "Lepidosauria": z.null(),
+    "lollingly": z.null(),
+    "manager": z.null(),
+    "mechanic": z.null(),
+    "overminuteness": z.null(),
+    "papelonne": z.null(),
+    "plebification": z.null(),
+    "pugmiller": z.null(),
+    "recoveror": z.null(),
+    "spermatoblastic": z.null(),
+    "Syllidae": z.null(),
+    "ungyved": z.null(),
+    "whirlabout": z.null(),
+    "woodenware": z.null(),
+});
+
+export const FagginglyClassSchema = z.object({
+    "abranchian": z.null(),
+    "aculeiform": z.null(),
+    "adiaphoristic": z.null(),
+    "adoptionism": z.null(),
+    "Anglic": z.null(),
+    "antrotomy": z.null(),
+    "coerciveness": z.null(),
+    "decorist": z.null(),
+    "duckhood": z.null(),
+    "Heteromeri": z.null(),
+    "hypochnose": z.null(),
+    "lochage": z.null(),
+    "melee": z.null(),
+    "nonconformitant": z.null(),
+    "Poinsettia": z.null(),
+    "putatively": z.null(),
+    "semivolatile": z.null(),
+    "soleas": z.null(),
+    "unfastenable": z.null(),
+    "unmillinered": z.null(),
+});
+
+export const FenkClassSchema = z.object({
+    "apoise": z.null(),
+    "astronomize": z.null(),
+    "cockhorse": z.null(),
+    "copular": z.null(),
+    "Dagomba": z.null(),
+    "draffy": z.null(),
+    "foreigner": z.null(),
+    "Guyandot": z.null(),
+    "neurogliosis": z.null(),
+    "osmious": z.null(),
+    "palpitate": z.null(),
+    "rebukeable": z.null(),
+    "Reinwardtia": z.null(),
+    "reservatory": z.null(),
+    "scalt": z.null(),
+    "scripturalize": z.null(),
+    "tintometer": z.null(),
+    "Tritoness": z.null(),
+    "undergrade": z.null(),
+    "undermountain": z.null(),
+});
+
+export const FlagmakingClassSchema = z.object({
+    "albarco": z.null(),
+    "Bunodonta": z.null(),
+    "hornify": z.null(),
+    "Hydrocorisae": z.null(),
+    "hypoglossus": z.null(),
+    "inexpiably": z.null(),
+    "ingratitude": z.null(),
+    "ladyfly": z.null(),
+    "medicament": z.null(),
+    "monogrammatic": z.null(),
+    "nobbut": z.null(),
+    "Notacanthidae": z.null(),
+    "polyplacophore": z.null(),
+    "proexercise": z.null(),
+    "protoplast": z.null(),
+    "puzzling": z.null(),
+    "splanchnoskeleton": z.null(),
+    "unloveliness": z.null(),
+    "unquarantined": z.null(),
+    "unrenounceable": z.null(),
+});
+
+export const HemocoeleClassSchema = z.object({
+    "acrogamy": z.null().optional(),
+    "amelification": z.null().optional(),
+    "autobiographic": z.null().optional(),
+    "berat": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "disproportionably": z.null().optional(),
+    "erythrite": z.null().optional(),
+    "graphic": z.null().optional(),
+    "hepatological": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "incommensurably": z.null().optional(),
+    "misaffirm": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "pocketbook": z.null().optional(),
+    "sclerometric": z.null().optional(),
+    "stambouline": z.null().optional(),
+    "stickpin": z.null().optional(),
+    "tubulure": z.null().optional(),
+    "undelated": z.null().optional(),
+    "unsalt": z.null().optional(),
+    "untutelar": z.null().optional(),
+    "vagrant": z.null().optional(),
+    "Walt": z.null().optional(),
+});
+
+export const InteracinarSchema = z.object({
+    "assapan": z.number(),
+    "benefactorship": z.boolean(),
+    "triseriatim": z.string(),
+    "tubbing": z.number().int(),
+    "untrimmed": z.null(),
+});
+
+export const TopLevelSchema = z.object({
+    "centrodesmose": z.string(),
+    "cerograph": z.array(z.union([z.null(), CerographClassSchema, z.string()])),
+    "chemotherapeutics": z.array(z.union([ChemotherapeuticClassSchema, z.number().int()])),
+    "cimelia": z.array(z.union([z.null(), z.array(z.number().int()), CimeliaClassSchema])),
+    "citrated": z.number().int(),
+    "clinodome": z.array(z.union([z.number(), z.string()])),
+    "coadjust": z.array(z.union([CoadjustClassSchema, z.number()])),
+    "consilience": z.array(z.union([z.number(), z.record(z.string(), z.number().int())])),
+    "constructor": z.array(z.union([z.boolean(), z.record(z.string(), z.union([z.null(), z.number().int()]))])),
+    "continuative": z.array(z.union([z.record(z.string(), z.number().int()), z.string()])),
+    "credulity": z.array(z.union([CredulityClassSchema, z.number().int(), z.string()])),
+    "creviced": z.array(z.union([z.boolean(), z.record(z.string(), z.number().int()), z.string()])),
+    "cubiculum": z.array(z.array(z.union([z.null(), z.number().int()]))),
+    "deruralize": z.array(z.union([z.array(z.null()), z.boolean(), DeruralizeClassSchema])),
+    "diaereses": z.array(z.union([z.array(z.number().int()), z.boolean(), DiaereseClassSchema])),
+    "dissolution": z.array(z.union([z.null(), z.array(z.null())])),
+    "downstroke": z.array(z.union([z.array(z.null()), z.boolean(), z.string()])),
+    "electrotautomerism": z.array(z.union([z.null(), z.number()])),
+    "eleutheromania": z.array(z.union([z.number(), z.record(z.string(), z.number().int()), z.string()])),
+    "encrust": EncrustSchema,
+    "entomoid": z.array(z.union([CimeliaClassSchema, z.number().int()])),
+    "epipaleolithic": z.array(z.union([z.array(z.number().int()), z.number()])),
+    "expropriable": z.array(z.union([z.array(z.null()), CimeliaClassSchema, z.number()])),
+    "faggingly": z.array(z.union([FagginglyClassSchema, z.number()])),
+    "fenks": z.array(z.union([FenkClassSchema, z.string()])),
+    "flagmaking": z.array(z.union([z.boolean(), FlagmakingClassSchema, z.number()])),
+    "fluorometer": z.array(z.union([z.null(), z.number().int(), z.string()])),
+    "fulsome": z.array(z.union([z.null(), z.number().int()])),
+    "fuzzy": z.array(z.union([z.number().int(), z.record(z.string(), z.union([z.null(), z.number().int()]))])),
+    "gardenwards": z.array(z.union([z.array(z.number().int()), z.boolean(), z.string()])),
+    "generalissimo": z.array(z.union([z.null(), z.boolean(), z.record(z.string(), z.number().int())])),
+    "habeas": z.array(z.union([z.null(), z.record(z.string(), z.number().int())])),
+    "hemicrystalline": z.array(z.union([CimeliaClassSchema, z.string()])),
+    "hemocoele": z.array(z.union([z.array(z.number().int()), HemocoeleClassSchema])),
+    "hoister": z.array(z.union([z.null(), CimeliaClassSchema, z.string()])),
+    "hyperpiesis": z.array(z.union([z.null(), z.array(z.null()), CimeliaClassSchema])),
+    "hyppish": z.array(z.union([z.null(), z.boolean(), z.string()])),
+    "idealizer": z.array(z.union([z.array(z.null()), CimeliaClassSchema, z.number().int()])),
+    "incrustator": z.array(z.union([z.array(z.number().int()), z.number().int(), z.string()])),
+    "intentiveness": z.array(z.union([CimeliaClassSchema, z.number(), z.string()])),
+    "interacinar": InteracinarSchema,
+    "intercorrelation": z.array(z.union([z.null(), z.array(z.number().int())])),
+    "jacutinga": z.array(z.union([z.array(z.number().int()), z.record(z.string(), z.union([z.null(), z.number().int()]))])),
+});
diff --git a/head/typescript-zod/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-zod/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..8244ab1
--- /dev/null
+++ b/head/typescript-zod/test/inputs/json/priority/combinations2.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,280 @@
+import * as z from "zod";
+
+
+export const AlleviateClassSchema = z.object({
+    "apriori": z.null(),
+    "beggarer": z.null(),
+    "brokenheartedly": z.null(),
+    "debilitation": z.null(),
+    "frike": z.null(),
+    "gastrolith": z.null(),
+    "Hulsean": z.null(),
+    "orthocentric": z.null(),
+    "petaly": z.null(),
+    "probudgeting": z.null(),
+    "reacquire": z.null(),
+    "scow": z.null(),
+    "shutoff": z.null(),
+    "subcontiguous": z.null(),
+    "suffumigate": z.null(),
+    "transformable": z.null(),
+    "uncoroneted": z.null(),
+    "unparking": z.null(),
+    "unvarnishedness": z.null(),
+    "wherewithal": z.null(),
+});
+
+export const RebeccaSchema = z.object({
+    "catharticalness": z.number(),
+    "Chirotherium": z.number().int(),
+    "disdiapason": z.string(),
+    "homocerc": z.boolean(),
+    "nonbookish": z.null(),
+});
+
+export const AmphithyronSchema = z.object({
+    "akroasis": z.number().int().optional(),
+    "antiphonical": z.number().int().optional(),
+    "basebred": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "conductometric": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "ensilation": z.number().int().optional(),
+    "eyebolt": z.number().int().optional(),
+    "fistulated": z.number().int().optional(),
+    "heteropod": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "Juniperus": z.number().int().optional(),
+    "labyrinthically": z.number().int().optional(),
+    "martyrization": z.number().int().optional(),
+    "mispolicy": z.number().int().optional(),
+    "multipara": z.number().int().optional(),
+    "Nazirite": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "possessorial": z.number().int().optional(),
+    "shamed": z.number().int().optional(),
+    "shelfworn": z.number().int().optional(),
+    "stagnum": z.number().int().optional(),
+    "Those": z.number().int().optional(),
+    "undecimal": z.number().int().optional(),
+});
+
+export const AnkeeClassSchema = z.object({
+    "Anomoean": z.null(),
+    "barleyhood": z.null(),
+    "befriender": z.null(),
+    "brutishness": z.null(),
+    "cephalalgy": z.null(),
+    "cirurgian": z.null(),
+    "conventionally": z.null(),
+    "jackshay": z.null(),
+    "milammeter": z.null(),
+    "Naja": z.null(),
+    "ombrological": z.null(),
+    "phonasthenia": z.null(),
+    "retrievableness": z.null(),
+    "snakily": z.null(),
+    "swot": z.null(),
+    "tartlet": z.null(),
+    "thiofuran": z.null(),
+    "tracheophone": z.null(),
+    "tuglike": z.null(),
+    "unscratchingly": z.null(),
+});
+
+export const AnsarieClassSchema = z.object({
+    "accension": z.null(),
+    "Alida": z.null(),
+    "asteria": z.null(),
+    "beriberic": z.null(),
+    "edgebone": z.null(),
+    "gastrodialysis": z.null(),
+    "geographic": z.null(),
+    "Ictonyx": z.null(),
+    "metrocele": z.null(),
+    "misgraft": z.null(),
+    "monteith": z.null(),
+    "notcher": z.null(),
+    "prorestriction": z.null(),
+    "Ramist": z.null(),
+    "throatlet": z.null(),
+    "unfair": z.null(),
+    "unsynonymous": z.null(),
+    "water": z.null(),
+    "zestfully": z.null(),
+    "zincic": z.null(),
+});
+
+export const ChytridiaceaeClassSchema = z.object({
+    "Batidaceae": z.null(),
+    "Brechites": z.null(),
+    "codespairer": z.null(),
+    "Emery": z.null(),
+    "enervative": z.null(),
+    "excriminate": z.null(),
+    "goshenite": z.null(),
+    "grime": z.null(),
+    "gritten": z.null(),
+    "hectorly": z.null(),
+    "intermediation": z.null(),
+    "meeterly": z.null(),
+    "Narraganset": z.null(),
+    "onymatic": z.null(),
+    "paddlecock": z.null(),
+    "thana": z.null(),
+    "thornily": z.null(),
+    "uckia": z.null(),
+    "unmettle": z.null(),
+    "vorticellid": z.null(),
+});
+
+export const DiscordiaClassSchema = z.object({
+    "Altaic": z.number().int().optional(),
+    "amoristic": z.number().int().optional(),
+    "blennophthalmia": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "disciplinability": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "goofer": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "laryngograph": z.number().int().optional(),
+    "leucitis": z.number().int().optional(),
+    "lymphocyst": z.number().int().optional(),
+    "microcosmology": z.number().int().optional(),
+    "nauseation": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "Patarin": z.number().int().optional(),
+    "preliberal": z.number().int().optional(),
+    "prettifier": z.number().int().optional(),
+    "rangework": z.number().int().optional(),
+    "redient": z.number().int().optional(),
+    "subfusiform": z.number().int().optional(),
+    "suicidical": z.number().int().optional(),
+    "swow": z.number().int().optional(),
+    "wastrel": z.number().int().optional(),
+    "wingle": z.number().int().optional(),
+});
+
+export const GryphosaurusClassSchema = z.object({
+    "amissibility": z.null(),
+    "Burushaski": z.null(),
+    "citronin": z.null(),
+    "coplaintiff": z.null(),
+    "disquisitionary": z.null(),
+    "enoplan": z.null(),
+    "faintness": z.null(),
+    "hebetomy": z.null(),
+    "islandry": z.null(),
+    "lameduck": z.null(),
+    "overbattle": z.null(),
+    "overinterested": z.null(),
+    "phrenologic": z.null(),
+    "rainband": z.null(),
+    "shiningly": z.null(),
+    "stamineous": z.null(),
+    "subscapularis": z.null(),
+    "Tahami": z.null(),
+    "undaubed": z.null(),
+    "underntime": z.null(),
+});
+
+export const LaviniaClassSchema = z.object({
+    "agitable": z.number().int().optional(),
+    "asininity": z.number().int().optional(),
+    "benefiter": z.number().int().optional(),
+    "bronzelike": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "cholesteatomatous": z.number().int().optional(),
+    "deprivement": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "flippantness": z.number().int().optional(),
+    "fogproof": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "merrymeeting": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "overcareful": z.number().int().optional(),
+    "panaris": z.number().int().optional(),
+    "preacceptance": z.number().int().optional(),
+    "quinoxaline": z.number().int().optional(),
+    "sig": z.number().int().optional(),
+    "superconfusion": z.number().int().optional(),
+    "Tacana": z.number().int().optional(),
+    "tillotter": z.number().int().optional(),
+    "tranquillize": z.number().int().optional(),
+    "unquestionable": z.number().int().optional(),
+    "uproute": z.number().int().optional(),
+});
+
+export const OskarClassSchema = z.object({
+    "Acrobates": z.null(),
+    "beanshooter": z.null(),
+    "bearhound": z.null(),
+    "Cayuga": z.null(),
+    "guarneri": z.null(),
+    "hypochondriacism": z.null(),
+    "indication": z.null(),
+    "jaculative": z.null(),
+    "nagana": z.null(),
+    "Netherlandish": z.null(),
+    "noctivagous": z.null(),
+    "nonphysiological": z.null(),
+    "praxis": z.null(),
+    "provision": z.null(),
+    "subterhuman": z.null(),
+    "sunlit": z.null(),
+    "syncraniate": z.null(),
+    "teachment": z.null(),
+    "unmutinous": z.null(),
+    "unstoppable": z.null(),
+});
+
+export const TopLevelSchema = z.object({
+    "Abranchiata": z.array(z.union([z.null(), z.array(z.number().int()), z.number().int()])),
+    "academe": z.array(z.union([z.array(z.number().int()), z.number().int(), z.record(z.string(), z.number().int())])),
+    "acquirable": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), z.record(z.string(), z.number().int())])),
+    "aerometry": z.array(z.union([z.boolean(), z.number()])),
+    "alexin": z.array(z.union([z.array(z.number().int()), z.boolean()])),
+    "alleviate": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), AlleviateClassSchema])),
+    "amaas": z.array(z.union([z.boolean(), RebeccaSchema, z.number().int()])),
+    "ambassage": z.array(z.union([z.array(z.null()), z.string()])),
+    "amphithyron": z.array(z.union([z.null(), AmphithyronSchema])),
+    "Andriana": z.array(z.union([z.null(), z.string()])),
+    "ankee": z.array(z.union([z.array(z.number().int()), AnkeeClassSchema, z.number().int()])),
+    "annihilator": z.array(z.union([z.null(), z.record(z.string(), z.union([z.null(), z.number().int()]))])),
+    "annulose": z.null(),
+    "Ansarie": z.array(z.union([z.null(), z.array(z.number().int()), AnsarieClassSchema])),
+    "aphasia": z.array(z.union([z.array(z.number().int()), z.number().int()])),
+    "asprawl": z.array(z.union([z.number(), z.string()])),
+    "attractive": z.array(z.union([z.null(), z.boolean()])),
+    "barksome": z.record(z.string(), z.number().int()),
+    "bedesman": z.array(z.union([z.boolean(), z.number(), z.string()])),
+    "belard": z.array(z.union([z.array(z.number().int()), RebeccaSchema, z.number()])),
+    "bocking": z.array(z.union([z.array(z.number().int()), z.boolean(), z.record(z.string(), z.number().int())])),
+    "brawlingly": z.array(z.union([z.array(z.null()), z.record(z.string(), z.union([z.null(), z.number().int()]))])),
+    "brookie": z.array(z.union([z.array(z.number().int()), RebeccaSchema])),
+    "bumboatman": z.array(z.union([z.null(), z.array(z.null()), z.string()])),
+    "bystreet": z.array(z.null()),
+    "calaverite": z.array(z.union([z.array(z.number().int()), z.string()])),
+    "catallactic": z.array(z.union([z.array(z.null()), z.boolean(), z.record(z.string(), z.number().int())])),
+    "cemental": z.array(z.union([z.array(z.number().int()), z.number(), z.record(z.string(), z.number().int())])),
+    "Chytridiaceae": z.array(z.union([z.null(), z.boolean(), ChytridiaceaeClassSchema])),
+    "Discordia": z.array(z.union([z.array(z.number().int()), DiscordiaClassSchema])),
+    "Endomyces": z.array(z.union([z.number().int(), z.string()])),
+    "Epinephelidae": z.array(z.union([z.boolean(), z.number().int(), z.string()])),
+    "Eupatorium": z.array(z.union([z.array(z.null()), z.record(z.string(), z.number().int())])),
+    "Gryphosaurus": z.array(z.union([z.array(z.number().int()), GryphosaurusClassSchema, z.string()])),
+    "Koryak": z.array(z.union([z.record(z.string(), z.union([z.null(), z.number().int()])), z.string()])),
+    "Lavinia": z.array(z.union([LaviniaClassSchema, z.string()])),
+    "Oskar": z.array(z.union([z.array(z.number().int()), OskarClassSchema])),
+    "Rebecca": z.array(z.union([RebeccaSchema, z.number().int(), z.string()])),
+    "Rhomboganoidei": z.array(z.union([z.array(z.number().int()), RebeccaSchema, z.string()])),
+    "Rigsmal": z.boolean(),
+    "Ruellia": z.array(z.union([z.boolean(), RebeccaSchema, z.string()])),
+    "School": z.array(z.union([z.null(), z.number().int(), z.record(z.string(), z.number().int())])),
+    "Shakespearolater": z.array(z.union([z.array(z.number().int()), z.number(), z.string()])),
+    "Svan": z.array(z.number()),
+    "Wayao": z.record(z.string(), z.number()),
+});
diff --git a/head/typescript-zod/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-zod/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..02c5d53
--- /dev/null
+++ b/head/typescript-zod/test/inputs/json/priority/combinations3.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,384 @@
+import * as z from "zod";
+
+
+export const JurorClassSchema = z.object({
+    "adipsy": z.null(),
+    "auxiliator": z.null(),
+    "benda": z.null(),
+    "benjamin": z.null(),
+    "brandling": z.null(),
+    "epicurishly": z.null(),
+    "eremochaetous": z.null(),
+    "marten": z.null(),
+    "monocline": z.null(),
+    "Olea": z.null(),
+    "palgat": z.null(),
+    "pennyworth": z.null(),
+    "pioury": z.null(),
+    "pragmatistic": z.null(),
+    "stylelessness": z.null(),
+    "systematical": z.null(),
+    "thready": z.null(),
+    "uncontemporary": z.null(),
+    "uncouched": z.null(),
+    "uninhabitedness": z.null(),
+});
+
+export const LadronismClassSchema = z.object({
+    "acclaimer": z.null(),
+    "achree": z.null(),
+    "base": z.null(),
+    "conundrumize": z.null(),
+    "degerminator": z.null(),
+    "describable": z.null(),
+    "exasperatedly": z.null(),
+    "heroine": z.null(),
+    "indazin": z.null(),
+    "luteous": z.null(),
+    "papular": z.null(),
+    "pritch": z.null(),
+    "Prodenia": z.null(),
+    "seege": z.null(),
+    "shopgirl": z.null(),
+    "tragedietta": z.null(),
+    "unsparse": z.null(),
+    "uplook": z.null(),
+    "vermiformis": z.null(),
+    "whafabout": z.null(),
+});
+
+export const LandlubberlyClassSchema = z.object({
+    "acropoleis": z.null(),
+    "aminate": z.null(),
+    "Amyraldism": z.null(),
+    "bipenniform": z.null(),
+    "bugre": z.null(),
+    "calycule": z.null(),
+    "caoutchouc": z.null(),
+    "disprover": z.null(),
+    "fitroot": z.null(),
+    "fulgently": z.null(),
+    "kickup": z.null(),
+    "laevoversion": z.null(),
+    "moter": z.null(),
+    "objectivity": z.null(),
+    "posterity": z.null(),
+    "postnuptial": z.null(),
+    "precedentary": z.null(),
+    "saddling": z.null(),
+    "subcurrent": z.null(),
+    "unrecriminative": z.null(),
+});
+
+export const LupusClassSchema = z.object({
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "Chlorioninae": z.number().int().optional(),
+    "Corvinae": z.number().int().optional(),
+    "Crassina": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "exiguity": z.number().int().optional(),
+    "farcist": z.number().int().optional(),
+    "holographical": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "ichthyophagan": z.number().int().optional(),
+    "implacable": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "outshiner": z.number().int().optional(),
+    "overweather": z.number().int().optional(),
+    "protonegroid": z.number().int().optional(),
+    "shallowish": z.number().int().optional(),
+    "snoke": z.number().int().optional(),
+    "snout": z.number().int().optional(),
+    "surveillance": z.number().int().optional(),
+    "threshingtime": z.number().int().optional(),
+    "Thysanocarpus": z.number().int().optional(),
+    "unsignificantly": z.number().int().optional(),
+    "unsnap": z.number().int().optional(),
+    "vendible": z.number().int().optional(),
+});
+
+export const MaslinSchema = z.object({
+    "Alicant": z.number().int().optional(),
+    "antiatonement": z.null().optional(),
+    "anticorrosive": z.number().int().optional(),
+    "aphidozer": z.null().optional(),
+    "Bakuninist": z.null().optional(),
+    "be": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "chub": z.number().int().optional(),
+    "cuprosilicon": z.number().int().optional(),
+    "curtailedly": z.number().int().optional(),
+    "dellenite": z.number().int().optional(),
+    "Dimitry": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "edifying": z.null().optional(),
+    "ethmoiditis": z.number().int().optional(),
+    "gastralgy": z.null().optional(),
+    "goatherd": z.number().int().optional(),
+    "hammerdress": z.number().int().optional(),
+    "hangfire": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "lacunosity": z.number().int().optional(),
+    "longiloquence": z.null().optional(),
+    "mameliere": z.number().int().optional(),
+    "motherless": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "noncorrodible": z.null().optional(),
+    "nonsensicality": z.null().optional(),
+    "oafishly": z.number().int().optional(),
+    "pfund": z.null().optional(),
+    "preadvisory": z.null().optional(),
+    "retroflexed": z.null().optional(),
+    "saccharulmic": z.number().int().optional(),
+    "scowlful": z.number().int().optional(),
+    "secluded": z.null().optional(),
+    "slackage": z.null().optional(),
+    "sphaeridial": z.number().int().optional(),
+    "spondulics": z.null().optional(),
+    "subsecive": z.number().int().optional(),
+    "swellmobsman": z.null().optional(),
+    "trachyglossate": z.number().int().optional(),
+    "trialogue": z.null().optional(),
+    "unassuaged": z.number().int().optional(),
+    "ungross": z.null().optional(),
+    "unjudiciously": z.null().optional(),
+});
+
+export const MonaziteClassSchema = z.object({
+    "catharticalness": z.number(),
+    "Chirotherium": z.number().int(),
+    "disdiapason": z.string(),
+    "homocerc": z.boolean(),
+    "nonbookish": z.null(),
+});
+
+export const MonotheisticallyClassSchema = z.object({
+    "blaspheme": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "celiosalpingectomy": z.null().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "consummativeness": z.null().optional(),
+    "disdiapason": z.string().optional(),
+    "egestive": z.null().optional(),
+    "enchylema": z.null().optional(),
+    "gasconade": z.null().optional(),
+    "holidayer": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "intuitionalism": z.null().optional(),
+    "lophiostomate": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "nonvolition": z.null().optional(),
+    "palatableness": z.null().optional(),
+    "pimpery": z.null().optional(),
+    "previolation": z.null().optional(),
+    "reconveyance": z.null().optional(),
+    "registership": z.null().optional(),
+    "rhyacolite": z.null().optional(),
+    "smithereens": z.null().optional(),
+    "superedification": z.null().optional(),
+    "trust": z.null().optional(),
+    "whitestone": z.null().optional(),
+});
+
+export const NoncontributingSchema = z.object({
+    "estevin": z.string(),
+    "jolterhead": z.number(),
+    "sauternes": z.number().int(),
+    "sparsely": z.boolean(),
+    "unrequested": z.null(),
+});
+
+export const OccupationalistClassSchema = z.object({
+    "beholdable": z.null(),
+    "brotuliform": z.null(),
+    "Chimakum": z.null(),
+    "doodler": z.null(),
+    "emulsin": z.null(),
+    "Fin": z.null(),
+    "flourishing": z.null(),
+    "flueless": z.null(),
+    "furtively": z.null(),
+    "gritter": z.null(),
+    "interwish": z.null(),
+    "monoxylic": z.null(),
+    "myristic": z.null(),
+    "nightwear": z.null(),
+    "peruser": z.null(),
+    "theoastrological": z.null(),
+    "thumby": z.null(),
+    "tingitid": z.null(),
+    "trailless": z.null(),
+    "unpocketed": z.null(),
+});
+
+export const OutrivalClassSchema = z.object({
+    "adroitly": z.null(),
+    "bridehood": z.null(),
+    "Castoroides": z.null(),
+    "Czechoslovak": z.null(),
+    "diagenesis": z.null(),
+    "dihexahedron": z.null(),
+    "dopester": z.null(),
+    "eumerism": z.null(),
+    "flyness": z.null(),
+    "fouler": z.null(),
+    "laudanosine": z.null(),
+    "Lingulidae": z.null(),
+    "minutary": z.null(),
+    "mitra": z.null(),
+    "opisthorchiasis": z.null(),
+    "pensively": z.null(),
+    "pubigerous": z.null(),
+    "rebellious": z.null(),
+    "recodify": z.null(),
+    "unpaced": z.null(),
+});
+
+export const PiaculumClassSchema = z.object({
+    "alada": z.number().int().optional(),
+    "amphistomous": z.number().int().optional(),
+    "boysenberry": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "decardinalize": z.number().int().optional(),
+    "discouragement": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "doitrified": z.number().int().optional(),
+    "hexaspermous": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "insinking": z.number().int().optional(),
+    "loathfulness": z.number().int().optional(),
+    "miasmatical": z.number().int().optional(),
+    "neurofibril": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "phonendoscope": z.number().int().optional(),
+    "pilferment": z.number().int().optional(),
+    "predismissory": z.number().int().optional(),
+    "preinscription": z.number().int().optional(),
+    "quotative": z.number().int().optional(),
+    "sienna": z.number().int().optional(),
+    "thorax": z.number().int().optional(),
+    "yachting": z.number().int().optional(),
+    "Zipper": z.number().int().optional(),
+});
+
+export const PneumoceleSchema = z.object({
+    "Carbonarism": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "cineolic": z.null().optional(),
+    "cobbly": z.null().optional(),
+    "conchyliferous": z.null().optional(),
+    "congregation": z.null().optional(),
+    "disdiapason": z.string().optional(),
+    "enterotomy": z.null().optional(),
+    "entophytal": z.null().optional(),
+    "fewtrils": z.null().optional(),
+    "herem": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "Koniga": z.null().optional(),
+    "meticulosity": z.null().optional(),
+    "Micky": z.null().optional(),
+    "mismarriage": z.null().optional(),
+    "neurotrophic": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "persuasively": z.null().optional(),
+    "replaceable": z.null().optional(),
+    "silex": z.null().optional(),
+    "taillight": z.null().optional(),
+    "unjealous": z.null().optional(),
+    "visitorial": z.null().optional(),
+});
+
+export const PotwhiskyClassSchema = z.object({
+    "arciform": z.null(),
+    "cresolin": z.null(),
+    "disheartener": z.null(),
+    "disproportionable": z.null(),
+    "Euchorda": z.null(),
+    "ferryway": z.null(),
+    "filamentiferous": z.null(),
+    "flemish": z.null(),
+    "forgainst": z.null(),
+    "grainering": z.null(),
+    "irrevoluble": z.null(),
+    "kindredship": z.null(),
+    "pinguitudinous": z.null(),
+    "simpletonic": z.null(),
+    "singsong": z.null(),
+    "submergement": z.null(),
+    "supraoesophagal": z.null(),
+    "thrashel": z.null(),
+    "tyremesis": z.null(),
+    "Yoruba": z.null(),
+});
+
+export const PrefreshmanClassSchema = z.object({
+    "azorubine": z.null(),
+    "choroiditis": z.null(),
+    "coagulatory": z.null(),
+    "cyclorama": z.null(),
+    "Dolphus": z.null(),
+    "duckhearted": z.null(),
+    "Ficus": z.null(),
+    "Gemaric": z.null(),
+    "jugation": z.null(),
+    "myoliposis": z.null(),
+    "nonnomination": z.null(),
+    "palay": z.null(),
+    "pentactinal": z.null(),
+    "Phaet": z.null(),
+    "piquant": z.null(),
+    "registration": z.null(),
+    "remancipation": z.null(),
+    "scutatiform": z.null(),
+    "theodolite": z.null(),
+    "underward": z.null(),
+});
+
+export const TopLevelSchema = z.object({
+    "juror": z.array(z.union([z.boolean(), JurorClassSchema])),
+    "kongoni": z.array(z.union([z.array(z.number().int()), z.record(z.string(), z.number().int())])),
+    "ladronism": z.array(z.union([LadronismClassSchema, z.number(), z.string()])),
+    "landlubberly": z.array(z.union([z.boolean(), LandlubberlyClassSchema, z.number().int()])),
+    "listener": z.array(z.union([z.array(z.null()), z.number().int()])),
+    "lupus": z.array(z.union([LupusClassSchema, z.number().int()])),
+    "maslin": z.array(MaslinSchema),
+    "monazite": z.array(z.union([MonaziteClassSchema, z.number()])),
+    "monoliteral": z.array(z.union([z.array(z.null()), z.boolean()])),
+    "monotheistically": z.array(z.union([z.array(z.null()), MonotheisticallyClassSchema])),
+    "montage": z.array(z.union([z.array(z.null()), z.number(), z.string()])),
+    "moralness": z.array(z.union([z.null(), z.array(z.null()), z.number()])),
+    "mowra": z.array(z.union([z.null(), MonaziteClassSchema])),
+    "mulishly": z.array(z.union([z.null(), z.array(z.number().int()), z.number()])),
+    "myoscope": z.array(z.union([z.array(z.null()), z.boolean(), z.number().int()])),
+    "nach": z.array(z.union([z.null(), z.array(z.union([z.null(), z.number().int()]))])),
+    "neuromastic": z.array(z.union([z.array(z.null()), z.number()])),
+    "noncontributing": z.array(NoncontributingSchema),
+    "nonnervous": z.array(z.union([z.boolean(), z.number().int()])),
+    "nonvaluation": z.array(z.union([z.array(z.null()), z.boolean(), z.number()])),
+    "occupationalist": z.array(z.union([z.null(), z.array(z.null()), OccupationalistClassSchema])),
+    "outrival": z.array(z.union([z.null(), OutrivalClassSchema, z.number()])),
+    "paleographically": z.array(z.union([z.number(), z.record(z.string(), z.union([z.null(), z.number().int()]))])),
+    "pamphletwise": z.array(z.union([z.number().int(), z.record(z.string(), z.number().int()), z.string()])),
+    "pediatrics": z.array(z.union([z.null(), z.boolean(), z.number()])),
+    "perceptive": z.array(z.boolean()),
+    "piaculum": z.array(z.union([PiaculumClassSchema, z.number()])),
+    "piccadilly": z.array(z.union([z.null(), z.number(), z.string()])),
+    "piffler": z.array(z.union([z.array(z.null()), MonaziteClassSchema])),
+    "pithful": z.array(z.union([z.null(), z.boolean(), z.number().int()])),
+    "placuntitis": z.array(z.union([z.number().int(), z.record(z.string(), z.number().int())])),
+    "plectopterous": z.array(z.union([z.number(), z.record(z.string(), z.number().int())])),
+    "pneumocele": z.array(z.union([z.null(), PneumoceleSchema])),
+    "poliorcetic": z.array(z.union([z.boolean(), MonaziteClassSchema])),
+    "poormaster": z.array(z.union([z.null(), z.array(z.number().int()), z.record(z.string(), z.number().int())])),
+    "potwhisky": z.array(z.union([z.null(), PotwhiskyClassSchema, z.number().int()])),
+    "practicalizer": z.array(z.union([z.array(z.null()), MonaziteClassSchema, z.string()])),
+    "prefreshman": z.array(z.union([z.array(z.null()), PrefreshmanClassSchema, z.string()])),
+    "prehensility": z.array(z.union([z.array(z.null()), z.boolean(), MonaziteClassSchema])),
+    "prevoidance": z.array(z.union([z.array(z.number().int()), MonaziteClassSchema, z.number().int()])),
+    "probant": z.array(z.record(z.string(), z.union([z.null(), z.number().int()]))),
+    "protext": z.array(z.union([z.array(z.number().int()), z.boolean(), MonaziteClassSchema])),
+});
diff --git a/head/typescript-zod/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts b/head/typescript-zod/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
new file mode 100644
index 0000000..0c08975
--- /dev/null
+++ b/head/typescript-zod/test/inputs/json/priority/combinations4.json/just-schema-true--8c4ca457bcba/TopLevel.ts
@@ -0,0 +1,440 @@
+import * as z from "zod";
+
+
+export const PulpitismClassSchema = z.object({
+    "abnet": z.null(),
+    "buckhorn": z.null(),
+    "calciform": z.null(),
+    "chelophore": z.null(),
+    "cogitation": z.null(),
+    "decreeable": z.null(),
+    "despicable": z.null(),
+    "isodiazo": z.null(),
+    "jadedly": z.null(),
+    "leptochlorite": z.null(),
+    "nursling": z.null(),
+    "palamedean": z.null(),
+    "photoheliograph": z.null(),
+    "pipewood": z.null(),
+    "roberd": z.null(),
+    "statable": z.null(),
+    "superassume": z.null(),
+    "syllabe": z.null(),
+    "toughhead": z.null(),
+    "underburn": z.null(),
+});
+
+export const PyodermiaClassSchema = z.object({
+    "aphoristically": z.null(),
+    "apophyllous": z.null(),
+    "cognize": z.null(),
+    "dermonosology": z.null(),
+    "Gyppo": z.null(),
+    "ither": z.null(),
+    "juglandaceous": z.null(),
+    "litho": z.null(),
+    "macropterous": z.null(),
+    "photographer": z.null(),
+    "romancing": z.null(),
+    "rumness": z.null(),
+    "somniloquist": z.null(),
+    "stressfully": z.null(),
+    "tactically": z.null(),
+    "tracheophony": z.null(),
+    "unappositely": z.null(),
+    "unclothedly": z.null(),
+    "unimplied": z.null(),
+    "unsyncopated": z.null(),
+});
+
+export const QuebrachineClassSchema = z.object({
+    "catharticalness": z.number(),
+    "Chirotherium": z.number().int(),
+    "disdiapason": z.string(),
+    "homocerc": z.boolean(),
+    "nonbookish": z.null(),
+});
+
+export const ReimagineSchema = z.object({
+    "adducible": z.null().optional(),
+    "anabolin": z.null().optional(),
+    "brainy": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "chrysamine": z.null().optional(),
+    "disdiapason": z.string().optional(),
+    "fluxweed": z.null().optional(),
+    "glaucine": z.null().optional(),
+    "grobianism": z.null().optional(),
+    "Hermo": z.null().optional(),
+    "hieroglyphist": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "icteroid": z.null().optional(),
+    "immortal": z.null().optional(),
+    "impetulant": z.null().optional(),
+    "irrigate": z.null().optional(),
+    "myxedema": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "onyx": z.null().optional(),
+    "repasser": z.null().optional(),
+    "septomarginal": z.null().optional(),
+    "subdie": z.null().optional(),
+    "tibiometatarsal": z.null().optional(),
+    "waltzlike": z.null().optional(),
+});
+
+export const RessautSchema = z.object({
+    "apperceptive": z.string(),
+    "cuttoo": z.string(),
+    "douser": z.string(),
+    "drinkproof": z.string(),
+    "forementioned": z.string(),
+    "Freesia": z.string(),
+    "Genevieve": z.string(),
+    "hyperdiabolical": z.string(),
+    "hypocone": z.string(),
+    "irreverentially": z.string(),
+    "jumart": z.string(),
+    "Mimosaceae": z.string(),
+    "mollicrush": z.string(),
+    "nedder": z.string(),
+    "retinasphalt": z.string(),
+    "sough": z.string(),
+    "steading": z.string(),
+    "Theopaschitism": z.string(),
+    "undurableness": z.string(),
+    "unmingleable": z.string(),
+});
+
+export const RewriteClassSchema = z.object({
+    "accountancy": z.null(),
+    "cacotrophic": z.null(),
+    "contest": z.null(),
+    "couthily": z.null(),
+    "falculate": z.null(),
+    "foreseize": z.null(),
+    "Hyades": z.null(),
+    "lemnad": z.null(),
+    "monotheistically": z.null(),
+    "nonflying": z.null(),
+    "Ptenoglossa": z.null(),
+    "repatch": z.null(),
+    "rodman": z.null(),
+    "strung": z.null(),
+    "titmal": z.null(),
+    "twalpennyworth": z.null(),
+    "unblamable": z.null(),
+    "vertical": z.null(),
+    "Whiggification": z.null(),
+    "yardman": z.null(),
+});
+
+export const SantirClassSchema = z.object({
+    "admiredly": z.null(),
+    "demicaponier": z.null(),
+    "epitympanic": z.null(),
+    "investitor": z.null(),
+    "lupiform": z.null(),
+    "monoflagellate": z.null(),
+    "paleoethnic": z.null(),
+    "prediscountable": z.null(),
+    "rhetoricals": z.null(),
+    "roomth": z.null(),
+    "saccharose": z.null(),
+    "septonasal": z.null(),
+    "serpenticide": z.null(),
+    "setarious": z.null(),
+    "spaework": z.null(),
+    "stylite": z.null(),
+    "Suessiones": z.null(),
+    "timelily": z.null(),
+    "unprofaned": z.null(),
+    "vorticular": z.null(),
+});
+
+export const SaxtenClassSchema = z.object({
+    "algarrobilla": z.null().optional(),
+    "bowgrace": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "Centaurid": z.null().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "flix": z.null().optional(),
+    "germanely": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "inhume": z.null().optional(),
+    "lepidote": z.null().optional(),
+    "megalochirous": z.null().optional(),
+    "ninepenny": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "nondeist": z.null().optional(),
+    "nymphaeaceous": z.null().optional(),
+    "parietofrontal": z.null().optional(),
+    "sancyite": z.null().optional(),
+    "subjectivist": z.null().optional(),
+    "tibiad": z.null().optional(),
+    "transonic": z.null().optional(),
+    "tripetalous": z.null().optional(),
+    "trunchman": z.null().optional(),
+    "urger": z.null().optional(),
+    "withdrawnness": z.null().optional(),
+});
+
+export const ScattySchema = z.object({
+    "aeriferous": z.null(),
+    "antical": z.null(),
+    "antighostism": z.null(),
+    "arcanum": z.null(),
+    "autotrophy": z.null(),
+    "baronial": z.null(),
+    "caffeine": z.null(),
+    "gorgoniacean": z.null(),
+    "heroical": z.null(),
+    "hydropical": z.null(),
+    "mechanology": z.null(),
+    "musicopoetic": z.null(),
+    "officiality": z.null(),
+    "oftentimes": z.null(),
+    "ophthalmotonometer": z.null(),
+    "reflectively": z.null(),
+    "springer": z.null(),
+    "Tabasco": z.null(),
+    "teleianthous": z.null(),
+    "uncombated": z.null(),
+});
+
+export const SisteringClassSchema = z.object({
+    "amphicarpic": z.null(),
+    "Chianti": z.null(),
+    "frigorific": z.null(),
+    "Haplomi": z.null(),
+    "hyperkinesis": z.null(),
+    "laudable": z.null(),
+    "madwoman": z.null(),
+    "maimedly": z.null(),
+    "Micropterygidae": z.null(),
+    "microrhabdus": z.null(),
+    "nondense": z.null(),
+    "phlebemphraxis": z.null(),
+    "redsear": z.null(),
+    "schismatical": z.null(),
+    "tartryl": z.null(),
+    "unabhorred": z.null(),
+    "undeliberateness": z.null(),
+    "unmixable": z.null(),
+    "untruckling": z.null(),
+    "vineal": z.null(),
+});
+
+export const StaghuntingSchema = z.object({
+    "calorimetric": z.number().int().optional(),
+    "canid": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "ditriglyphic": z.number().int().optional(),
+    "floriferousness": z.number().int().optional(),
+    "gamelike": z.number().int().optional(),
+    "grig": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "interloan": z.number().int().optional(),
+    "lithotomy": z.number().int().optional(),
+    "loric": z.number().int().optional(),
+    "membranocoriaceous": z.number().int().optional(),
+    "membranogenic": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "overtrump": z.number().int().optional(),
+    "scotino": z.number().int().optional(),
+    "seasonable": z.number().int().optional(),
+    "sephen": z.number().int().optional(),
+    "stigmarioid": z.number().int().optional(),
+    "tired": z.number().int().optional(),
+    "trifid": z.number().int().optional(),
+    "undefeatedly": z.number().int().optional(),
+    "ungirlish": z.number().int().optional(),
+});
+
+export const StrenuosityClassSchema = z.object({
+    "bliss": z.number().int().optional(),
+    "buccate": z.number().int().optional(),
+    "bulletproof": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "crumblingness": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "engagedly": z.number().int().optional(),
+    "fightable": z.number().int().optional(),
+    "hoariness": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "hypopodium": z.number().int().optional(),
+    "luxurist": z.number().int().optional(),
+    "mechanician": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "Onopordon": z.number().int().optional(),
+    "podgily": z.number().int().optional(),
+    "reformableness": z.number().int().optional(),
+    "scatterbrains": z.number().int().optional(),
+    "seminuria": z.number().int().optional(),
+    "Sodomite": z.number().int().optional(),
+    "tramp": z.number().int().optional(),
+    "undueness": z.number().int().optional(),
+    "worthily": z.number().int().optional(),
+    "Yankeeist": z.number().int().optional(),
+});
+
+export const TruantcyClassSchema = z.object({
+    "alfiona": z.null().optional(),
+    "ascaridiasis": z.null().optional(),
+    "bungey": z.null().optional(),
+    "catharticalness": z.number().optional(),
+    "ceroxyle": z.null().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "chorology": z.null().optional(),
+    "disdiapason": z.string().optional(),
+    "enmarble": z.null().optional(),
+    "Epeira": z.null().optional(),
+    "Eurylaimi": z.null().optional(),
+    "germination": z.null().optional(),
+    "hallelujah": z.null().optional(),
+    "homocerc": z.boolean().optional(),
+    "lev": z.null().optional(),
+    "mouthing": z.null().optional(),
+    "nonbookish": z.null().optional(),
+    "philliloo": z.null().optional(),
+    "planetal": z.null().optional(),
+    "poney": z.null().optional(),
+    "punctualist": z.null().optional(),
+    "returnlessly": z.null().optional(),
+    "skelder": z.null().optional(),
+    "windwaywardly": z.null().optional(),
+    "Yuman": z.null().optional(),
+});
+
+export const UnimpeachablyClassSchema = z.object({
+    "acerin": z.number().int().optional(),
+    "Bobadil": z.number().int().optional(),
+    "catharticalness": z.number().optional(),
+    "Chirotherium": z.number().int().optional(),
+    "chlorophylligenous": z.number().int().optional(),
+    "conversational": z.number().int().optional(),
+    "demiowl": z.number().int().optional(),
+    "disdiapason": z.string().optional(),
+    "ectorhinal": z.number().int().optional(),
+    "gamblesomeness": z.number().int().optional(),
+    "homocerc": z.boolean().optional(),
+    "irrorate": z.number().int().optional(),
+    "kindergartening": z.number().int().optional(),
+    "lateritic": z.number().int().optional(),
+    "mespil": z.number().int().optional(),
+    "misconfiguration": z.number().int().optional(),
+    "nonbookish": z.null().optional(),
+    "planometry": z.number().int().optional(),
+    "Quiina": z.number().int().optional(),
+    "Robert": z.number().int().optional(),
+    "rot": z.number().int().optional(),
+    "subcinctorium": z.number().int().optional(),
+    "tussocker": z.number().int().optional(),
+    "ultraproud": z.number().int().optional(),
+    "unsuggestedness": z.number().int().optional(),
+});
+
+export const UnstressedClassSchema = z.object({
+    "Alain": z.null(),
+    "Amphirhina": z.null(),
+    "antimachinery": z.null(),
+    "coldish": z.null(),
+    "crantara": z.null(),
+    "distinguishing": z.null(),
+    "elytroposis": z.null(),
+    "gentianwort": z.null(),
+    "heliosis": z.null(),
+    "instrumental": z.null(),
+    "introinflection": z.null(),
+    "kala": z.null(),
+    "Lincolnian": z.null(),
+    "metad": z.null(),
+    "Sarcophilus": z.null(),
+    "swingingly": z.null(),
+    "unconformity": z.null(),
+    "undecreed": z.null(),
+    "venerable": z.null(),
+    "vowellessness": z.null(),
+});
+
+export const WrothyClassSchema = z.object({
+    "Aeschynanthus": z.null(),
+    "aquiferous": z.null(),
+    "cheapener": z.null(),
+    "enumeration": z.null(),
+    "Ephesine": z.null(),
+    "escadrille": z.null(),
+    "estrous": z.null(),
+    "interestedly": z.null(),
+    "katakinetomer": z.null(),
+    "mortification": z.null(),
+    "morula": z.null(),
+    "orthosymmetrical": z.null(),
+    "overbark": z.null(),
+    "politist": z.null(),
+    "qualified": z.null(),
+    "sphenomalar": z.null(),
+    "throatful": z.null(),
+    "transhumance": z.null(),
+    "triandrian": z.null(),
+    "unbooked": z.null(),
+});
+
+export const TopLevelSchema = z.object({
+    "protrusive": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), z.number()])),
+    "pulpitism": z.array(z.union([z.array(z.number().int()), PulpitismClassSchema, z.number()])),
+    "pyodermia": z.array(z.union([PyodermiaClassSchema, z.number().int()])),
+    "quebrachine": z.array(z.union([z.null(), z.boolean(), QuebrachineClassSchema])),
+    "querier": z.array(z.union([z.boolean(), z.record(z.string(), z.number().int())])),
+    "rebarbative": z.array(z.union([z.array(z.number().int()), z.boolean(), z.number()])),
+    "reimagine": z.array(ReimagineSchema),
+    "ressaut": RessautSchema,
+    "retrocervical": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), z.number().int()])),
+    "revert": z.array(z.union([z.boolean(), z.string()])),
+    "rewrite": z.array(z.union([z.array(z.null()), RewriteClassSchema, z.number()])),
+    "saccoderm": z.array(z.union([z.null(), z.array(z.number().int()), z.string()])),
+    "santir": z.array(z.union([SantirClassSchema, z.number()])),
+    "saprophilous": z.array(z.union([z.null(), z.record(z.string(), z.number().int()), z.string()])),
+    "saxten": z.array(z.union([SaxtenClassSchema, z.string()])),
+    "scatty": z.array(z.union([z.null(), ScattySchema])),
+    "scoffer": z.array(z.union([z.null(), z.array(z.null()), z.record(z.string(), z.number().int())])),
+    "scrampum": z.array(z.union([z.null(), z.array(z.number().int()), z.boolean()])),
+    "semantic": z.number(),
+    "serpentinic": z.array(z.union([z.array(z.number().int()), z.number()])),
+    "shadowable": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), z.boolean()])),
+    "sistering": z.array(z.union([z.array(z.null()), SisteringClassSchema, z.number().int()])),
+    "staghunting": z.array(StaghuntingSchema),
+    "stagmometer": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), z.string()])),
+    "stimulability": z.array(z.union([z.boolean(), z.number().int(), z.record(z.string(), z.number().int())])),
+    "strangleable": z.array(z.union([z.array(z.null()), z.number()])),
+    "strenuosity": z.array(z.union([z.array(z.null()), StrenuosityClassSchema])),
+    "tabaxir": z.array(z.union([z.boolean(), z.number()])),
+    "talpiform": z.array(z.union([z.null(), QuebrachineClassSchema, z.number()])),
+    "thwack": z.array(z.union([z.boolean(), QuebrachineClassSchema, z.number()])),
+    "to": z.array(z.union([z.null(), z.number()])),
+    "tortricine": z.array(z.union([z.array(z.union([z.null(), z.number().int()])), QuebrachineClassSchema])),
+    "truantcy": z.array(z.union([z.boolean(), TruantcyClassSchema])),
+    "turgesce": z.array(z.string()),
+    "unbeginning": z.array(z.union([z.array(z.null()), z.record(z.string(), z.number().int()), z.string()])),
+    "underdunged": z.array(z.number()),
+    "undesirability": z.array(z.union([z.array(z.number().int()), z.record(z.string(), z.number().int()), z.string()])),
+    "unerasing": z.array(z.union([z.array(z.null()), z.number().int(), z.record(z.string(), z.number().int())])),
+    "unguentarium": z.array(z.union([z.null(), z.array(z.null()), z.number().int()])),
+    "unimpeachably": z.array(z.union([z.boolean(), UnimpeachablyClassSchema])),
+    "unmortgaged": z.array(z.union([z.null(), z.number(), z.record(z.string(), z.number().int())])),
+    "unobstructed": z.array(z.union([z.null(), QuebrachineClassSchema, z.number().int()])),
+    "unreceptivity": z.array(z.union([z.array(z.null()), z.number().int(), z.string()])),
+    "unsatisfactoriness": z.array(z.union([z.array(z.number().int()), z.boolean(), z.number().int()])),
+    "unsecurity": z.array(z.number().int()),
+    "unstressed": z.array(z.union([z.boolean(), UnstressedClassSchema, z.string()])),
+    "untasked": z.array(z.union([z.array(z.null()), z.number(), z.record(z.string(), z.number().int())])),
+    "unvarying": z.array(z.union([z.boolean(), z.number(), z.record(z.string(), z.number().int())])),
+    "vehemently": z.array(z.union([z.null(), z.array(z.null()), z.boolean()])),
+    "warriorship": z.record(z.string(), z.boolean()),
+    "whitepot": z.array(z.union([QuebrachineClassSchema, z.number()])),
+    "wrothy": z.array(z.union([z.array(z.null()), WrothyClassSchema])),
+});
diff --git a/base/typescript-zod/test/inputs/json/priority/keywords.json/default/TopLevel.ts b/head/typescript-zod/test/inputs/json/priority/keywords.json/default/TopLevel.ts
index 2950ede..dd2c523 100644
--- a/base/typescript-zod/test/inputs/json/priority/keywords.json/default/TopLevel.ts
+++ b/head/typescript-zod/test/inputs/json/priority/keywords.json/default/TopLevel.ts
@@ -1076,6 +1076,11 @@ export const RightSchema = z.object({
 });
 export type Right = z.infer<typeof RightSchema>;
 
+export const SSchema = z.object({
+    "s": z.number().int(),
+});
+export type S = z.infer<typeof SSchema>;
+
 export const SbyteSchema = z.object({
     "sbyte": z.number().int(),
 });
@@ -1628,6 +1633,7 @@ export const Obj4Schema = z.object({
     "rethrows": RethrowsSchema,
     "return": ReturnSchema,
     "right": RightSchema,
+    "s": SSchema,
     "sbyte": SbyteSchema,
     "sealed": SealedSchema,
     "SEL": SelSchema,
diff --git a/head/typescript-zod/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts b/head/typescript-zod/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts
new file mode 100644
index 0000000..ccf0bd3
--- /dev/null
+++ b/head/typescript-zod/test/inputs/json/samples/objc-control-characters.json/default/TopLevel.ts
@@ -0,0 +1,10 @@
+import * as z from "zod";
+
+
+export const TopLevelSchema = z.object({
+    "\u0000\u0001\u001b\u001f": z.string(),
+    "\ud83d\ude00": z.string(),
+    "\u007f\u0080\u0085\u009f": z.string(),
+    "\\u001b": z.string(),
+});
+export type TopLevel = z.infer<typeof TopLevelSchema>;
