From de1124a16b50575c15abdf83e0bfc0636e5be5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Ga=C5=82at?= Date: Mon, 23 Oct 2023 10:49:23 +0200 Subject: [PATCH] shell: improve JSON module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit new module is a preprocessor macro that generate printf arguments. It is lighter because it does not require any aditional buffor to format Signed-off-by: Robert Gałat --- samples/sid_dut/src/sid_thread.c | 45 +- samples/template_ble/src/sidewalk_callbacks.c | 19 +- .../template_subghz/src/sidewalk_callbacks.c | 17 +- utils/include/json_printer.h | 425 +++++++++++------- utils/include/sidTypes2Json.h | 147 ++++-- utils/src/shell.c | 96 ++-- 6 files changed, 452 insertions(+), 297 deletions(-) diff --git a/samples/sid_dut/src/sid_thread.c b/samples/sid_dut/src/sid_thread.c index 6f2186510a..b119fcab84 100644 --- a/samples/sid_dut/src/sid_thread.c +++ b/samples/sid_dut/src/sid_thread.c @@ -5,6 +5,7 @@ */ #include "sid_error.h" +#include "zephyr/sys/printk.h" #include #include #include @@ -35,19 +36,6 @@ #include #include -#undef JSON_RAW_PRINT -#define JSON_MESSAGE_CAPACITY 512 -char JSON_MESSAGE[JSON_MESSAGE_CAPACITY + 1] = { 0 }; -size_t JSON_CHARS_WRITTEN = 0; -#define JSON_PREPARE memset(JSON_MESSAGE, 0, JSON_MESSAGE_CAPACITY) - -#define JSON_SEND \ - LOG_RAW("%s", JSON_MESSAGE); \ - JSON_CHARS_WRITTEN = 0 -#define JSON_RAW_PRINT(format, ...) \ - JSON_RAW_PRINTER_STRING(JSON_MESSAGE, JSON_CHARS_WRITTEN, JSON_MESSAGE_CAPACITY, \ - format __VA_OPT__(, ) __VA_ARGS__) - #if !FIXED_PARTITION_EXISTS(mfg_storage) #error "Flash partition is not defined for the Sidewalk manufacturing storage!!" #endif @@ -114,32 +102,35 @@ static void on_sidewalk_event(bool in_isr, void *context) static void on_sidewalk_msg_received(const struct sid_msg_desc *msg_desc, const struct sid_msg *msg, void *context) { - JSON_PREPARE; - JSON_DICT("on_msg_received", true, - { JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, true, JSON_LAST); }); - JSON_SEND; + struct app_context *ctx = (struct app_context *)context; + shell_fprintf(ctx->shell, SHELL_NORMAL, + JSON_NEW_LINE(JSON_OBJ( + JSON_NAME("on_msg_received", + JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 1))))); LOG_DBG("Sidewalk -> App"); LOG_HEXDUMP_INF(msg->data, msg->size, ""); } static void on_sidewalk_msg_sent(const struct sid_msg_desc *msg_desc, void *context) { - JSON_PREPARE; - JSON_DICT("on_msg_sent", true, - { JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, false, JSON_LAST); }); - JSON_SEND; + struct app_context *ctx = (struct app_context *)context; + shell_fprintf(ctx->shell, SHELL_NORMAL, + JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_msg_sent", + JSON_OBJ(JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 0)))))); LOG_DBG("Sidewalk -> App"); } static void on_sidewalk_send_error(sid_error_t error, const struct sid_msg_desc *msg_desc, void *context) { - JSON_PREPARE; - JSON_DICT("on_send_error", true, { - JSON_VAL_sid_error_t("error", error, JSON_NEXT); - JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, false, JSON_LAST); - }); - JSON_SEND; + struct app_context *ctx = (struct app_context *)context; + shell_fprintf(ctx->shell, SHELL_NORMAL, + JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_send_error", + JSON_OBJ(JSON_LIST_2(JSON_VAL_sid_error_t("error", error), + JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, + 0))))))); LOG_DBG("Sidewalk -> App: error %d", error); } diff --git a/samples/template_ble/src/sidewalk_callbacks.c b/samples/template_ble/src/sidewalk_callbacks.c index 83f85c3ce1..3d315ba8b0 100644 --- a/samples/template_ble/src/sidewalk_callbacks.c +++ b/samples/template_ble/src/sidewalk_callbacks.c @@ -25,8 +25,6 @@ static const uint8_t *link_mode_idx_name[] = { "ble", "fsk", "lora" }; #include #include -#undef JSON_RAW_PRINT -#define JSON_RAW_PRINT(format, ...) LOG_RAW(format __VA_OPT__(, ) __VA_ARGS__) static void on_sidewalk_event(bool in_isr, void *context) { @@ -45,8 +43,9 @@ static void on_sidewalk_msg_received(const struct sid_msg_desc *msg_desc, const LOG_DBG("received message(type: %d, link_mode: %d, id: %u size %u)", (int)msg_desc->type, (int)msg_desc->link_mode, msg_desc->id, msg->size); LOG_HEXDUMP_INF((uint8_t *)msg->data, msg->size, "Message data: "); - JSON_DICT("on_msg_received", true, - { JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, true, JSON_LAST); }); + + printk(JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_msg_received", JSON_OBJ(JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 1)))))); } static void on_sidewalk_msg_sent(const struct sid_msg_desc *msg_desc, void *context) @@ -56,8 +55,8 @@ static void on_sidewalk_msg_sent(const struct sid_msg_desc *msg_desc, void *cont CLI_register_message_send(); #endif LOG_INF("sent message(type: %d, id: %u)", (int)msg_desc->type, msg_desc->id); - JSON_DICT("on_msg_sent", true, - { JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, false, JSON_LAST); }); + printk(JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_msg_sent", JSON_OBJ(JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 0)))))); } static void on_sidewalk_send_error(sid_error_t error, const struct sid_msg_desc *msg_desc, @@ -70,10 +69,10 @@ static void on_sidewalk_send_error(sid_error_t error, const struct sid_msg_desc LOG_ERR("failed to send message(type: %d, id: %u), err:%d", (int)msg_desc->type, msg_desc->id, (int)error); - JSON_DICT("on_send_error", true, { - JSON_VAL_sid_error_t("error", error, JSON_NEXT); - JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, false, JSON_LAST); - }); + printk(JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_send_error", + JSON_OBJ(JSON_LIST_2(JSON_VAL_sid_error_t("error", error), + JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 0))))))); } static void on_sidewalk_status_changed(const struct sid_status *status, void *context) diff --git a/samples/template_subghz/src/sidewalk_callbacks.c b/samples/template_subghz/src/sidewalk_callbacks.c index 208d3cc90c..d81e82f6cc 100644 --- a/samples/template_subghz/src/sidewalk_callbacks.c +++ b/samples/template_subghz/src/sidewalk_callbacks.c @@ -25,6 +25,7 @@ static const uint8_t *link_mode_idx_name[] = { "ble", "fsk", "lora" }; #include #include + #undef JSON_RAW_PRINT #define JSON_RAW_PRINT(format, ...) LOG_RAW(format __VA_OPT__(, ) __VA_ARGS__) @@ -45,8 +46,8 @@ static void on_sidewalk_msg_received(const struct sid_msg_desc *msg_desc, const LOG_DBG("received message(type: %d, link_mode: %d, id: %u size %u)", (int)msg_desc->type, (int)msg_desc->link_mode, msg_desc->id, msg->size); LOG_HEXDUMP_INF((uint8_t *)msg->data, msg->size, "Message data: "); - JSON_DICT("on_msg_received", true, - { JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, true, JSON_LAST); }); + printk(JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_msg_received", JSON_OBJ(JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 1)))))); } static void on_sidewalk_msg_sent(const struct sid_msg_desc *msg_desc, void *context) @@ -56,8 +57,8 @@ static void on_sidewalk_msg_sent(const struct sid_msg_desc *msg_desc, void *cont CLI_register_message_send(); #endif LOG_INF("sent message(type: %d, id: %u)", (int)msg_desc->type, msg_desc->id); - JSON_DICT("on_msg_sent", true, - { JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, false, JSON_LAST); }); + printk(JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_msg_sent", JSON_OBJ(JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 0)))))); } static void on_sidewalk_send_error(sid_error_t error, const struct sid_msg_desc *msg_desc, @@ -69,10 +70,10 @@ static void on_sidewalk_send_error(sid_error_t error, const struct sid_msg_desc #endif LOG_ERR("failed to send message(type: %d, id: %u), err:%d", (int)msg_desc->type, msg_desc->id, (int)error); - JSON_DICT("on_send_error", true, { - JSON_VAL_sid_error_t("error", error, JSON_NEXT); - JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, false, JSON_LAST); - }); + printk(JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "on_send_error", + JSON_OBJ(JSON_LIST_2(JSON_VAL_sid_error_t("error", error), + JSON_VAL_sid_msg_desc("sid_msg_desc", msg_desc, 0))))))); } static void on_sidewalk_status_changed(const struct sid_status *status, void *context) diff --git a/utils/include/json_printer.h b/utils/include/json_printer.h index 44f8c7205c..b26caca2ee 100644 --- a/utils/include/json_printer.h +++ b/utils/include/json_printer.h @@ -1,204 +1,299 @@ /* - * Copyright (c) 2022 Nordic Semiconductor ASA + * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ -#include - -/* Redefine this macro before use to redirect json output */ -#define JSON_RAW_PRINT(format, ...) JSON_RAW_PRINTER_SHELL(shell, format __VA_OPT__(, ) __VA_ARGS__) - /** - * @brief Implementation of JSON_RAW_PRINT that sends the messages to shell - * @arg shell pointer to shell object - */ -#define JSON_RAW_PRINTER_SHELL(shell, format, ...) \ - shell_fprintf(shell, SHELL_NORMAL, format __VA_OPT__(, ) __VA_ARGS__) + * @brief This module is a zero cost abstraction to prepare JSON string representation of objects. + * It works by generating list of arguments for printf function. + * + * Benefits and limitations: + * - Because the macros are expanded by preprocessor, they can not be used by other macros like LOG_*, They should be used with functions like + * printk, shell_printk, z_log_minimal_printk. + * - There is no need to create any JSON object, or prepare memory buffor for storing string representation, it is essentially very sophisticated way generate printf arguments. + * - New types can be easily created, any structure can be eventually simplified to the basic types that are already defined + * - Number of elements in JSON objects and arrays have to be known at compile time, so it is impossible to use this module for printing array with size unknown at compile time + * - The macro must be evaluated by preprocessor to simple list of arguments for printf function, therefore there can not be any conditional code inside macro + * + * Example: + * printf(JSON_OBJ(JSON_NAME("my_variable_name", JOSN_INT(123)))); + * + * printf("{" "\"%s\" : %d" "}", "my_variable_name", 123); + * > {"my_variable_name": 123} + * + * Example 2: + * + * printf(JSON_OBJ(JSON_NAME("array", JSON_ARRAY(JSON_LIST_2(JSON_INT(3), JSON_FLOAT(3.14))))); + * > {"array": [3, 3.14]} + * + * Example 3: + * + * printf(JSON_OBJ(JSON_LIST_2( + JSON_NAME("array", JSON_ARRAY(JSON_LIST_2( + JSON_INT(3), JSON_FLOAT(3.14) + ))), + JSON_NAME("dictionary", JSON_OBJ(JSON_NAME("JSON_is_great", true))) + ))); + * > {"array": [3, 3.14], "dictionary": {"JSON_is_great": true}} + * + */ /** - * @brief Implementation of JSON_RAW_PRINT that sends the messages to log + * @brief prepare printf formater and arguments to print variable * + * @arg val: intiger value to print */ -#define JSON_RAW_PRINTER_LOG(format, ...) LOG_RAW(format __VA_OPT__(, ) __VA_ARGS__) +#define JSON_INT(val) "%d", val /** - * @brief Implementation of JSON_RAW_PRINT that sends the messages to memory buffer - * @arg out memory buffer - * @arg chars_written variable that stores the count of written characters - * @arg capacity size of the out buffer + * @brief prepare printf formater and arguments to print variable * + * @arg val: float value to print */ -#define JSON_RAW_PRINTER_STRING(out, chars_written, capacity, format, ...) \ - { \ - do { \ - int printed_chars = \ - snprintf(out + chars_written, capacity - chars_written, \ - format __VA_OPT__(, ) __VA_ARGS__); \ - if (printed_chars < 0) { \ - LOG_ERR("Failed to add message to JSON string"); \ - } else { \ - chars_written += printed_chars; \ - } \ - } while (0); \ - } +#define JSON_FLOAT(val) "%f", val /** - * @brief handler for printing JSON values, uses JSON_RAW_PRINT to redirect message - * @arg indent if set to true, the JSON will be printed in multiline mode with indentation of 1 tab - * + * @brief prepare printf formater and arguments to print variable + * + * @arg val: bool value to print */ -#define JSON_PRINT(indent, format, ...) \ - { \ - if (JSON_INDENT) { \ - for (int i = 0; i < indent; i++) { \ - JSON_RAW_PRINT("\t"); \ - }; \ - JSON_RAW_PRINT(format "\n" __VA_OPT__(, ) __VA_ARGS__); \ - } else { \ - JSON_RAW_PRINT(format __VA_OPT__(, ) __VA_ARGS__); \ - } \ - } +#define JSON_BOOL(val) "%s", val ? "true" : "false" /** - * @brief value of comma_or_empty argument in JSON_VAL_* macros that signals that this is the last value in array or dict + * @brief prepare printf formater and arguments to print variable * + * @arg val: char* value to print */ -#define JSON_LAST "" +#define JSON_STR(val) "\"%s\"", val + /** - * @brief value of comma_or_empty argument in JSON_VAL_* macros that signals that this is not the last value in array or dict + * @brief Append new line at the end of JSON string passed as argument * */ -#define JSON_NEXT ", " +#define JSON_NEW_LINE(JSON) _JSON_FORMAT(JSON) "\n" _JSON_ARGS(JSON) /** - * @brief Create JSON starting from root dictionary element - * @arg name the key to the dictionary - * @arg in_line print JSON in single line or multiline (true = single line /false = multi line) + * @brief add name to the JSON value, object or array. * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_INT("v1", 3, JSON_LAST)) - ``` - * {"test": {"v1": 3}} */ -#define JSON_DICT(name, in_line, ...) \ - { \ - int indent = 0; \ - bool JSON_INDENT = (in_line == false); \ - JSON_PRINT(indent, "{"); \ - JSON_VAL_DICT(name, JSON_LAST, { __VA_ARGS__ }); \ - JSON_PRINT(indent, "}\n"); \ - } +#define JSON_NAME(name, json_object) \ + "\"%s\": " _JSON_FORMAT(json_object), name _JSON_ARGS(json_object) -/** - * @brief Add N string elements to dictionary from arrays with key and values - * @arg key_array array with names of the string values - * @arg val_array array with values, must have the same size as key_array - * @arg array_size number of elements in key_array/val_array - * - * example output: - ``` - char* key_arr[2] = {"var1", "var2"}; - char* val_arr[2] = {"value1", "value2"}; - JSON_DICT("example", false, JSON_VAL_STR_ENUMERATE(key_arr, val_arr, 2, JSON_LAST)) - ``` - * {"example": {"var1": "value1", "var2": "value2"}} - */ -#define JSON_VAL_STR_ENUMERATE(key_array, val_array, array_size, comma_or_empty) \ - { \ - for (int i = 0; i < array_size - 1; i++) { \ - JSON_VAL_STR(key_array[i], val_array[i], JSON_NEXT); \ - } \ - JSON_VAL_STR(key_array[array_size - 1], val_array[array_size - 1], \ - comma_or_empty); \ - } +#define _JSON_FORMAT(format, ...) format +#define _JSON_ARGS(format, ...) __VA_OPT__(, ) __VA_ARGS__ /** - * @brief Add INT value to the dict or array - * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_INT("v1", 3, JSON_LAST)) - ``` - * {"test": {"v1": 3}} + * @brief Create JSON array + * @param obj content of JSON object. Only valid value for this argument is one of JSON_LIST_X macros */ -#define JSON_VAL_INT(key, val, comma_or_empty) \ - { \ - JSON_PRINT(indent, "\"%s\": %ld" comma_or_empty, (char *)key, (long int)val); \ - } +#define JSON_ARRAY(obj) "[" _JSON_FORMAT(obj) "]" _JSON_ARGS(obj) /** - * @brief Add FLOAT value to the dict or array - * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_FLOAT("v1", 3.14, JSON_LAST)) - ``` - * {"test": {"v1": 3.14}} + * @brief Create JSON object + * @param obj content of JSON object. Only valid value for this argument is one of JSON_LIST_X macros + * to create a dictionary the JSON_LIST_X have to take JSON_NAME for every argument */ -#define JSON_VAL_FLOAT(key, val, comma_or_empty) \ - { \ - JSON_PRINT(indent, "\"%s\": %f" comma_or_empty, (char *)key, val); \ - } +#define JSON_OBJ(obj) "{" _JSON_FORMAT(obj) "}" _JSON_ARGS(obj) -/** - * @brief Add DOUBLE value to the dict or array - * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_DOUBLE("v1", 3.14, JSON_LAST)) - ``` - * {"test": {"v1": 3.14}} - */ -#define JSON_VAL_DOUBLE(key, val, comma_or_empty) \ - { \ - JSON_PRINT(indent, "\"%s\": %lf" comma_or_empty, (char *)key, val); \ - } +// clang-format off +#define JSON_LIST_1(_1) \ +_JSON_FORMAT(_1) _JSON_ARGS(_1) -/** - * @brief Add BOOL value to the dict or array - * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_BOOL("v1", 23, JSON_LAST)) - ``` - * {"test": {"v1": true}} - */ -#define JSON_VAL_BOOL(key, val, comma_or_empty) \ - { \ - JSON_PRINT(indent, "\"%s\": %s" comma_or_empty, (char *)key, \ - val ? "true" : "false"); \ - } +#define JSON_LIST_2(_1, _2) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) -/** - * @brief Add STR value to the dict or array - * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_STR("v1", "message", JSON_LAST)) - ``` - * {"test": {"v1": "message"}} - */ -#define JSON_VAL_STR(key, str, comma_or_empty) \ - { \ - JSON_PRINT(indent, "\"%s\": \"%s\"" comma_or_empty, (char *)key, (char *)str); \ - } +#define JSON_LIST_3(_1, _2, _3) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) -/** - * @brief Add DICT object to the dict or array - * - * example output: - ``` - JSON_DICT("test", true, JSON_VAL_DICT("obj", JSON_LAST, JSON_VAL_STR("v1", "message", JSON_LAST))) - ``` - * {"test": {"obj":{"v1": "message"}}} - */ -#define JSON_VAL_DICT(key, comma_or_empty, ...) \ - { \ - JSON_PRINT(indent, "\"%s\": {", (char *)key); \ - indent++; \ - { __VA_ARGS__ }; \ - indent--; \ - JSON_PRINT(indent, "}" comma_or_empty); \ - } +#define JSON_LIST_4(_1, _2, _3, _4) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) + +#define JSON_LIST_5(_1, _2, _3, _4, _5) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) + +#define JSON_LIST_6(_1, _2, _3, _4, _5, _6) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) + +#define JSON_LIST_7(_1, _2, _3, _4, _5, _6, _7) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) + +#define JSON_LIST_8(_1, _2, _3, _4, _5, _6, _7, _8) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) + +#define JSON_LIST_9(_1, _2, _3, _4, _5, _6, _7, _8, _9) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) + +#define JSON_LIST_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) + +#define JSON_LIST_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) + +#define JSON_LIST_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) + +#define JSON_LIST_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) + +#define JSON_LIST_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) + +#define JSON_LIST_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) + +#define JSON_LIST_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) + +#define JSON_LIST_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) + +#define JSON_LIST_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) + +#define JSON_LIST_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) + +#define JSON_LIST_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) + +#define JSON_LIST_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) + +#define JSON_LIST_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) + +#define JSON_LIST_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23)\ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) + +#define JSON_LIST_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) + +#define JSON_LIST_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) + +#define JSON_LIST_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) + +#define JSON_LIST_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) + +#define JSON_LIST_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) + +#define JSON_LIST_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) + +#define JSON_LIST_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) + +#define JSON_LIST_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) + +#define JSON_LIST_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) + +#define JSON_LIST_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) + +#define JSON_LIST_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) + +#define JSON_LIST_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) + +#define JSON_LIST_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) + +#define JSON_LIST_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) + +#define JSON_LIST_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) + +#define JSON_LIST_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) + +#define JSON_LIST_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) + +#define JSON_LIST_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) + +#define JSON_LIST_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) + +#define JSON_LIST_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) + +#define JSON_LIST_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) + +#define JSON_LIST_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) ", " _JSON_FORMAT(_45) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) _JSON_ARGS(_45) + +#define JSON_LIST_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) ", " _JSON_FORMAT(_45) ", " _JSON_FORMAT(_46) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) _JSON_ARGS(_45) _JSON_ARGS(_46) + +#define JSON_LIST_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) ", " _JSON_FORMAT(_45) ", " _JSON_FORMAT(_46) ", " _JSON_FORMAT(_47) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) _JSON_ARGS(_45) _JSON_ARGS(_46) _JSON_ARGS(_47) + +#define JSON_LIST_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) ", " _JSON_FORMAT(_45) ", " _JSON_FORMAT(_46) ", " _JSON_FORMAT(_47) ", " _JSON_FORMAT(_48) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) _JSON_ARGS(_45) _JSON_ARGS(_46) _JSON_ARGS(_47) _JSON_ARGS(_48) + +#define JSON_LIST_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) ", " _JSON_FORMAT(_45) ", " _JSON_FORMAT(_46) ", " _JSON_FORMAT(_47) ", " _JSON_FORMAT(_48) ", " _JSON_FORMAT(_49) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) _JSON_ARGS(_45) _JSON_ARGS(_46) _JSON_ARGS(_47) _JSON_ARGS(_48) _JSON_ARGS(_49) + +#define JSON_LIST_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \ +_JSON_FORMAT(_1) ", " _JSON_FORMAT(_2) ", " _JSON_FORMAT(_3) ", " _JSON_FORMAT(_4) ", " _JSON_FORMAT(_5) ", " _JSON_FORMAT(_6) ", " _JSON_FORMAT(_7) ", " _JSON_FORMAT(_8) ", " _JSON_FORMAT(_9) ", " _JSON_FORMAT(_10) ", " _JSON_FORMAT(_11) ", " _JSON_FORMAT(_12) ", " _JSON_FORMAT(_13) ", " _JSON_FORMAT(_14) ", " _JSON_FORMAT(_15) ", " _JSON_FORMAT(_16) ", " _JSON_FORMAT(_17) ", " _JSON_FORMAT(_18) ", " _JSON_FORMAT(_19) ", " _JSON_FORMAT(_20) ", " _JSON_FORMAT(_21) ", " _JSON_FORMAT(_22) ", " _JSON_FORMAT(_23) ", " _JSON_FORMAT(_24) ", " _JSON_FORMAT(_25) ", " _JSON_FORMAT(_26) ", " _JSON_FORMAT(_27) ", " _JSON_FORMAT(_28) ", " _JSON_FORMAT(_29) ", " _JSON_FORMAT(_30) ", " _JSON_FORMAT(_31) ", " _JSON_FORMAT(_32) ", " _JSON_FORMAT(_33) ", " _JSON_FORMAT(_34) ", " _JSON_FORMAT(_35) ", " _JSON_FORMAT(_36) ", " _JSON_FORMAT(_37) ", " _JSON_FORMAT(_38) ", " _JSON_FORMAT(_39) ", " _JSON_FORMAT(_40) ", " _JSON_FORMAT(_41) ", " _JSON_FORMAT(_42) ", " _JSON_FORMAT(_43) ", " _JSON_FORMAT(_44) ", " _JSON_FORMAT(_45) ", " _JSON_FORMAT(_46) ", " _JSON_FORMAT(_47) ", " _JSON_FORMAT(_48) ", " _JSON_FORMAT(_49) ", " _JSON_FORMAT(_50) \ +_JSON_ARGS(_1) _JSON_ARGS(_2) _JSON_ARGS(_3) _JSON_ARGS(_4) _JSON_ARGS(_5) _JSON_ARGS(_6) _JSON_ARGS(_7) _JSON_ARGS(_8) _JSON_ARGS(_9) _JSON_ARGS(_10) _JSON_ARGS(_11) _JSON_ARGS(_12) _JSON_ARGS(_13) _JSON_ARGS(_14) _JSON_ARGS(_15) _JSON_ARGS(_16) _JSON_ARGS(_17) _JSON_ARGS(_18) _JSON_ARGS(_19) _JSON_ARGS(_20) _JSON_ARGS(_21) _JSON_ARGS(_22) _JSON_ARGS(_23) _JSON_ARGS(_24) _JSON_ARGS(_25) _JSON_ARGS(_26) _JSON_ARGS(_27) _JSON_ARGS(_28) _JSON_ARGS(_29) _JSON_ARGS(_30) _JSON_ARGS(_31) _JSON_ARGS(_32) _JSON_ARGS(_33) _JSON_ARGS(_34) _JSON_ARGS(_35) _JSON_ARGS(_36) _JSON_ARGS(_37) _JSON_ARGS(_38) _JSON_ARGS(_39) _JSON_ARGS(_40) _JSON_ARGS(_41) _JSON_ARGS(_42) _JSON_ARGS(_43) _JSON_ARGS(_44) _JSON_ARGS(_45) _JSON_ARGS(_46) _JSON_ARGS(_47) _JSON_ARGS(_48) _JSON_ARGS(_49) _JSON_ARGS(_50) + +// clang-format on diff --git a/utils/include/sidTypes2Json.h b/utils/include/sidTypes2Json.h index 649bbaf3d6..71304b7ac2 100644 --- a/utils/include/sidTypes2Json.h +++ b/utils/include/sidTypes2Json.h @@ -3,55 +3,104 @@ * * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ + +#define eval(x) x +#define concat(a, b) a##b +#define eval_bool(x) x ? 1 : 0 +#define COND_TRUE(cond, code...) concat(COND_true_, cond)(code) +#define COND_FALSE(cond, code...) concat(COND_false_, cond)(code) + +#define COND_true_0(code...) +#define COND_true_1(code...) code + +#define COND_false_0(code...) code +#define COND_false_1(code...) + #include +#include -#define JSON_VAL_sid_msg_desc(name, msg_desc, msg_desc_attr_rx, comma_or_empty) \ - JSON_VAL_DICT(name, comma_or_empty, { \ - JSON_VAL_INT("link_type", msg_desc->link_type, JSON_NEXT); \ - JSON_VAL_INT("type", msg_desc->type, JSON_NEXT); \ - JSON_VAL_STR("type_str", SID_MSG_TYPE_STR(msg_desc->type), JSON_NEXT); \ - JSON_VAL_INT("link_mode", msg_desc->link_mode, JSON_NEXT); \ - JSON_VAL_STR("link_mode_str", (SID_LINK_MODE_STR(msg_desc->link_mode)), \ - JSON_NEXT); \ - JSON_VAL_INT("id", msg_desc->id, JSON_NEXT); \ - JSON_VAL_DICT("msg_desc_attr", JSON_LAST, { \ - if (msg_desc_attr_rx) { \ - JSON_VAL_DICT("rx_attr", JSON_LAST, { \ - JSON_VAL_BOOL("is_msg_ack", \ - msg_desc->msg_desc_attr.rx_attr.is_msg_ack, \ - JSON_NEXT); \ - JSON_VAL_BOOL( \ - "is_msg_duplicate", \ - msg_desc->msg_desc_attr.rx_attr.is_msg_duplicate, \ - JSON_NEXT); \ - JSON_VAL_BOOL( \ - "ack_requested", \ - msg_desc->msg_desc_attr.rx_attr.ack_requested, \ - JSON_NEXT); \ - JSON_VAL_INT("rssi", msg_desc->msg_desc_attr.rx_attr.rssi, \ - JSON_NEXT); \ - JSON_VAL_INT("snr", msg_desc->msg_desc_attr.rx_attr.snr, \ - JSON_LAST); \ - }); \ - } else { \ - JSON_VAL_DICT("tx_attr", JSON_LAST, { \ - JSON_VAL_BOOL("request_ack", \ - msg_desc->msg_desc_attr.tx_attr.request_ack, \ - JSON_NEXT); \ - JSON_VAL_INT("num_retries", \ - msg_desc->msg_desc_attr.tx_attr.num_retries, \ - JSON_NEXT); \ - JSON_VAL_INT( \ - "ttl_in_seconds", \ - msg_desc->msg_desc_attr.tx_attr.ttl_in_seconds, \ - JSON_LAST); \ - }); \ - } \ - }); \ - }) +/** + * @brief prepare printf formater and arguments to print sid_msg_desc object + * + * @arg name: name of the JOSN object to print + * @arg msg_desc pointer to sid_msg_desc object to print + * @arg msg_desc_attr_rx flag to determine variant of union to print + * valid values are `1` or `0`, and those need to be literals + * + * @result result of this function can be passed to printf like function, or other JSON macro + */ +#define JSON_VAL_sid_msg_desc(name, msg_desc, msg_desc_attr_rx) \ + JSON_OBJ(JSON_NAME( \ + name, \ + JSON_OBJ(JSON_LIST_7( \ + JSON_NAME("link_type", JSON_INT(msg_desc->link_type)), \ + JSON_NAME("type", JSON_INT(msg_desc->type)), \ + JSON_NAME("type_str", JSON_STR(SID_MSG_TYPE_STR(msg_desc->type))), \ + JSON_NAME("link_mode", JSON_INT(msg_desc->link_mode)), \ + JSON_NAME("link_mode_str", \ + JSON_STR(SID_LINK_MODE_STR(msg_desc->link_mode))), \ + JSON_NAME("id", JSON_INT(msg_desc->id)), \ + JSON_NAME( \ + "msg_desc_attr", \ + JSON_OBJ(COND_TRUE( \ + msg_desc_attr_rx, \ + JSON_NAME( \ + "rx_attr", \ + JSON_OBJ(JSON_LIST_5( \ + JSON_NAME("is_msg_ack", \ + JSON_BOOL(msg_desc->msg_desc_attr \ + .rx_attr \ + .is_msg_ack)), \ + JSON_NAME( \ + "is_msg_duplicate", \ + JSON_BOOL( \ + msg_desc->msg_desc_attr \ + .rx_attr \ + .is_msg_duplicate)), \ + JSON_NAME( \ + "ack_requested", \ + JSON_BOOL(msg_desc->msg_desc_attr \ + .rx_attr \ + .ack_requested)), \ + JSON_NAME("rssi", \ + JSON_INT(msg_desc->msg_desc_attr \ + .rx_attr.rssi)), \ + JSON_NAME( \ + "snr", \ + JSON_INT(msg_desc->msg_desc_attr \ + .rx_attr.snr)))))) \ + COND_FALSE( \ + msg_desc_attr_rx, \ + JSON_NAME( \ + "tx_attr", \ + JSON_OBJ(JSON_LIST_3( \ + JSON_NAME( \ + "request_ack", \ + JSON_BOOL( \ + msg_desc->msg_desc_attr \ + .tx_attr \ + .request_ack)), \ + JSON_NAME( \ + "num_retries", \ + JSON_INT( \ + msg_desc->msg_desc_attr \ + .tx_attr \ + .num_retries)), \ + JSON_NAME( \ + "ttl_in_seconds", \ + JSON_INT( \ + msg_desc->msg_desc_attr \ + .tx_attr \ + .ttl_in_seconds)))))))))))) -#define JSON_VAL_sid_error_t(name, error, comma_or_empty) \ - JSON_VAL_DICT(name, comma_or_empty, { \ - JSON_VAL_INT("value", error, JSON_NEXT); \ - JSON_VAL_STR("str", SID_ERROR_T_STR(error), JSON_LAST); \ - }); +/** + * @brief prepare printf formater and arguments to print sid_error_t object + * + * @arg name: name of the JSON object to print + * @arg error: object of sid_error_t to print + * + * @result result of this function can be passed to printf like function, or other JSON macro + */ +#define JSON_VAL_sid_error_t(name, error) \ + JSON_NAME(name, JSON_OBJ(JSON_LIST_2(JSON_NAME("value", JSON_INT(error)), \ + JSON_NAME("str", JSON_STR(SID_ERROR_T_STR(error)))))) diff --git a/utils/src/shell.c b/utils/src/shell.c index 5ab30f8bcb..4e253c5351 100644 --- a/utils/src/shell.c +++ b/utils/src/shell.c @@ -351,49 +351,69 @@ static int cmd_report(const struct shell *shell, size_t argc, char **argv) "SID_STATE_SECURE_CHANNEL_READY" }; const char *state = state_repo[CLI_status->state]; - bool in_line = (argc == 2 && strcmp("--oneline", argv[1]) == 0); - - JSON_DICT("SIDEWALK_CLI", in_line, { - JSON_VAL_STR("state", state, JSON_NEXT); - JSON_VAL_INT("registered", - (CLI_status->detail.registration_status == SID_STATUS_REGISTERED), - JSON_NEXT); - JSON_VAL_INT("time_synced", - (CLI_status->detail.time_sync_status == SID_STATUS_TIME_SYNCED), - JSON_NEXT); - JSON_VAL_INT("link_up", (CLI_status->detail.link_status_mask), JSON_NEXT); - JSON_VAL_DICT("link_modes", JSON_NEXT, { - JSON_VAL_INT("ble", - CLI_status->detail.supported_link_modes[SID_LINK_TYPE_1_IDX], - JSON_NEXT); - JSON_VAL_INT("fsk", - CLI_status->detail.supported_link_modes[SID_LINK_TYPE_2_IDX], - JSON_NEXT); - JSON_VAL_INT("lora", - CLI_status->detail.supported_link_modes[SID_LINK_TYPE_3_IDX], - JSON_LAST); - }); - JSON_VAL_INT("tx_successfull", sidewalk_messages.tx_successfull, JSON_NEXT); - JSON_VAL_INT("tx_failed", sidewalk_messages.tx_failed, JSON_NEXT); - JSON_VAL_INT("rx_successfull", sidewalk_messages.rx_successfull, JSON_NEXT); - JSON_VAL_INT("response_id", sidewalk_messages.resp_id, JSON_LAST); - }); + if (argc == 2 && strcmp("--oneline", argv[1]) == 0) { + shell_info(shell, "parameter `--oneline` is deprecated."); + } + + shell_fprintf( + shell, SHELL_NORMAL, + JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "SIDEWALK_CLI", + JSON_OBJ(JSON_LIST_9( + JSON_NAME("state", JSON_STR(state)), + JSON_NAME("registered", + JSON_INT(CLI_status->detail.registration_status == + SID_STATUS_REGISTERED)), + JSON_NAME("time_synced", + JSON_INT(CLI_status->detail.time_sync_status == + SID_STATUS_TIME_SYNCED)), + JSON_NAME("link_up", JSON_INT(CLI_status->detail.link_status_mask)), + JSON_NAME( + "link_modes", + JSON_OBJ(JSON_LIST_3( + JSON_NAME("ble", + JSON_INT(CLI_status->detail.supported_link_modes + [SID_LINK_TYPE_1_IDX])), + JSON_NAME("fsk", + JSON_INT(CLI_status->detail.supported_link_modes + [SID_LINK_TYPE_2_IDX])), + JSON_NAME( + "lora", + JSON_INT(CLI_status->detail.supported_link_modes + [SID_LINK_TYPE_3_IDX]))))), + JSON_NAME("tx_successfull", + JSON_INT(sidewalk_messages.tx_successfull)), + JSON_NAME("tx_failed", JSON_INT(sidewalk_messages.tx_failed)), + JSON_NAME("rx_successfull", + JSON_INT(sidewalk_messages.rx_successfull)), + JSON_NAME("response_id", JSON_INT(sidewalk_messages.resp_id)))))))); + return CMD_RETURN_OK; } void cmd_print_version(const struct shell *shell, size_t argc, char **argv) { - bool in_line = (argc == 2 && strcmp("--oneline", argv[1]) == 0); - - JSON_DICT("COMPONENTS_VERSION", in_line, { - JSON_VAL_STR("sidewalk_fork_point", sidewalk_version_common_commit, JSON_NEXT); - JSON_VAL_STR("build_time", build_time_stamp, JSON_NEXT); - JSON_VAL_DICT("modules", JSON_LAST, { - JSON_VAL_STR_ENUMERATE(sidewalk_version_component_name, - sidewalk_version_component, - sidewalk_version_component_count, JSON_LAST); - }); - }); + shell_fprintf( + shell, SHELL_NORMAL, + JSON_NEW_LINE(JSON_OBJ(JSON_NAME( + "COMPONENTS_VERSION", + JSON_OBJ(JSON_LIST_3( + JSON_NAME("sidewalk_fork_point", + JSON_STR(sidewalk_version_common_commit)), + JSON_NAME("build_time", JSON_STR(build_time_stamp)), + JSON_NAME("modules", + JSON_OBJ(JSON_LIST_3( + JSON_NAME(sidewalk_version_component_name[0], + JSON_STR(sidewalk_version_component[0])), + JSON_NAME(sidewalk_version_component_name[1], + JSON_STR(sidewalk_version_component[1])), + JSON_NAME(sidewalk_version_component_name[2], + JSON_STR(sidewalk_version_component + [2]))))))))))); + + if (argc == 2 && strcmp("--oneline", argv[1]) == 0) { + shell_info(shell, "parameter `--oneline` is deprecated."); + } } static void cmd_fatory_reset_work(struct k_work *item)