summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--build_keyboard.mk33
-rw-r--r--docs/reference_info_json.md157
-rw-r--r--keyboards/clueboard/17/17.h33
-rw-r--r--keyboards/clueboard/17/config.h69
-rw-r--r--keyboards/clueboard/17/info.json79
-rw-r--r--keyboards/clueboard/17/keymaps/default/readme.md1
-rw-r--r--keyboards/clueboard/17/rules.mk10
-rw-r--r--keyboards/clueboard/2x1800/2018/2018.h74
-rw-r--r--keyboards/clueboard/2x1800/2018/config.h172
-rw-r--r--keyboards/clueboard/2x1800/2018/info.json444
-rw-r--r--keyboards/clueboard/2x1800/2018/rules.mk12
-rw-r--r--keyboards/clueboard/2x1800/2019/2019.h221
-rw-r--r--keyboards/clueboard/2x1800/2019/config.h168
-rw-r--r--keyboards/clueboard/2x1800/2019/info.json2368
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json2
-rw-r--r--keyboards/clueboard/2x1800/2019/rules.mk13
-rw-r--r--keyboards/clueboard/2x1800/info.json5
-rw-r--r--keyboards/clueboard/60/60.h87
-rw-r--r--keyboards/clueboard/60/config.h98
-rw-r--r--keyboards/clueboard/60/info.json387
-rw-r--r--keyboards/clueboard/60/rules.mk13
-rw-r--r--keyboards/clueboard/66/info.json34
-rw-r--r--keyboards/clueboard/66/rev1/config.h59
-rw-r--r--keyboards/clueboard/66/rev1/info.json273
-rw-r--r--keyboards/clueboard/66/rev1/readme.md15
-rw-r--r--keyboards/clueboard/66/rev1/rev1.h72
-rw-r--r--keyboards/clueboard/66/rev1/rules.mk18
-rw-r--r--keyboards/clueboard/66/rev2/config.h56
-rw-r--r--keyboards/clueboard/66/rev2/info.json273
-rw-r--r--keyboards/clueboard/66/rev2/readme.md15
-rw-r--r--keyboards/clueboard/66/rev2/rev2.h90
-rw-r--r--keyboards/clueboard/66/rev2/rules.mk14
-rw-r--r--keyboards/clueboard/66/rev3/config.h58
-rw-r--r--keyboards/clueboard/66/rev3/info.json273
-rw-r--r--keyboards/clueboard/66/rev3/readme.md15
-rw-r--r--keyboards/clueboard/66/rev3/rev3.h90
-rw-r--r--keyboards/clueboard/66/rev3/rules.mk14
-rw-r--r--keyboards/clueboard/66/rev4/config.h54
-rw-r--r--keyboards/clueboard/66/rev4/info.json270
-rw-r--r--keyboards/clueboard/66/rev4/keymaps/keymap.c13
-rw-r--r--keyboards/clueboard/66/rev4/keymaps/mine/keymap.c13
-rw-r--r--keyboards/clueboard/66/rev4/mine/keymap.c13
-rw-r--r--keyboards/clueboard/66/rev4/rev4.h91
-rw-r--r--keyboards/clueboard/66/rev4/rules.mk19
-rw-r--r--keyboards/clueboard/66_hotswap/config.h23
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/config.h25
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/gen1.h71
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/info.json337
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/readme.md16
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/rules.mk20
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/config.h30
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/info.json437
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/prototype.h83
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/readme.md16
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/rules.mk13
-rw-r--r--keyboards/clueboard/california/california.h18
-rw-r--r--keyboards/clueboard/california/config.h21
-rw-r--r--keyboards/clueboard/california/info.json24
-rw-r--r--keyboards/clueboard/california/keymaps/default/readme.md1
-rw-r--r--keyboards/clueboard/card/card.h16
-rw-r--r--keyboards/clueboard/card/config.h129
-rw-r--r--keyboards/clueboard/card/info.json62
-rw-r--r--keyboards/clueboard/card/rules.mk14
-rw-r--r--keyboards/clueboard/info.json6
-rw-r--r--lib/python/qmk/cli/c2json.py3
-rw-r--r--lib/python/qmk/cli/chibios/confmigrate.py8
-rw-r--r--lib/python/qmk/cli/generate/__init__.py4
-rwxr-xr-xlib/python/qmk/cli/generate/api.py14
-rwxr-xr-xlib/python/qmk/cli/generate/config_h.py277
-rwxr-xr-xlib/python/qmk/cli/generate/info_json.py49
-rwxr-xr-xlib/python/qmk/cli/generate/layouts.py93
-rwxr-xr-xlib/python/qmk/cli/generate/rules_mk.py59
-rwxr-xr-xlib/python/qmk/cli/info.py7
-rwxr-xr-xlib/python/qmk/cli/kle2json.py51
-rw-r--r--lib/python/qmk/constants.py11
-rw-r--r--lib/python/qmk/info.py355
-rwxr-xr-xlib/python/qmk/info_json_encoder.py96
-rw-r--r--message.mk3
79 files changed, 4787 insertions, 3897 deletions
diff --git a/Makefile b/Makefile
index e4f7b5b516..91ab9e4e8e 100644
--- a/Makefile
+++ b/Makefile
@@ -501,8 +501,8 @@ endef
%:
# Check if we have the CMP tool installed
cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
- # Ensure that bin/qmk works. This will be a failing check after the next develop merge
- if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
+ # Ensure that bin/qmk works.
+ if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; exit 1; fi
# Check if the submodules are dirty, and display a warning if they are
ifndef SKIP_GIT
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
diff --git a/build_keyboard.mk b/build_keyboard.mk
index 8d018f2e3c..816681bd0a 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -90,13 +90,16 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
include $(KEYBOARD_PATH_1)/rules.mk
endif
-
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
+# Pull in rules from info.json
+INFO_RULES_MK = $(shell bin/qmk generate-rules-mk --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
+include $(INFO_RULES_MK)
+
# Check for keymap.json first, so we can regenerate keymap.c
include build_json.mk
@@ -290,6 +293,32 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
CONFIG_H += $(KEYMAP_PATH)/config.h
endif
+# Pull in stuff from info.json
+INFO_JSON_FILES :=
+ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
+ INFO_JSON_FILES += $(KEYBOARD_PATH_1)/info.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
+ INFO_JSON_FILES += $(KEYBOARD_PATH_2)/info.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
+ INFO_JSON_FILES += $(KEYBOARD_PATH_3)/info.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
+ INFO_JSON_FILES += $(KEYBOARD_PATH_4)/info.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
+ INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json
+endif
+
+CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
+
+$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
+ bin/qmk generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
+
+$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
+ bin/qmk generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
+
# project specific files
SRC += $(KEYBOARD_SRC) \
$(KEYMAP_C) \
@@ -364,7 +393,7 @@ all:
echo "skipped" >&2
endif
-build: elf cpfirmware
+build: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h elf cpfirmware
check-size: build
objs-size: build
diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md
index 3ca62c719e..47506bc92d 100644
--- a/docs/reference_info_json.md
+++ b/docs/reference_info_json.md
@@ -19,8 +19,20 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
* Width of the board in Key Units
* `height`
* Height of the board in Key Units
+* `debounce`
+ * How many milliseconds (ms) to wait for debounce to happen. (Default: 5)
+* `diode_direction`
+ * The direction diodes face. See [`DIRECT_PINS` in the hardware configuration](https://docs.qmk.fm/#/config_options?id=hardware-options) for more details.
+* `layout_aliases`
+ * A dictionary containing layout aliases. The key is the alias and the value is a layout in `layouts` it maps to.
* `layouts`
- * Physical Layout representations. See the next section for more detail.
+ * Physical Layout representations. See the [Layout Format](#layout_format) section for more detail.
+* `matrix_pins`
+ * Configure the pins corresponding to columns and rows, or direct pins. See [Matrix Pins](#matrix_pins) for more detail.
+* `rgblight`
+ * Configure the [RGB Lighting feature](feature_rgblight.md). See the [RGB Lighting](#rgb_lighting) section for more detail.
+* `usb`
+ * Configure USB VID, PID, and other parameters. See [USB](#USB) for more detail.
### Layout Format
@@ -49,25 +61,128 @@ All key positions and rotations are specified in relation to the top-left corner
* The width of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `h`
* The height of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
-* `r`
- * How many degrees clockwise to rotate the key.
-* `rx`
- * The absolute position of the point to rotate the key around in the horizontal axis. Default: `x`
-* `ry`
- * The absolute position of the point to rotate the key around in the vertical axis. Default: `y`
-* `ks`
- * Key Shape: define a polygon by providing a list of points, in Key Units.
- * **Important**: These are relative to the top-left of the key, not absolute.
- * Example ISO Enter: `[ [0,0], [1.5,0], [1.5,2], [0.25,2], [0.25,1], [0,1], [0,0] ]`
* `label`
* What to name this position in the matrix.
- * This should usually be the same name as what is silkscreened on the PCB at this location.
-
-## How is the Metadata Exposed?
-
-This metadata is primarily used in two ways:
-
-* To allow web-based configurators to dynamically generate UI
-* To support the new `make keyboard:keymap:qmk` target, which bundles this metadata up with the firmware to allow QMK Toolbox to be smarter.
-
-Configurator authors can see the [QMK Compiler](https://docs.api.qmk.fm/using-the-api) docs for more information on using the JSON API.
+ * This should usually correspond to the keycode for the first layer of the default keymap.
+* `matrix`
+ * A 2 item list describing the row and column location for this key.
+
+### Matrix Pins
+
+Currently QMK supports connecting switches either directly to GPIO pins or via a switch matrix. At this time you can not combine these, they are mutually exclusive.
+
+#### Switch Matrix
+
+Most keyboards use a switch matrix to connect keyswitches to the MCU. You can define your pin columns and rows to configure your switch matrix. When defining switch matrices you should also define your `diode_direction`.
+
+Example:
+
+```json
+{
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["F4", "E6", "B1", "D2"],
+ "rows": ["B0", "D3", "D5", "D4", "D6"]
+ }
+}
+```
+
+#### Direct Pins
+
+Direct pins are when you connect one side of the switch to GND and the other side to a GPIO pin on your MCU. No diode is required, but there is a 1:1 mapping between switches and pins.
+
+When specifying direct pins you need to arrange them in nested arrays. The outer array consists of rows, while the inner array is a text string corresponding to a pin. You can use `null` to indicate an empty spot in the matrix.
+
+Example:
+
+```json
+{
+ "matrix_pins": {
+ "direct": [
+ ["A10", "A9"],
+ ["A0", "B8"],
+ [null, "B11"],
+ ["B9", "A8"],
+ ["A7", "B1"],
+ [null, "B2"]
+ ]
+}
+```
+
+### RGB Lighting
+
+This section controls the legacy WS2812 support in QMK. This should not be confused with the RGB Matrix feature, which can be used to control both WS2812 and ISSI RGB LEDs.
+
+The following items can be set. Not every value is required.
+
+* `led_count`
+ * The number of LEDs in your strip
+* `pin`
+ * The GPIO pin that your LED strip is connected to
+* `animations`
+ * A dictionary that lists enabled and disabled animations. See [RGB Light Animations](#rgb_light_animations) below.
+* `sleep`
+ * Set to `true` to enable lighting during host sleep
+* `split`
+ * Set to `true` to enable synchronization functionality between split halves
+* `split_count`
+ * For split keyboards, the number of LEDs on each side
+* `max_brightness`
+ * (0-255) What the maxmimum brightness (value) level is
+* `hue_steps`
+ * How many steps of adjustment to have for hue
+* `saturation_steps`
+ * How many steps of adjustment to have for saturation
+* `brightness_steps`
+ * How many steps of adjustment to have for brightness (value)
+
+Example:
+
+```json
+{
+ "rgblight": {
+ "led_count": 4,
+ "pin": "F6",
+ "hue_steps": 10,
+ "saturation_steps": 17,
+ "brightness_steps": 17,
+ "animations": {
+ "all": true
+ }
+ }
+}
+```
+
+#### RGB Light Animations
+
+The following animations can be enabled:
+
+| Key | Description |
+|-----|-------------|
+| `all` | Enable all additional animation modes. |
+| `alternating` | Enable alternating animation mode. |
+| `breathing` | Enable breathing animation mode. |
+| `christmas` | Enable christmas animation mode. |
+| `knight` | Enable knight animation mode. |
+| `rainbow_mood` | Enable rainbow mood animation mode. |
+| `rainbow_swirl` | Enable rainbow swirl animation mode. |
+| `rgb_test` | Enable RGB test animation mode. |
+| `snake` | Enable snake animation mode. |
+| `static_gradient` | Enable static gradient mode. |
+| `twinkle` | Enable twinkle animation mode. |
+
+### USB
+
+Every USB keyboard needs to have its USB parmaters defined. At a minimum you need to set vid, pid, and device version.
+
+Example:
+
+```json
+{
+ "usb": {
+ "vid": "0xC1ED",
+ "pid": "0x23B0",
+ "device_ver": "0x0001"
+ }
+}
+```
diff --git a/keyboards/clueboard/17/17.h b/keyboards/clueboard/17/17.h
index af3be4f5a9..ebf2083862 100644
--- a/keyboards/clueboard/17/17.h
+++ b/keyboards/clueboard/17/17.h
@@ -3,37 +3,4 @@
#include "quantum.h"
-
-/* Cluepad matrix layout
- * .-------------------.
- * |NLCK| /| *| -|
- * |-------------------|
- * | 7| 8| 9| |
- * |--------------| |
- * | 4| 5| 6| +|
- * |-------------------|
- * | 1| 2| 3| |
- * |--------------| |
- * | 0| .| Ent|
- * '-------------------'
- */
-// The first section contains all of the arguments
-// The second converts the arguments into a two-dimensional array
-#define LAYOUT_numpad_5x4( \
- k00, k01, k02, k03, \
- k10, k11, k12, \
- k20, k21, k22, k13, \
- k30, k31, k32, \
- k40, k42, k33 \
-) { \
- { k00, k01, k02, k03 }, \
- { k10, k11, k12, k13 }, \
- { k20, k21, k22, KC_NO }, \
- { k30, k31, k32, k33 }, \
- { k40, KC_NO, k42, KC_NO } \
-}
-
-#define LAYOUT LAYOUT_numpad_5x4
-#define KEYMAP LAYOUT_numpad_5x4
-
#endif
diff --git a/keyboards/clueboard/17/config.h b/keyboards/clueboard/17/config.h
index b7e28cbb9f..877f478690 100644
--- a/keyboards/clueboard/17/config.h
+++ b/keyboards/clueboard/17/config.h
@@ -20,76 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0xC1ED
-#define PRODUCT_ID 0x2312
-#define DEVICE_VER 0x0001
-#define MANUFACTURER Clueboard
-#define PRODUCT Cluepad with RGB Underlighting
-#define DESCRIPTION QMK keyboard firmware for Cluepad
-
-/* key matrix size */
-#define MATRIX_ROWS 5
-#define MATRIX_COLS 4
-
-// ROWS: Top to bottom, COLS: Left to right
-/* Row pin configuration
-* row: 0 1 2 3 4
-* pin:
-*/
-#define MATRIX_ROW_PINS { B0, D3, D5, D4, D6 }
-/* Column pin configuration
- * col: 0 1 2 3
- * pin: F4 E6 B1 D2
- */
-#define MATRIX_COL_PINS { F4, E6, B1, D2 }
-#define UNUSED_PINS
-
-/* COL2ROW or ROW2COL */
-#define DIODE_DIRECTION COL2ROW
-
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCE 5
-
/* Number of backlighting levels */
#define BACKLIGHT_LEVELS 3
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
-#define LOCKING_SUPPORT_ENABLE
-/* Locking resynchronize hack */
-#define LOCKING_RESYNC_ENABLE
-
-/* Underlight configuration
- */
-#define RGB_DI_PIN F6
-#define RGBLIGHT_ANIMATIONS
-#define RGBLED_NUM 4 // Number of LEDs
-#define RGBLIGHT_HUE_STEP 10
-#define RGBLIGHT_SAT_STEP 17
-#define RGBLIGHT_VAL_STEP 17
-
-/*
- * Feature disable options
- * These options are also useful to firmware size reduction.
- */
-
-/* disable debug print */
-//#define NO_DEBUG
-
-/* Debug forcibly enabled */
-#define ALWAYS_DEBUG
-
-/* disable print */
-//#define NO_PRINT
-
-/* disable action features */
-//#define NO_ACTION_LAYER
-//#define NO_ACTION_TAPPING
-//#define NO_ACTION_ONESHOT
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
-
#endif
diff --git a/keyboards/clueboard/17/info.json b/keyboards/clueboard/17/info.json
index 12338ae1d3..46510c48c0 100644
--- a/keyboards/clueboard/17/info.json
+++ b/keyboards/clueboard/17/info.json
@@ -1,30 +1,67 @@
{
+ "manufacturer": "Clueboard",
"keyboard_name": "Clueboard 17% (Cluepad)",
- "keyboard_folder": "clueboard/17",
- "url": "",
- "maintainer": "qmk",
- "width": 4,
+ "maintainer": "skullydazed",
"height": 5,
+ "width": 4,
+ "diode_direction": "COL2ROW",
+ "features": {
+ "backlight": true,
+ "bootmagic": false,
+ "command": false,
+ "console": true,
+ "extrakey": true,
+ "midi": false,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": true,
+ "unicode": false
+ },
+ "matrix_pins": {
+ "cols": ["F4", "E6", "B1", "D2"],
+ "rows": ["B0", "D3", "D5", "D4", "D6"]
+ },
+ "rgblight": {
+ "animations": {
+ "all": true
+ },
+ "brightness_steps": "17",
+ "hue_steps": "10",
+ "led_count": "4",
+ "pin": "F6",
+ "saturation_steps": "17"
+ },
+ "url": "",
+ "usb": {
+ "device_ver": "0x0001",
+ "pid": "0x2312",
+ "vid": "0xC1ED"
+ },
+ "layout_aliases": {
+ "KEYMAP": "LAYOUT_numpad_5x4",
+ "LAYOUT": "LAYOUT_numpad_5x4"
+ },
"layouts": {
"LAYOUT_numpad_5x4": {
+ "key_count": 17,
"layout": [
- {"label":"Num Lock", "x":0, "y":0},
- {"label":"/", "x":1, "y":0},
- {"label":"*", "x":2, "y":0},
- {"label":"-", "x":3, "y":0},
- {"label":"7", "x":0, "y":1},
- {"label":"8", "x":1, "y":1},
- {"label":"9", "x":2, "y":1},
- {"label":"4", "x":0, "y":2},
- {"label":"5", "x":1, "y":2},
- {"label":"6", "x":2, "y":2},
- {"label":"+", "x":3, "y":1, "h":2},
- {"label":"1", "x":0, "y":3},
- {"label":"2", "x":1, "y":3},
- {"label":"3", "x":2, "y":3},
- {"label":"0", "x":0, "y":4, "w":2},
- {"label":".", "x":2, "y":4},
- {"label":"Enter", "x":3, "y":3, "h":2}
+ { "label": "Num Lock", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
+ { "label": "/", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
+ { "label": "*", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
+ { "label": "-", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
+ { "label": "7", "matrix": [1, 0], "w": 1, "x": 0, "y": 1 },
+ { "label": "8", "matrix": [1, 1], "w": 1, "x": 1, "y": 1 },
+ { "label": "9", "matrix": [1, 2], "w": 1, "x": 2, "y": 1 },
+ { "label": "4", "matrix": [2, 0], "w": 1, "x": 0, "y": 2 },
+ { "label": "5", "matrix": [2, 1], "w": 1, "x": 1, "y": 2 },
+ { "label": "6", "matrix": [2, 2], "w": 1, "x": 2, "y": 2 },
+ { "h": 2, "label": "+", "matrix": [1, 3], "w": 1, "x": 3, "y": 1 },
+ { "label": "1", "matrix": [3, 0], "w": 1, "x": 0, "y": 3 },
+ { "label": "2", "matrix": [3, 1], "w": 1, "x": 1, "y": 3 },
+ { "label": "3", "matrix": [3, 2], "w": 1, "x": 2, "y": 3 },
+ { "