diff options
Diffstat (limited to 'data')
| -rw-r--r-- | data/schemas/api_keyboard.jsonschema | 44 | ||||
| -rw-r--r-- | data/schemas/definitions.jsonschema | 107 | ||||
| -rw-r--r-- | data/schemas/keyboard.jsonschema | 253 |
3 files changed, 162 insertions, 242 deletions
diff --git a/data/schemas/api_keyboard.jsonschema b/data/schemas/api_keyboard.jsonschema index d570ee999..d638658a1 100644 --- a/data/schemas/api_keyboard.jsonschema +++ b/data/schemas/api_keyboard.jsonschema | |||
| @@ -1,34 +1,22 @@ | |||
| 1 | { | 1 | { |
| 2 | "$id": "qmk.api.keyboard.v1", | ||
| 2 | "allOf": [ | 3 | "allOf": [ |
| 3 | { "$ref": "qmk.keyboard.v1" }, | 4 | {"$ref": "qmk.keyboard.v1"}, |
| 4 | { | 5 | { |
| 5 | "$id": "qmk.api.keyboard.v1", | 6 | "properties": { |
| 6 | "keymaps": { | 7 | "keymaps": { |
| 7 | "type": "string" | 8 | "type": "object", |
| 8 | }, | 9 | "properties": { |
| 9 | "parse_errors": { | 10 | "url": {"type": "string"} |
| 10 | "type": "array", | 11 | } |
| 11 | "items": { | 12 | |
| 12 | "type": "string" | 13 | }, |
| 13 | } | 14 | "parse_errors": {"$ref": "qmk.definitions.v1#/string_array"}, |
| 14 | }, | 15 | "parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"}, |
| 15 | "parse_warnings": { | 16 | "processor_type": {"type": "string"}, |
| 16 | "type": "array", | 17 | "protocol": {"type": "string"}, |
| 17 | "items": { | 18 | "keyboard_folder": {"type": "string"}, |
| 18 | "type": "string" | 19 | "platform": {"type": "string"} |
| 19 | } | ||
| 20 | }, | ||
| 21 | "processor_type": { | ||
| 22 | "type": "string" | ||
| 23 | }, | ||
| 24 | "protocol": { | ||
| 25 | "type": "string" | ||
| 26 | }, | ||
| 27 | "keyboard_folder": { | ||
| 28 | "type": "string" | ||
| 29 | }, | ||
| 30 | "platform": { | ||
| 31 | "type": "string" | ||
| 32 | } | 20 | } |
| 33 | } | 21 | } |
| 34 | ] | 22 | ] |
diff --git a/data/schemas/definitions.jsonschema b/data/schemas/definitions.jsonschema new file mode 100644 index 000000000..822f23707 --- /dev/null +++ b/data/schemas/definitions.jsonschema | |||
| @@ -0,0 +1,107 @@ | |||
| 1 | { | ||
| 2 | "$schema": "http://json-schema.org/draft-07/schema#", | ||
| 3 | "$id": "qmk.definitions.v1", | ||
| 4 | "title": "Common definitions used across QMK's jsonschemas.", | ||
| 5 | "type": "object", | ||
| 6 | "boolean_array": { | ||
| 7 | "type": "object", | ||
| 8 | "additionalProperties": {"type": "boolean"} | ||
| 9 | }, | ||
| 10 | "filename": { | ||
| 11 | "type": "string", | ||
| 12 | "minLength": 1, | ||
| 13 | "pattern": "^[0-9a-z_]*$" | ||
| 14 | }, | ||
| 15 | "hex_number_2d": { | ||
| 16 | "type": "string", | ||
| 17 | "pattern": "^0x[0-9A-F]{2}$" | ||
| 18 | }, | ||
| 19 | "hex_number_4d": { | ||
| 20 | "type": "string", | ||
| 21 | "pattern": "^0x[0-9A-F]{4}$" | ||
| 22 | }, | ||
| 23 | "text_identifier": { | ||
| 24 | "type": "string", | ||
| 25 | "minLength": 1, | ||
| 26 | "maxLength": 250 | ||
| 27 | }, | ||
| 28 | "layout_macro": { | ||
| 29 | "oneOf": [ | ||
| 30 | { | ||
| 31 | "type": "string", | ||
| 32 | "enum": ["LAYOUT", "LAYOUT_planck_1x2uC"] | ||
| 33 | }, | ||
| 34 | { | ||
| 35 | "type": "string", | ||
| 36 | "pattern": "^LAYOUT_[0-9a-z_]*$" | ||
| 37 | } | ||
| 38 | ] | ||
| 39 | }, | ||
| 40 | "key_unit": { | ||
| 41 | "type": "number", | ||
| 42 | "min": 0.25 | ||
| 43 | }, | ||
| 44 | "mcu_pin_array": { | ||
| 45 | "type": "array", | ||
| 46 | "items": {"$ref": "#/mcu_pin"} | ||
| 47 | }, | ||
| 48 | "mcu_pin": { | ||
| 49 | "oneOf": [ | ||
| 50 | { | ||
| 51 | "type": "string", | ||
| 52 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 53 | }, | ||
| 54 | { | ||
| 55 | "type": "string", | ||
| 56 | "pattern": "^LINE_PIN\\d{1,2}$" | ||
| 57 | }, | ||
| 58 | { | ||
| 59 | "type": "number", | ||
| 60 | "multipleOf": 1 | ||
| 61 | }, | ||
| 62 | { | ||
| 63 | "type": "null" | ||
| 64 | } | ||
| 65 | ] | ||
| 66 | }, | ||
| 67 | "signed_decimal": { | ||
| 68 | "type": "number" | ||
| 69 | }, | ||
| 70 | "signed_int": { | ||
| 71 | "type": "number", | ||
| 72 | "multipleOf": 1 | ||
| 73 | } | ||
| 74 | "signed_int_8": { | ||
| 75 | "type": "number", | ||
| 76 | "min": -127, | ||
| 77 | "max": 127, | ||
| 78 | "multipleOf": 1 | ||
| 79 | } | ||
| 80 | "string_array": { | ||
| 81 | "type": "array", | ||
| 82 | "items": { | ||
| 83 | "type": "string" | ||
| 84 | } | ||
| 85 | }, | ||
| 86 | "string_object": { | ||
| 87 | "type": "object", | ||
| 88 | "additionalProperties": { | ||
| 89 | "type": "string" | ||
| 90 | } | ||
| 91 | }, | ||
| 92 | "unsigned_decimal": { | ||
| 93 | "type": "number", | ||
| 94 | "min": 0 | ||
| 95 | }, | ||
| 96 | "unsigned_int": { | ||
| 97 | "type": "number", | ||
| 98 | "min": 0, | ||
| 99 | "multipleOf": 1 | ||
| 100 | } | ||
| 101 | "unsigned_int_8": { | ||
| 102 | "type": "number", | ||
| 103 | "min": 0, | ||
| 104 | "max": 255, | ||
| 105 | "multipleOf": 1 | ||
| 106 | } | ||
| 107 | } | ||
diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index c335f49d5..764f66524 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema | |||
| @@ -1,31 +1,19 @@ | |||
| 1 | { | 1 | { |
| 2 | "$schema": "http://json-schema.org/schema#", | 2 | "$schema": "http://json-schema.org/draft-07/schema#", |
| 3 | "$id": "qmk.keyboard.v1", | 3 | "$id": "qmk.keyboard.v1", |
| 4 | "title": "Keyboard Information", | 4 | "title": "Keyboard Information", |
| 5 | "type": "object", | 5 | "type": "object", |
| 6 | "properties": { | 6 | "properties": { |
| 7 | "keyboard_name": { | 7 | "keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, |
| 8 | "type": "string", | 8 | "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, |
| 9 | "minLength": 2, | 9 | "manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"}, |
| 10 | "maxLength": 250 | ||
| 11 | }, | ||
| 12 | "maintainer": { | ||
| 13 | "type": "string", | ||
| 14 | "minLength": 2, | ||
| 15 | "maxLength": 250 | ||
| 16 | }, | ||
| 17 | "manufacturer": { | ||
| 18 | "type": "string", | ||
| 19 | "minLength": 2, | ||
| 20 | "maxLength": 250 | ||
| 21 | }, | ||
| 22 | "url": { | 10 | "url": { |
| 23 | "type": "string", | 11 | "type": "string", |
| 24 | "format": "uri" | 12 | "format": "uri" |
| 25 | }, | 13 | }, |
| 26 | "processor": { | 14 | "processor": { |
| 27 | "type": "string", | 15 | "type": "string", |
| 28 | "enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66F18", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L433", "STM32L443", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"] | 16 | "enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66F18", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L433", "STM32L443", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"] |
| 29 | }, | 17 | }, |
| 30 | "board": { | 18 | "board": { |
| 31 | "type": "string", | 19 | "type": "string", |
| @@ -34,68 +22,29 @@ | |||
| 34 | }, | 22 | }, |
| 35 | "bootloader": { | 23 | "bootloader": { |
| 36 | "type": "string", | 24 | "type": "string", |
| 37 | "enum": ["atmel-dfu", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "stm32-dfu", "stm32duino", "unknown", "USBasp", "tinyuf2"] | 25 | "enum": ["atmel-dfu", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "unknown", "USBasp", "tinyuf2"] |
| 38 | }, | 26 | }, |
| 39 | "diode_direction": { | 27 | "diode_direction": { |
| 40 | "type": "string", | 28 | "type": "string", |
| 41 | "enum": ["COL2ROW", "ROW2COL"] | 29 | "enum": ["COL2ROW", "ROW2COL"] |
| 42 | }, | 30 | }, |
| 43 | "debounce": { | 31 | "debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"}, |
| 44 | "type": "number", | ||
| 45 | "min": 0, | ||
| 46 | "multipleOf": 1 | ||
| 47 | }, | ||
| 48 | "height": { | ||
| 49 | "type": "number", | ||
| 50 | "min": 0.25 | ||
| 51 | }, | ||
| 52 | "width": { | ||
| 53 | "type": "number", | ||
| 54 | "min": 0.25 | ||
| 55 | }, | ||
| 56 | "community_layouts": { | 32 | "community_layouts": { |
| 57 | "type": "array", | 33 | "type": "array", |
| 58 | "items": { | 34 | "items": {"$ref": "qmk.definitions.v1#/filename"} |
| 59 | "type": "string", | ||
| 60 | "minLength": 2, | ||
| 61 | "pattern": "^[0-9a-z_]*$" | ||
| 62 | } | ||
| 63 | }, | ||
| 64 | "features": { | ||
| 65 | "type": "object", | ||
| 66 | "additionalProperties": {"type": "boolean"} | ||
| 67 | }, | 35 | }, |
| 36 | "features": {"$ref": "qmk.definitions.v1#/boolean_array"}, | ||
| 68 | "indicators": { | 37 | "indicators": { |
| 69 | "type": "object", | 38 | "type": "object", |
| 70 | "properties": { | 39 | "properties": { |
| 71 | "caps_lock": { | 40 | "caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, |
| 72 | "type": "string", | 41 | "num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, |
| 73 | "pattern": "^[A-K]\\d{1,2}$" | 42 | "scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"} |
| 74 | }, | ||
| 75 | "num_lock": { | ||
| 76 | "type": "string", | ||
| 77 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 78 | }, | ||
| 79 | "scroll_lock": { | ||
| 80 | "type": "string", | ||
| 81 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 82 | } | ||
| 83 | } | 43 | } |
| 84 | }, | 44 | }, |
| 85 | "layout_aliases": { | 45 | "layout_aliases": { |
| 86 | "type": "object", | 46 | "type": "object", |
| 87 | "additionalProperties": { | 47 | "additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"} |
| 88 | "oneOf": [ | ||
| 89 | { | ||
| 90 | "type": "string", | ||
| 91 | "enum": ["LAYOUT", "LAYOUT_planck_1x2uC"] | ||
| 92 | }, | ||
| 93 | { | ||
| 94 | "type": "string", | ||
| 95 | "pattern": "^LAYOUT_[0-9a-z_]*$" | ||
| 96 | } | ||
| 97 | ] | ||
| 98 | } | ||
| 99 | }, | 48 | }, |
| 100 | "layouts": { | 49 | "layouts": { |
| 101 | "type": "object", | 50 | "type": "object", |
| @@ -109,11 +58,7 @@ | |||
| 109 | "c_macro": { | 58 | "c_macro": { |
| 110 | "type": "boolean" | 59 | "type": "boolean" |
| 111 | }, | 60 | }, |
| 112 | "key_count": { | 61 | "key_count": {"$ref": "qmk.definitions.v1#/key_unit"}, |
| 113 | "type": "number", | ||
| 114 | "min": 0, | ||
| 115 | "multipleOf": 1 | ||
| 116 | }, | ||
| 117 | "layout": { | 62 | "layout": { |
| 118 | "type": "array", | 63 | "type": "array", |
| 119 | "items": { | 64 | "items": { |
| @@ -131,34 +76,14 @@ | |||
| 131 | "multipleOf": 1 | 76 | "multipleOf": 1 |
| 132 | } | 77 | } |
| 133 | }, | 78 | }, |
| 134 | "h": { | 79 | "key_count": {"$ref": "qmk.definitions.v1#/key_unit"}, |
| 135 | "type": "number", | 80 | "r": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, |
| 136 | "min": 0.25 | 81 | "rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, |
| 137 | }, | 82 | "ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, |
| 138 | "r": { | 83 | "h": {"$ref": "qmk.definitions.v1#/key_unit"}, |
| 139 | "type": "number", | 84 | "w": {"$ref": "qmk.definitions.v1#/key_unit"}, |
| 140 | "min": 0 | 85 | "x": {"$ref": "qmk.definitions.v1#/key_unit"}, |
| 141 | }, | 86 | "y": {"$ref": "qmk.definitions.v1#/key_unit"} |
| 142 | "rx": { | ||
| 143 | "type": "number", | ||
| 144 | "min": 0 | ||
| 145 | }, | ||
| 146 | "ry": { | ||
| 147 | "type": "number", | ||
| 148 | "min": 0 | ||
| 149 | }, | ||
| 150 | "w": { | ||
| 151 | "type": "number", | ||
| 152 | "min": 0.25 | ||
| 153 | }, | ||
| 154 | "x": { | ||
| 155 | "type": "number", | ||
| 156 | "min": 0 | ||
| 157 | }, | ||
| 158 | "y": { | ||
| 159 | "type": "number", | ||
| 160 | "min": 0 | ||
| 161 | } | ||
| 162 | } | 87 | } |
| 163 | } | 88 | } |
| 164 | } | 89 | } |
| @@ -171,61 +96,10 @@ | |||
| 171 | "properties": { | 96 | "properties": { |
| 172 | "direct": { | 97 | "direct": { |
| 173 | "type": "array", | 98 | "type": "array", |
| 174 | "items": { | 99 | "items": {$ref": "qmk.definitions.v1#/mcu_pin_array"} |
| 175 | "type": "array", | ||
| 176 | "items": { | ||
| 177 | "oneOf": [ | ||
| 178 | { | ||
| 179 | "type": "string", | ||
| 180 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 181 | }, | ||
| 182 | { | ||
| 183 | "type": "number", | ||
| 184 | "multipleOf": 1 | ||
| 185 | }, | ||
| 186 | { | ||
| 187 | "type": "null" | ||
| 188 | } | ||
| 189 | ] | ||
| 190 | } | ||
| 191 | } | ||
| 192 | }, | ||
| 193 | "cols": { | ||
| 194 | "type": "array", | ||
| 195 | "items": { | ||
| 196 | "oneOf": [ | ||
| 197 | { | ||
| 198 | "type": "string", | ||
| 199 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 200 | }, | ||
| 201 | { | ||
| 202 | "type": "number", | ||
| 203 | "multipleOf": 1 | ||
| 204 | }, | ||
| 205 | { | ||
| 206 | "type": "null" | ||
| 207 | } | ||
| 208 | ] | ||
| 209 | } | ||
| 210 | }, | 100 | }, |
| 211 | "rows": { | 101 | "cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, |
| 212 | "type": "array", | 102 | "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} |
| 213 | "items": { | ||
| 214 | "oneOf": [ | ||
| 215 | { | ||
| 216 | "type": "string", | ||
| 217 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 218 | }, | ||
| 219 | { | ||
| 220 | "type": "number", | ||
| 221 | "multipleOf": 1 | ||
| 222 | }, | ||
| 223 | { | ||
| 224 | "type": "null" | ||
| 225 | } | ||
| 226 | ] | ||
| 227 | } | ||
| 228 | } | ||
| 229 | } | 103 | } |
| 230 | }, | 104 | }, |
| 231 | "rgblight": { | 105 | "rgblight": { |
| @@ -238,47 +112,19 @@ | |||
| 238 | "type": "boolean" | 112 | "type": "boolean" |
| 239 | } | 113 | } |
| 240 | }, | 114 | }, |
| 241 | "brightness_steps": { | 115 | "brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, |
| 242 | "type": "number", | 116 | "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, |
| 243 | "min": 0, | 117 | "led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, |
| 244 | "multipleOf": 1 | 118 | "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, |
| 245 | }, | 119 | "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, |
| 246 | "hue_steps": { | 120 | "saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, |
| 247 | "type": "number", | ||
| 248 | "min": 0, | ||
| 249 | "multipleOf": 1 | ||
| 250 | }, | ||
| 251 | "led_count": { | ||
| 252 | "type": "number", | ||
| 253 | "min": 0, | ||
| 254 | "multipleOf": 1 | ||
| 255 | }, | ||
| 256 | "max_brightness": { | ||
| 257 | "type": "number", | ||
| 258 | "min": 0, | ||
| 259 | "max": 255, | ||
| 260 | "multipleOf": 1 | ||
| 261 | }, | ||
| 262 | "pin": { | ||
| 263 | "type": "string", | ||
| 264 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 265 | }, | ||
| 266 | "saturation_steps": { | ||
| 267 | "type": "number", | ||
| 268 | "min": 0, | ||
| 269 | "multipleOf": 1 | ||
| 270 | }, | ||
| 271 | "sleep": {"type": "boolean"}, | 121 | "sleep": {"type": "boolean"}, |
| 272 | "split": {"type": "boolean"}, | 122 | "split": {"type": "boolean"}, |
| 273 | "split_count": { | 123 | "split_count": { |
| 274 | "type": "array", | 124 | "type": "array", |
| 275 | "minLength": 2, | 125 | "minLength": 2, |
| 276 | "maxLength": 2, | 126 | "maxLength": 2, |
| 277 | "items": { | 127 | "items": {"$ref": "qmk.definitions.v1#/unsigned_int"} |
| 278 | "type": "number", | ||
| 279 | "min": 0, | ||
| 280 | "multipleOf": 1 | ||
| 281 | } | ||
| 282 | } | 128 | } |
| 283 | } | 129 | } |
| 284 | }, | 130 | }, |
| @@ -286,40 +132,19 @@ | |||
| 286 | "type": "object", | 132 | "type": "object", |
| 287 | "additionalProperties": false, | 133 | "additionalProperties": false, |
| 288 | "properties": { | 134 | "properties": { |
| 289 | "device_ver": { | 135 | "device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, |
| 290 | "type": "string", | 136 | "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, |
| 291 | "pattern": "^[0-9A-F]x[0-9A-F][0-9A-F][0-9A-F][0-9A-F]" | 137 | "vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"} |
| 292 | }, | ||
| 293 | "pid": { | ||
| 294 | "type": "string", | ||
| 295 | "pattern": "^[0-9A-F]x[0-9A-F][0-9A-F][0-9A-F][0-9A-F]" | ||
| 296 | }, | ||
| 297 | "vid": { | ||
| 298 | "type": "string", | ||
| 299 | "pattern": "^[0-9A-F]x[0-9A-F][0-9A-F][0-9A-F][0-9A-F]" | ||
| 300 | } | ||
| 301 | } | 138 | } |
| 302 | }, | 139 | }, |
| 303 | "qmk_lufa_bootloader": { | 140 | "qmk_lufa_bootloader": { |
| 304 | "type": "object", | 141 | "type": "object", |
| 305 | "additionalProperties": false, | 142 | "additionalProperties": false, |
| 306 | "properties": { | 143 | "properties": { |
| 307 | "esc_output": { | 144 | "esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"}, |
| 308 | "type": "string", | 145 | "esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"}, |
| 309 | "pattern": "^[A-K]\\d{1,2}$" | 146 | "led": {"$ref": "qmk.definitions.v1#/mcu_pin"}, |
| 310 | }, | 147 | "speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"} |
| 311 | "esc_input": { | ||
| 312 | "type": "string", | ||
| 313 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 314 | }, | ||
| 315 | "led": { | ||
| 316 | "type": "string", | ||
| 317 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 318 | }, | ||
| 319 | "speaker": { | ||
| 320 | "type": "string", | ||
| 321 | "pattern": "^[A-K]\\d{1,2}$" | ||
| 322 | } | ||
| 323 | } | 148 | } |
| 324 | } | 149 | } |
| 325 | } | 150 | } |
